Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于分片映射的Java冲突检测_Java_Collision Detection_Tile - Fatal编程技术网

基于分片映射的Java冲突检测

基于分片映射的Java冲突检测,java,collision-detection,tile,Java,Collision Detection,Tile,我在做游戏时遇到了一个问题。 我做了一个碰撞检测,当多边形接触瓷砖时,检测结果为真。 虽然这是完美的,使球员不走(真的?)墙。 当我施加重力时,它应该用同样的方法停止,但这造成了一个问题。 它一直往下掉,直到撞到地板,但是你也不能再走路了,所以我需要另一个碰撞检测。 我不知道从哪里开始( 谢谢。将您的所有磁贴加载到ArrayList中。然后您可以使用for each循环将碰撞检测应用到播放机的所有磁贴。请注意,以下示例可能不会声明所有必要的工作内容,但它应该帮助您了解此碰撞检测方法的工作原理,并

我在做游戏时遇到了一个问题。 我做了一个碰撞检测,当多边形接触瓷砖时,检测结果为真。 虽然这是完美的,使球员不走(真的?)墙。 当我施加重力时,它应该用同样的方法停止,但这造成了一个问题。 它一直往下掉,直到撞到地板,但是你也不能再走路了,所以我需要另一个碰撞检测。 我不知道从哪里开始(
谢谢。

将您的所有磁贴加载到ArrayList中。然后您可以使用for each循环将碰撞检测应用到播放机的所有磁贴。请注意,以下示例可能不会声明所有必要的工作内容,但它应该帮助您了解此碰撞检测方法的工作原理,并允许您实现把它融入你的游戏

Tile.java

    import java.awt.Rectangle;
    private int tileWidth = 32;
    private int tileHeight = 32;
    private int x;
    private int y;
    public class Tile() {
        public Tile(int tx, int ty) {
            x = tx * tileWidth;
            y = ty * tileHeight;
        }
        public Rectangle getBounds() {
            return new Rectangle(x, y, tileWidth, tileHeight);
        }
    }
CheckCollision.java

    import java.awt.Rectangle;
    public class CheckCollision {
        public boolean isColliding(Player player, Tile tile) {
            Rectangle pRect = player.getBounds();
            Rectangle tRect = tile.getBounds();
            if(pRect.intersects(tRect)) {
                return true;
            } else {
                return false;
            }
        }
    }
Player.java

    import java.awt.Rectangle;
    import java.util.ArrayList;
    public class Player {
        public void move(ArrayList<Tile> tiles) {
            y -= directionY; //falling
            for(Tile t: tiles) { // for all of the Tiles in tiles, do the following
                Tile next = t;
                if(CheckCollision.isColliding(this, next) {
                    y += directionY; //stop falling
                }
            }
            x -= dx; // move your x
            for(Tile t: tiles) { // for all of the Tiles in tiles, do the following
                Tile next = t;
                if(CheckCollision.isColliding(this, next) {
                    x += directionY; //move back if collides                  }
            }

        }

        public Rectangle getBounds() {
            return new Rectangle(playerX, playerY, playerWidth, playerHeight);
        }
    }
导入java.awt.Rectangle;
导入java.util.ArrayList;
公开课选手{
公共无效移动(ArrayList磁贴){
y-=方向y;//下降
对于(Tile t:tiles){//对于tiles中的所有Tile,请执行以下操作
瓦片下一个=t;
if(CheckCollision.isColliding(这个,下一个){
y+=方向y;//停止下落
}
}
x-=dx;//移动x
对于(Tile t:tiles){//对于tiles中的所有Tile,请执行以下操作
瓦片下一个=t;
if(CheckCollision.isColliding(这个,下一个){
x+=directionY;//碰撞时向后移动}
}
}
公共矩形getBounds(){
返回新矩形(playerX、playerY、playerWidth、playerHeight);
}
}
Graphics.java(绘制平铺和播放器的类)

import java.awt.ActionListener;
导入java.util.ArrayList;
公共类图形扩展JPanel实现ActionListener{
public ArrayList tiles=new ArrayList();
玩家=新玩家();
公共JPanel(){
添加(新分幅(0,0));//将X:0 Y:0处的分幅添加到ArrayList分幅
}
@凌驾
已执行的公共无效操作(操作事件e){
玩家移动(瓦片);
}
}

我的Minecraft克隆版也有类似的问题。问题是我的代码在每一帧都检测到与地板的碰撞,我通过取消所有3维的运动来响应。我更改了它,所以我只取消了该运动的垂直分量,效果很好。

这还不足以继续。你是u唱一首瓦片框架?请提供一个展示你描述的问题的例子。重力确保它接触到地板,但这个信号也使你无法行走,因为游戏认为它撞到了墙。sscce会很有帮助。可能有太多的潜力…我只想知道你是否能够知道如果你有这样的东西…至少你需要一张图片
    import java.awt.ActionListener;
    import java.util.ArrayList;
    public class Graphics extends JPanel implements ActionListener {
        public ArrayList<Tile> tiles = new ArrayList();
        Player player = new Player();
        public JPanel() {
            tiles.add(new Tile(0, 0)); //adds a Tile at X:0 Y:0 to ArrayList tiles
        }

        @Override
        public void ActionPerformed(ActionEvent e) {
            player.move(tiles);
        }
    }