Android-2D平台碰撞检测/w重力物理
由于这似乎是“堆栈”上的一个经常性主题,我将强调我的问题,因为它没有涵盖。所涵盖的是平台游戏等的2D瓷砖碰撞,但按照我制作游戏的方式,没有瓷砖。我也不使用额外的库,所有的东西都是我自己写的 我拥有的是游戏中每个对象的边界矩形。到目前为止,只有两个对象类在使用,平台和实体。实体包含所有用于玩家移动等的内容,而平台用于实心非移动平台 Platform.java:Android-2D平台碰撞检测/w重力物理,android,2d,collision-detection,game-physics,Android,2d,Collision Detection,Game Physics,由于这似乎是“堆栈”上的一个经常性主题,我将强调我的问题,因为它没有涵盖。所涵盖的是平台游戏等的2D瓷砖碰撞,但按照我制作游戏的方式,没有瓷砖。我也不使用额外的库,所有的东西都是我自己写的 我拥有的是游戏中每个对象的边界矩形。到目前为止,只有两个对象类在使用,平台和实体。实体包含所有用于玩家移动等的内容,而平台用于实心非移动平台 Platform.java: package com.toongames.game.objects; import android.graphics.Color; i
package com.toongames.game.objects;
import android.graphics.Color;
import android.graphics.Rect;
import com.toongames.framework.Graphics;
public class Platform {
private int x, y;
private int width, height;
public Platform(int par1, int par2, int par3, int par4) {
x = par1;
y = par2;
width = par3;
height = par4;
}
public Rect getBounds() {
return new Rect(x, y, x + width, y + height);
}
}
Entity.java:
package com.toongames.game.entity;
import android.graphics.Color;
import android.graphics.Point;
import android.graphics.Rect;
import com.toongames.framework.Graphics;
import com.toongames.framework.Image;
public class Entity {
public final float GRAVITY = 0.1F;
private String entityID;
private Point pos;
private int dx;
private float vel;
public Point desiredPos;
public boolean onGround;
public Entity(String par0String, int par1, int par2) {
entityID = par0String;
pos = new Point(par1, par2);
desiredPos = pos;
dx = 0;
vel = 0;
}
public void update(float deltaTime) {
vel = vel + (GRAVITY * deltaTime);
pos.y += (vel * deltaTime);
pos.x += dx;
}
public void setDx(int par1) {
dx = par1;
}
public int getDx() {
return dx;
}
public void setVelocity(int par1) {
vel = par1;
}
public float getVelocity() {
return vel;
}
public void setPos() {
pos = desiredPos;
}
public Rect getBounds() {
return new Rect(desiredPos.x, desiredPos.y, desiredPos.x + 80, desiredPos.y + 80);
}
}
我已经成功地使玩家与上下事物发生碰撞,但我一生都无法使玩家左右碰撞。无论何时我在向左或向右移动时与平台发生碰撞,我都会跳到与之碰撞的平台顶部
我知道这与我的逻辑有关,但我无法找出正确的逻辑来使用
ScreenGame.java:
package com.toongames.game.screen;
// Imports here...
public class ScreenGame extends Screen {
private Entity player;
private Button left, right, jump;
private Platform floor, p, p2, p3;
private ArrayList<Platform> platforms;
public ScreenGame(Game game) {
super(game);
player = new Entity("PLAYER", 300, 100, Assets.charRight);
left = new Button(Assets.move_left, 10, 790 - Assets.move_left.getHeight(), Assets.move_left.getWidth(), Assets.move_left.getHeight());
right = new Button(Assets.move_right, 20 + Assets.move_left.getWidth(), 790 - Assets.move_right.getHeight(), Assets.move_right.getWidth(), Assets.move_right.getHeight());
jump = new Button(Assets.jump, 1270 - Assets.jump.getWidth(), 790 - Assets.jump.getHeight(), Assets.jump.getWidth(), Assets.jump.getHeight());
floor = new Platform(0, 790, 1280, 80);
p = new Platform(1280 - 500, 500, 400, 80);
p2 = new Platform(0, 200, 400, 80);
p3 = new Platform(400, 120, 200, 80);
platforms = new ArrayList<Platform>();
platforms.add(floor);
platforms.add(p);
platforms.add(p2);
platforms.add(p3);
}
// An update method calls these
public void updateMovement(float deltaTime) {
List<TouchEvent> touchEvents = game.getInput().getTouchEvents();
int len = touchEvents.size();
for (int i = 0; i < len; i++) {
TouchEvent event = touchEvents.get(i);
if (event.type == TouchEvent.TOUCH_DOWN) {
if (inBounds(left.getBounds(), event)) {
player.setDx((int) -(deltaTime * 1.5F));
} else if (inBounds(right.getBounds(), event)) {
player.setDx((int) deltaTime * 2);
} else if (inBounds(jump.getBounds(), event)) {
if (player.onGround) {
player.setVelocity(-8);
}
}
} else if (event.type == TouchEvent.TOUCH_DRAGGED) {
if (inBounds(left.getBounds(), event)) {
player.setDx((int) -deltaTime * 2);
} else if (inBounds(right.getBounds(), event)) {
player.setDx((int) deltaTime * 2);
} else if (inBounds(jump.getBounds(), event)) {
if (player.onGround) {
player.setVelocity(-8);
}
} else {
player.setDx(0);
player.jumpCounter = 0;
}
} else if (event.type == TouchEvent.TOUCH_UP) {
player.setDx(0);
player.jumpCounter = 0;
}
}
}
// An update method calls these
public void updateGameObjects(float deltaTime) {
for (Platform p : platforms)
p.update();
player.update(deltaTime);
}
// An update method calls these
public void checkCollisions() {
Rect playerRect = player.getBounds();
for (Platform p : platforms) {
Rect pRect = p.getBounds();
if (Rect.intersects(playerRect, pRect)) {
Rect intersection = playerRect;
intersection.intersect(pRect);
if (player.getVelocity() != player.GRAVITY) {
int resolutionHeight;
if (player.getVelocity() < player.GRAVITY)
resolutionHeight = intersection.height();
else {
resolutionHeight = -intersection.height();
player.onGround = true;
}
player.setVelocity(0);
player.desiredPos = new Point(player.desiredPos.x, player.desiredPos.y + resolutionHeight);
}
}
}
player.setPos();
}
}
package com.toongames.game.screen;
//在这里输入。。。
公共类屏幕游戏扩展屏幕{
私人实体参与者;
私人按钮左,右,跳转;
私人平台层,p、p2、p3;
私有ArrayList平台;
公共屏幕游戏(游戏){
超级(游戏);
player=新实体(“player”,300100,Assets.charRight);
左=新建按钮(Assets.move_left,10790-Assets.move_left.getHeight(),Assets.move_left.getWidth(),Assets.move_left.getHeight());
右=新建按钮(Assets.move_right,20+Assets.move_left.getWidth(),790-Assets.move_right.getHeight(),Assets.move_right.getWidth(),Assets.move_right.getHeight());
jump=new按钮(Assets.jump,1270-Assets.jump.getWidth(),790-Assets.jump.getHeight(),Assets.jump.getWidth(),Assets.jump.getHeight());
楼层=新平台(0,790,1280,80);
p=新平台(1280-50050040080);
p2=新平台(0、200、400、80);
p3=新平台(400、120、200、80);
平台=新的ArrayList();
平台。添加(楼层);
增加(p);
平台。添加(p2);
平台。添加(p3);
}
//update方法调用这些
public void updateMovement(float deltaTime){
List touchEvents=game.getInput().getTouchEvents();
int len=touchEvents.size();
对于(int i=0;i
作为额外的说明,我已经删除了一些不必要的代码来处理实体和实体健康等的图像。。此外,我还删掉了一些空洞的方法和类似的东西,它们与以往任何时候都不相关
[编辑]剪切大部分图形代码并导入。所有绝对必要的东西现在都在那里了
player.desiredPos = new Point(player.desiredPos.x, player.desiredPos.y + resolutionHeight);
这是不是“向上移动,永远不要向右/向左?”
我认为您的
Rect.intersects
方法应该返回{NONE,LEFT,RIGHT,UP,DOWN}
之一,指示碰撞发生的方向。所以你可以对碰撞做出正确的反应…@portforwardpodcast我开始研究一些物理引擎,但后来意识到我必须构建一个全新的框架,我还必须使用它们的大部分过程等,但我所需要的只是重力。所以我刚做了重力,现在加入了碰撞检测。这肯定没有什么问题吗?您研究过JST拓扑套件吗?如果你想要一个演示它可以做什么,请查看:@p