如何在android游戏中从y轴依次生成位图

How to generate bitmap one after another from y axis in android game

我正在开发一个简单的小游戏,其中的障碍从顶部出来,并且有一个静态球只能在 x-axis.When 上从顶部出来的障碍用户必须移动球避免碰撞。

我在 time.but 上放置了 3 个移动障碍,我的问题是它们一起出现,即所有三个障碍都有相同的 y 轴 values.I 希望它一个接一个地出现一些特定的距离。

我怎样才能做到这一点。 这是我的游戏面板 Class:

public class GamePanel extends SurfaceView implements Runnable {

    private Thread thread = null;
    private Ball ball;
    private SurfaceHolder surfaceHolder;
    private Paint paint;
    private Canvas canvas;

    volatile boolean playing = true;

    private int hurdleCount = 3;
    private Hurdles[] hurdles;

    private int screenX, screenY;
    private Rect ball_detectCollision;

    public GamePanel(Context context, final int screenX, final int screenY) {
        super(context);

        ball = new Ball(context, screenX, screenY);
        surfaceHolder = getHolder();

        this.screenX = screenX;
        this.screenY = screenY;

        paint = new Paint();
        canvas = new Canvas();

        hurdles = new Hurdles[hurdleCount];
        for (int i = 0; i < hurdleCount; i++) {
            hurdles[i] = new Hurdles(context, screenX, screenY);
        }

        ball_detectCollision = new Rect(ball.getBall_x(), ball.getBall_y(), ball.getBitmap().getWidth(), ball.getBitmap().getHeight());
        surfaceHolder.addCallback(new SurfaceHolder.Callback() {

            @Override
            public void surfaceCreated(SurfaceHolder holder) {

                System.out.println("Surface Created");

            }

            @Override
            public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

                System.out.println("Surface Changed");
                thread = new Thread(GamePanel.this);
                thread.start();
            }

            @Override
            public void surfaceDestroyed(SurfaceHolder holder) {

                System.out.println("Surface Destroyed");
            }
        });
    }


    private void draw() {

        canvas = surfaceHolder.lockCanvas();
        canvas.drawColor(Color.RED);
        canvas.drawBitmap(ball.getBitmap(), updatedValue, ball.getBall_y(), paint);
        ball.setBall_x(updatedValue);

        ball_detectCollision.left = ball.getBall_x();
        ball_detectCollision.top = screenY - ball.getBitmap().getHeight() - 260;
        ball_detectCollision.right = ball.getBall_x() + ball.getBitmap().getWidth();
        ball_detectCollision.bottom = screenY - ball.getBitmap().getHeight() - 260 + ball.getBitmap().getHeight();

        for (int i = 0; i < hurdleCount; i++) {
            canvas.drawBitmap(hurdles[i].getBitmap(), hurdles[i].getX(), hurdles[i].getY(), paint);
        }
        surfaceHolder.unlockCanvasAndPost(canvas);
    }

    @Override
    public void run() {

        while (playing) {
            update();
            draw();
            control();
        }
    }

    private void update() {

        for (int i = 0; i < hurdleCount; i++) {
            hurdles[i].update();

            if (Rect.intersects(getBall_detectCollision(), hurdles[i].getDetectCollision())) {
                System.out.println("Collision Detected");

                playing = false;
                Handler handler = new Handler(Looper.getMainLooper());
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        showGameOverMessage();

                    }
                });
            }
        }
    }


    public void pause() {

        playing = false;
        try {
            thread.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

这是我的障碍Class

  public class Hurdles {

        private Bitmap bitmap;
        private int x;
        private int y;
        private int speed = 20;

        private int maxX;
        private int minX;

        private int maxY;
        private int minY;

        private Rect detectCollision;

        public Hurdles(Context context, int screenX, int screenY) {

            bitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.hurdle);
            maxX = screenX - bitmap.getWidth();
            maxY = screenY;
            minX = 0;
            minY = 0;
            Random generator = new Random();
            detectCollision = new Rect(x, y, bitmap.getWidth(), bitmap.getHeight());

            x = generator.nextInt(maxX);
            y = minY;
        }

        public void update() {
            y += speed;

            if (y > maxY - getBitmap().getHeight()) {
                Random generator = new Random();
                y = minY;
                x = generator.nextInt(maxX);
            }

            detectCollision.left = x;
            detectCollision.right = x + bitmap.getWidth();
            detectCollision.top = y;
            detectCollision.bottom = y + bitmap.getHeight();
        }

尝试像这样更改代码:

handler.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        showGameOverMessage();

                    }
                },timeOffsetInMillis);

如果间隙可以相同你可以设置timeOffsetInMillis = i * gapInMillis

如果你想在障碍之间添加 delay/gap,你可以在你的 GamePanel 构造函数中这样做:

public GamePanel(Context context, final int screenX, final int screenY) {
    super(context);

    int gapBetweenHurdles = 100;
    int gap = 0;
    for (int i = 0; i < hurdleCount; i++) {
        //(screenY - gap) will move your hurdle above the screen
        hurdles[i] = new Hurdles(context, screenX, screenY - gap);
        //increment the gap
        gap += gapBetweenHurdles;
    }
......
}

所以栏之间的差距是 100 像素,因为我是随机写的。如果你想要特定的差距,你可以设置 gapBetweenHurdles 到屏幕高度的某个百分比。

编辑: 您必须将初始 XY 位置传递给障碍构造函数,然后在障碍 class 的更新方法中增加 Y 值并在障碍 class, getY() 应该 return Y.