基于分片映射的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);
}
}