Android-2D平台碰撞检测/w重力物理

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

由于这似乎是“堆栈”上的一个经常性主题,我将强调我的问题,因为它没有涵盖。所涵盖的是平台游戏等的2D瓷砖碰撞,但按照我制作游戏的方式,没有瓷砖。我也不使用额外的库,所有的东西都是我自己写的

我拥有的是游戏中每个对象的边界矩形。到目前为止,只有两个对象类在使用,平台和实体。实体包含所有用于玩家移动等的内容,而平台用于实心非移动平台

Platform.java:

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