繁体   English   中英

Java编程,突破性游戏球物理行为不符合预期

[英]Java programming, breakout game ball physics not behaving as expected

我正在用《 Java的艺术与科学:计算机科学概论》一书学习Java。 练习程序之一是创建Breakout游戏的简单副本。

我目前可以加载游戏,但是球物理存在问题。 我使用的是最简单的物理方法,无法理解为什么它不起作用。

当球撞到墙壁时,它会正常反弹,但是当撞到桨或砖头时,它不会反弹。 我在碰撞检测中使用相同的代码来更改与墙一起使用的方向。 检测到碰撞,我添加了一个println并看着控制台经历了碰撞事件,但是方向并未发生变化。

package chapter10;

/* 
 * This program creates a clone of the classic Breakout Game,
 * where a player bounces a ball with a paddle to "break" bricks 
 * along the top of the screen.
 * 
 * Controls: Left: left button, Right: right button
 */

import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.RepaintManager;
import javax.swing.Timer;

import acm.program.*;
import acm.graphics.*;

public class BreakoutClone extends GraphicsProgram {

/* components */
private GRect paddle;
private GRect brick;
private GOval ball;

/* static variables */

private static final double PADDLE_HEIGHT = 5;
private static final double BALL_SPEED = 2;
private static final double PADDLE_SPEED = 2;
private static final double ROWS_BRICKS = 6;
private static final double COLUMNS_BRICKS = 10;
private static final double TOP_GAP = 50;

/* variables */

private int numTurns = 3;
private double paddleWidth = 50;
private int dx = 2;
private int dy = 2;

public void init() {
    setSize(700, 600);

    paddle = new GRect(0, getHeight() - 30, paddleWidth, PADDLE_HEIGHT);
    paddle.setFilled(true);
    add(paddle);

    addBricks();

    ball = new GOval(getWidth() / 2, 175, 5, 5);
    ball.setFilled(true);
    add(ball);
}

public void run() {
    animateBall();
    // TODO animate paddle
}

public void addBricks() {
    double gap = 20;
    double brickWidth = getWidth() / COLUMNS_BRICKS;
    for (int r = 0; r < ROWS_BRICKS; r++) {
        for (int b = 0; b < COLUMNS_BRICKS; b++) {
            brick = new GRect(b * brickWidth, gap * r + TOP_GAP,
                    brickWidth, 10);
            brick.setFilled(true);
            add(brick);
        }
    }
}

public void endGame() {
    // TODO write end game method
}

public void animateBall() {

    while (numTurns > 0) {

        ball.move(dx, dy);
        pause(15);

        /* Look for Object Collision */
        GObject topRightObject = getElementAt(ball.getX() + 5, ball.getY());
        GObject topLeftObject = getElementAt(ball.getX(), ball.getY());
        GObject botRightObject = getElementAt(ball.getX() + 5,
                ball.getY() + 5);
        GObject botLeftObject = getElementAt(ball.getX(), ball.getY() + 5);

        /* Bounce off walls */

        if ((ball.getX() >= getWidth() - 5) || ball.getX() <= 0) {
            dx = -dx;
        }
        if (ball.getY() <= 0) {
            dy = -dy;
        }
        if ((ball.getY() >= getHeight() - 5)) {
            dy = -dy;
            // numTurns--;
            // if (numTurns == 0) {
            // endGame();
            // } else {
            // run();
            // }
        }

        /* Bounce off objects, remove bricks */

        if (topRightObject != null) {
            dy = -dy;
            hasCollided(topRightObject);
        }
        if (topLeftObject != null) {
            dy = -dy;
            hasCollided(topLeftObject);
        }
        if (botRightObject != null) {
            dy = -dy;
            hasCollided(botRightObject);
        }
        if (botLeftObject != null) {
            dy = -dy;
            hasCollided(botLeftObject);
        }
    }
}

private void hasCollided(GObject obj) {
    if (obj.equals(paddle)) {
        System.out.println("detecting paddle");

    } else {
        System.out.println("detecting brick");

        remove(obj);
    }
}
}

在击中球的方向相反的部分周围添加if(dy<0) (假定dy为负,则意味着球正朝着球拍前进)。 这样就消除了改变方向的可能性,但是每次碰撞都不会改变一次

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM