Java碰撞在2D游戏中无法正常工作

3

介绍

我曾经在过去的一个帖子中提到过这个问题,通过这个论坛上其他用户的帮助,我花了很长时间修改我的代码,但最终仍然和我起始的地方一样,所以我采用了不同的方法。

我的目标

我不会让你替我制作游戏,所以我并没有发布所有的游戏代码,而是制作了一个非常简单的版本来说明问题,它只有两个类:主类和游戏类。提供的简单代码如下:有两个矩形,其中一个根据键盘输入移动,就这样,没有背景,没有图像,没有动画,代码也很少。

我的问题/我的疑问

我的问题是在游戏中的碰撞,例如在这个例子中的两个矩形,我需要添加一些代码来防止一个矩形与另一个矩形相交,我已经查看了许多关于此问题的教程和指南,但没有取得任何进展,希望这个论坛的用户能够帮助我解决这个问题。

代码

正如我之前提到的,这个游戏的代码非常简单,只有2个类,没有其他要求,因此如果需要,您可以简单地创建 2 个类(Game 和 Play),并在计算机上运行此游戏。请注意,在使用此代码之前,您需要使用编译器设置 Slick。

主要类(Game)

package javagame;

import org.newdawn.slick.*;
import org.newdawn.slick.state.*;

public class Game extends StateBasedGame{

    public static final String gamename = "Ham Blaster! 2.0";

    public static final int play = 1;

    public Game(String gamename){//create window on statup
        super(gamename);//adds title to screen
        this.addState(new Play(play));
    }

    public void initStatesList(GameContainer gc) throws SlickException{

        this.getState(play).init(gc, this);
        }

    public static void main(String[] args) {
        AppGameContainer appgc;//the window for your game
        try{
            appgc = new AppGameContainer(new Game(gamename));
            appgc.setDisplayMode(640, 360,false);
            appgc.start();
        }catch(SlickException e){
        e.printStackTrace();}
    }}

播放类

    package javagame;

import java.awt.Rectangle;

import org.newdawn.slick.Animation;
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.state.BasicGameState;
import org.newdawn.slick.state.StateBasedGame;

public class Play extends BasicGameState{

    Animation bucky, movingUp, movingDown, movingLeft, movingRight;
    Image worldMap;
    boolean quit = false;//gives user to quit the game
    int[] duration = {200, 200};//how long frame stays up for
    int buckyPositionX = 0;
    int buckyPositionY = 0;
    int shiftX = buckyPositionX + 320;//keeps user in the middle of the screem
    int shiftY = buckyPositionY + 160;//the numbers are half of the screen size

    Rectangle rectOne = new Rectangle(shiftX, shiftY,90,90);
    Rectangle rectTwo = new Rectangle(500 + buckyPositionX, 330 + buckyPositionY, 210, 150);

    public Play(int state){
    }   
    public void init(GameContainer gc, StateBasedGame sbg) throws SlickException{
    }


    public void render(GameContainer gc, StateBasedGame sbg, Graphics g) throws SlickException{


    g.fillRect(shiftX, shiftY,90,90);
    g.fillRect(500 + buckyPositionX, 330 + buckyPositionY, 210, 150);
    }


    public void update(GameContainer gc, StateBasedGame sbg, int delta)throws SlickException{
    Input input = gc.getInput();

    //up
    if(input.isKeyDown(Input.KEY_UP)){buckyPositionY += 2;}

    //down
    if(input.isKeyDown(Input.KEY_DOWN)){buckyPositionY -= 2;}
    //left
    if(input.isKeyDown(Input.KEY_LEFT)){buckyPositionX += 2;}
    //right
    if(input.isKeyDown(Input.KEY_RIGHT)){buckyPositionX -= 2;}
}   


    public int getID(){
        return 1;
    }
}

如果您需要任何其他信息,请告诉我,我会尽快回复。

也许你需要更新按键上的矩形并调用http://docs.oracle.com/javase/6/docs/api/java/awt/Rectangle.html#intersects(java.awt.Rectangle)来确定它们是否会发生碰撞。 - Usman Saleem
你在哪里检测碰撞?我认为这不是自动的;你需要使用像intersects这样的方法。 - mellamokb
2
我建议你摆脱X+Y位置变量,只使用Rectangle,因为它具有X+Y坐标(然后您可以使用intersects)。一般编码提示-拥有widthheight变量,并说width/2而不是320 - Bernhard Barker
1个回答

0

我对这个框架不是很熟悉,但我知道原始类型提供了一个intersects()方法来确定两个对象是否相互碰撞。你需要手动调用它或找到一些组件来注册你的对象,以便它可以为你完成。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接