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

创建简单碰撞检测

沈子昂
2023-03-14

我创建了一个非常简单的程序,其中我使用绘画绘制了一个迷宫(使用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;
    }
}

我想使精灵在碰到墙时停止(使用x和y坐标),精灵将停止移动。

共有3个答案

逑何平
2023-03-14

我的方法是使用矩形碰撞框。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.
    }
}

那将是一个矩形框,你不能进入它的边界。

蒋烨然
2023-03-14

如果小程序是双缓冲的,则可以在它们移动之前执行以下操作:

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”,我相信有更好的方法来实现它,但这是一个可能的快速解决方案。

薛俊美
2023-03-14

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

/* 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;
}
 类似资料:
  • 碰撞检测 现在你知道了如何制造种类繁多的图形对象,但是你能用他们做什么?一个有趣的事情是利用它制作一个简单的 碰撞检测系统 。你可以用一个叫做:hitTestRectangle 的自定义的函数来检测两个矩形精灵是否接触。 hitTestRectangle(spriteOne, spriteTwo) 如果它们重叠, hitTestRectangle 会返回 true。你可以用 hitTestRect

  • 本节暂未进行完全的重写,错误可能会很多。如果可能的话,请对照原文进行阅读。如果有报告本节的错误,将会延迟至重写之后进行处理。 当试图判断两个物体之间是否有碰撞发生时,我们通常不使用物体本身的数据,因为这些物体常常会很复杂,这将导致碰撞检测变得很复杂。正因这一点,使用重叠在物体上的更简单的外形(通常有较简单明确的数学定义)来进行碰撞检测成为常用的方法。我们基于这些简单的外形来检测碰撞,这样代码会变得

  • 我的新想法是使用9个点,围绕我的玩家对象,并检查这些点中的哪一个是在瓷砖的界限内。一个点在每个角落,每边和一个在中心。每种瓦片类型将使用一组不同的规则来处理冲突。 然而,每种瓦片类型都必须使用一组复杂的条件语句来进行冲突测试--可能过于复杂。有什么指导吗?

  • 我有一个关于libGDX碰撞检测的问题。因为这是一个相当具体的问题,我还没有在互联网上找到任何好的解决方案。 因此,我已经创建了由不同身体部位组成的“人类”,每个部位都有矩形碰撞检测。 现在我想实现武器和技能,例如看起来像这样: 技能示例图像 问题 当有这样的技能时,在碰撞检测中使用矩形会让玩家非常沮丧:他们会成功躲避技能,但碰撞检测器仍然会伤害他们。 方法 1: 在我开始使用Libgdx之前,我

  • 我正在尝试做一个平台游戏,其中没有斜坡。我正在尝试将碰撞检测降下来,但是我在pygame中找不到一种方法来获得哪一边与另一个Sprite发生了碰撞。有没有人能给我一个好的方法来做到这一点,那不是太庞大,但也能很好地工作在我的情况? 下面是我的玩家类: 我已经将它添加到我的player类中,每次播放器更新时我都运行它,并且它工作...差一点。 在平台顶部的碰撞起作用,在侧面的碰撞几乎总是起作用,除非

  • 问题内容: 有人可以帮我了解JS中冲突检测的工作原理吗?我不能使用jQuery或gameQuery-已经使用了原型- 因此,我正在寻找非常简单的东西。不要求完整的解决方案,只需为我指明正确的方向。 假设有: 现在球正在移动(任何方向)。“ Someobject”(0-X)已经预先定义,其中有20-60个随机放置,如下所示: 我可以创建一个位置为“ someobject(X)”的数组,并在“球”移动