当前位置: 首页 > 知识库问答 >
问题:

Java编程,突破游戏球物理性能未达到预期

白芷阳
2023-03-14

我正在读《java的艺术与科学:计算机科学导论》一书学习java。练习程序之一是创建突破游戏的简单克隆。

我目前能够加载游戏,但球的物理问题。我正在使用最简单的物理可能,不明白为什么它不起作用。

当球撞到墙上时,它会正常反弹,但当它撞到桨或砖块时,它不会。我在碰撞检测中使用相同的代码来更改我在墙上使用的方向。检测到碰撞后,我添加了一个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);
    }
}
}

共有1个答案

富凯旋
2023-03-14

添加<代码>if(dy

 类似资料:
  • 我正在为一项大学作业创建一个项目,我遇到了一点障碍。这个问题很小,很可能被认为是没有被注意到的,但它仍然困扰着我,作为一个程序性的人,在完成工作方面,我不能继续做任何事情,直到它被解决。 我有桨和球代码工作良好,以及一个简单的角速度的基础上,球击中桨,但我的问题是当球击中砖块。代码大多有效,似乎完美无瑕,但当球做以下两件事之一时,情况会发生变化: 击中砖块的一个角可能会错误地扭转球的速度轴 同时击

  • 我正在创建一个突破游戏来熟悉Java。目前我已经把一切都做好了,但我注意到球似乎是朝着同一个方向飞的。 我已经对它进行了编程,当球碰到球拍时,Y速度是相反的。这是可行的,但球似乎遵循相同的路线。。。 如何让碰撞看起来更真实? 当球击中桨的左侧时,我想将其重新定向到左侧,但我不确定在哪个角度反射它。有人能提供一个公式来帮助我计算出当球接触桨的左侧或右侧时需要引导的角度吗?

  • 当用户按下左右键时,我希望我的矩形停止。我研究了多个密钥处理,但无法找到任何东西。 谢谢你的帮助

  • 我正在创建一个突破游戏,我之前在这里问了一个问题,但没有提出解决方案。我有一个简单的物理过程来反转球与桨碰撞时的速度。但我需要实现一个更先进的物理系统,例如,当球击中桨的左侧和右侧时,等等。。。但我该如何计算碰撞后球的方向呢?突破的标准是在与球拍左侧碰撞时将球指向左侧,如果碰撞是向右的,则指向右侧,等等。。。 我如何计算在哪里击球?我有很多变量可以使用,比如桨叶的各个方面(宽度、高度、X位置)、球

  • 问题内容: 我正在研究Java中的游戏编程,看是否可行。进行搜索时,我发现了一些关于Java2D的旧参考资料,Project Darkstar(Sun的MMO服务器)和一些有关Java游戏编程的书籍。但是很多信息似乎已经有好几年了。 所以我要问的问题是,有人在Java SE 1.5或更高版本中创建游戏吗? 如果是这样,将使用什么框架,是否有最佳实践或库? 问题答案: 有一个叫做jMonkey(ht

  • 我的java突破游戏有问题。一切都很好,除了我的球拍在右侧离开屏幕,我的球也会这样,但现在不用担心。 //防止挡板移出屏幕 Public void update(){x=xVelocity; //根据向左或向右按设定速度 按下Public void键(KeyEvent e) //释放关键帧后设置速度 如果(e.getKeyCode()==KeyEvent.VK_LEFT){