Pong:窗口顶部和底部边界处的反向球
问题描述:
我是一名编程初学者,希望创建一个pong游戏。我非常接近,两个桨都移动,当球相交时,球就从他们身上弹开。但是,当球通过屏幕的顶部和底部时,我会在逆转球的轨迹时遇到一些麻烦。我以为我有这个修复,但它似乎并没有工作。Pong:窗口顶部和底部边界处的反向球
任何帮助将不胜感激。下面的代码。
import java.util.Random;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.newdawn.slick.Animation;
import org.newdawn.slick.AppGameContainer;
import org.newdawn.slick.BasicGame;
import org.newdawn.slick.Color;
import org.newdawn.slick.GameContainer;
import org.newdawn.slick.Graphics;
import org.newdawn.slick.Image;
import org.newdawn.slick.Input;
import org.newdawn.slick.SlickException;
import org.newdawn.slick.SpriteSheet;
import org.newdawn.slick.geom.Rectangle;
public class PongAttempt extends BasicGame{
Image player1Img;
Image player2Img;
Image ball;
float ballx = 500;
float bally = 500;
float x = 0;
float y = 0;
float bx = 100;
float by = 40;
float velocityx = -.10f;
float velocityy = 0f;
float player1Vel = 0;
float player2Vel = 0;
Rectangle player1Dim;
Rectangle player2Dim;
Rectangle ballDim;
public PongAttempt(String gamename){super(gamename);}
@Override
public void init(GameContainer gc) throws SlickException {
player1Img = new Image("res/troll.png");
player2Img = new Image("res/troll.png");
ball = new Image("res/ball.png");
player1Dim = new Rectangle(x, y, player1Img.getWidth(), player1Img.getHeight());
player2Dim = new Rectangle(bx, by, player2Img.getWidth(), player2Img.getHeight());
ballDim = new Rectangle(ballx, bally, ball.getWidth(), ball.getHeight());
bx = gc.getWidth() - player2Img.getWidth();
by = 0;
ballx = gc.getWidth()/2;
bally = gc.getHeight()/2;
}
@Override
public void update(GameContainer gc, int i) throws SlickException {
}
@Override
public void render(GameContainer gc, Graphics g) throws SlickException
{
g.setBackground(Color.black);
//Player 1 move and generate boundaries
if(gc.getInput().isKeyDown(Input.KEY_W) && y > 0) {
y = y - 0.2f;
player1Vel = -0.2f;
}
if(gc.getInput().isKeyDown(Input.KEY_S) && y < (gc.getHeight() - player1Img.getHeight())) {
y = y + 0.2f;
player1Vel = 0.2f;
}
//Player 2 Move and generate boundaries
if(gc.getInput().isKeyDown(Input.KEY_O) && by > 0) {
player2Vel = -0.2f;
by = by + player2Vel;
}
if(gc.getInput().isKeyDown(Input.KEY_L) && by < (gc.getHeight() - player2Img.getHeight())) {
player2Vel = 0.2f;
by = by + player2Vel;
}
if(gc.getInput().isKeyDown(Input.KEY_ESCAPE)){
gc.exit();
}
player1Dim.setX(x);
player1Dim.setY(y);
player2Dim.setX(bx);
player2Dim.setY(by);
ballDim.setX(ballx);
ballDim.setY(bally);
if(ballDim.intersects(player1Dim)){
velocityx = velocityx * -1;
velocityy = player1Vel;
}
if(ballDim.intersects(player2Dim)){
velocityx = velocityx * -1;
velocityy = player2Vel;
}
//This is where I tried to get the ball to bounce off the top and bottom
if(ballx == 0 - ball.getHeight()){
velocityx = velocityx * -1;
}
if(ballx == gc.getHeight() - ball.getHeight()){
velocityx = velocityx * -1;
}
ballx = ballx + velocityx;
bally = bally + velocityy;
player1Img.draw(x, y);
player2Img.draw(bx, by);
ball.draw(ballx, bally);
}
public static void main(String[] args)
{
try
{
AppGameContainer appgc;
appgc = new AppGameContainer(new PongAttempt("Simple Slick Game"));
appgc.setDisplayMode(appgc.getScreenWidth(), appgc.getScreenHeight(), true);
appgc.start();
}
catch (SlickException ex)
{
Logger.getLogger(PongAttempt.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
答
您正在检查球的高度是否等于零(或窗口的高度)。渲染被调用的几率和击球0的球正好是低的。实际上你应该检查球是否已经超过0,然后改变其速度。
它实际上比这个稍微复杂一些,因为如果球速度超过0,就会改变速度,然后发生某种事情会使球慢下来,当球仍然在框架外时,渲染可能会再次发生它的速度反转并再次离开屏幕。这将导致它在窗外持续振动,其速度每帧都会反转。
有很多额外的错误检查你可以做,确保球的速度永远是正确的,并做更复杂的几何形状,使球实际上反弹离开墙壁,即使它在一个框架中移动穿过墙壁。
谢谢,我现在已经开始工作了。 – SykoTron