2013-03-15 104 views
1

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

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; 
    } 
} 

我想这样,当它撞到一堵墙(使用xy坐标)精灵停止做它,精灵将停止移动。

回答

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; 
} 
0

我会这样做的方式是使用矩形的碰撞盒​​。玩家X和玩家Y是玩家的坐标:

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

这将是一个矩形框,你不能去的边界内。

0

如果你的小程序双缓冲,那么你可以做下面的迁移前:

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; 
} 

这种方法似乎有点“哈克”虽然,我敢肯定,有实现更好的方法它,但这是一个可能的快速解决方案。