创建简单的碰撞检测

时间:2013-03-15 02:10:31

标签: java collision-detection

我创建了一个非常简单的程序,我使用paint绘制了一个迷宫(方法fillRect用于创建迷宫的墙壁),我创建了一个使用{{}移动的精灵。 1}}。我想实现一个简单的(因为我在通勤科学的第一年)碰撞检测,以防止精灵穿过迷宫的墙壁。因为迷宫是用近400行代码绘制的,所以我不会包含它。

keyListener

我想这样做,以便精灵在撞到墙壁时停止(使用import java.awt.*; import java.applet.*; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; public class IndeProj extends Applet implements KeyListener { //KEY LISTENER INFO FOR MY SPRITE public int x = 10; public int y = 575; public boolean keyUp; public boolean keyDown; public boolean keyLeft; public boolean keyRight; public void paint(Graphics g) { //drawMaze drawMazeHorizontalLines(g); drawMazeVerticalLines(g); //SPRITE STUFF addKeyListener(this); this.MoveRect(g,x,y); } public void drawMazeHorizontalLines(Graphics g) { //This method draws the horizontal lines of the maze using the method `fillRect(x,y,w,h)` } public void drawMazeVerticalLines (Graphics g) { //This method draws the vertical lines of the maze using `fillRect(x,y,w,h)` } public void MoveRect(Graphics g, int x, int y) //Draws Sprite { g.setColor(Color.green); g.fillRect(x,y,20,20); g.setColor(Color.yellow); //Sprite body g.fillRect(x,y,20,20); g.setColor(Color.green); //Sprite eyes g.fillRect(x,y,7,7); g.fillRect((x+13),y,7,7); g.setColor(Color.blue); //Sprite pants g.fillRect(x,(y+13),20,7); g.setColor(Color.black); //Sprite mouth g.fillRect((x+6),(y+9),8,2); } public void keyPressed(KeyEvent e) //Moves Sprite { if (e.getKeyCode() == KeyEvent.VK_DOWN) { y+=1; y+=0; } if (e.getKeyCode() == KeyEvent.VK_UP) { y-=1; y-=0; } if (e.getKeyCode() == KeyEvent.VK_LEFT) { x-=1; x-=0; } if (e.getKeyCode() == KeyEvent.VK_RIGHT) { x+=1; x+=0; } repaint(); } public void keyReleased(KeyEvent e) //Stops Sprite { keyUp = keyDown = keyLeft = keyRight = false; } } x坐标),精灵将停止移动。

3 个答案:

答案 0 :(得分:1)

这里是一种简单的碰撞检测方法,地图是每个int都有一个int的网格 它包含的墙。 如果你做错了,你会得到神奇的单向墙。

/* could use enums for this */
public static int WALL_LEFT = 1;
public static int WALL_RIGHT = 2;
public static int WALL_TOP = 4;
public static int WALL_BOTTOM = 8;


public int[][] createSimpleMap(){
    int[][] map = new int[2][2];
    map[0][0] = WALL_LEFT | WALL_RIGHT | WALL_TOP;
    map[0][1] = WALL_LEFT | WALL_RIGHT | WALL_TOP;
    map[1][0] = WALL_LEFT | WALL_BOTTOM;
    map[1][1] = WALL_RIGHT | WALL_BOTTOM;
    return map;
}

进行碰撞检测只是检测墙是否存在。

public boolean canMoveUp(x,y){
    return (this.map[x][y] & WALL_TOP) ==0;
}

答案 1 :(得分:0)

我这样做的方法是使用矩形碰撞盒。 playerX和playerY是玩家的坐标:

while(true) {
    while(!((playerX > 50 && playerX < 100) && (playerY > 50 && playerY < 100))){
        //Put code to let they players walk here, and boundaries will be enforced.
    }
}

这将是一个矩形框,你不能进入。

答案 2 :(得分:0)

如果您的applet是双缓冲的,那么您可以在移动之前执行以下操作:

Color c = new Color(buffer.getRGB(desiredPlayerX, desiredPlayerY));
if(c.equals(<Whatever color you used for the maze walls>)){
    // Don't allow the movement of the player
}else{
    x = desiredPlayerX;
    y = desiredPlayerY;
}

这个方法看起来确实有点“hacky”,我确信有更好的方法来实现它,但这是一个可能的快速解决方案。