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

如何在碰撞检测中添加死亡功能?

翟博雅
2023-03-14

(注意:这篇文章是从游戏开发中复制粘贴的,因为我收到评论说要在Stack Overflow发布)

我想要的是,当我的播放器与我的瓷砖(实心)碰撞时,它们将被发送到menustate(或menuscreen)。我已经为我的瓷砖做了碰撞检测(使用isSolid)。那么如何使它,如果我的球员与瓷砖(即固体)碰撞,它将被发送到我的menustate。

很抱歉,如果我添加了不需要的类,那就是我的玩家、生物和实体类相互扩展。

这是我的生物课,这里有碰撞检测。

public abstract class Creatures extends Entity {

public static final int DEFAULT_HEALTH = 1;
public static final float DEFAULT_SPEED = 5.0f;
public static final int DEFAULT_CREATURE_WIDTH = 128;
public static final int DEFAULT_CREATURE_HEIGHT = 128;

protected int health;
protected float speed;
public static float xMove;
public static float yMove;
protected int MinHeight;

public Creatures(Handler handler, float x, float y, int width, int height) {
    super(handler, x, y, width, height);
    health = DEFAULT_HEALTH;
    speed = DEFAULT_SPEED; 
    xMove = 0;
    yMove = 0;
    MinHeight = -1;
}

public void move(){
    moveX();
    moveY();
}

//COLLISION DETECTION BELOW
public void moveX(){
    if(xMove > 0){//Moving right
        int tx = (int) (x + xMove + bounds.x + bounds.width) / Tile.TILEWIDTH;

        if(!collisionWithTile(tx, (int) (y + bounds.y) / Tile.TILEHEIGHT) &&
                !collisionWithTile(tx, (int) (y + bounds.y + bounds.height) / Tile.TILEHEIGHT)){
            x += xMove;
        }else{
            x = tx * Tile.TILEWIDTH - bounds.x - bounds.width - 1;
        }

    }else if(xMove < 0){//Moving left
        int tx = (int) (x + xMove + bounds.x) / Tile.TILEWIDTH;

        if(!collisionWithTile(tx, (int) (y + bounds.y) / Tile.TILEHEIGHT) &&
                !collisionWithTile(tx, (int) (y + bounds.y + bounds.height) / Tile.TILEHEIGHT)){
            x += xMove;
        }else{
            x = tx * Tile.TILEWIDTH + Tile.TILEWIDTH - bounds.x;
        }
    }
}

public void moveY(){
    if(yMove < 0){//Up
        int ty = (int) (y + yMove + bounds.y) / Tile.TILEHEIGHT;

        if(!collisionWithTile((int) (x + bounds.x) / Tile.TILEWIDTH, ty) &&
                !collisionWithTile((int) (x + bounds.x + bounds.width) / Tile.TILEWIDTH, ty)){
            y += yMove;
        }else{
            y = ty * Tile.TILEHEIGHT + Tile.TILEHEIGHT - bounds.y;
        }

    }else if(yMove > 0){//Down
        int ty = (int) (y + yMove + bounds.y + bounds.height) / Tile.TILEHEIGHT;

        if(!collisionWithTile((int) (x + bounds.x) / Tile.TILEWIDTH, ty) &&
                !collisionWithTile((int) (x + bounds.x + bounds.width) / Tile.TILEWIDTH, ty)){
            y += yMove;
        }else{
            y = ty * Tile.TILEHEIGHT - bounds.y - bounds.height - 1;
        }
    }
}

//This code below checks if the tile im colliding is Solid or not
protected boolean collisionWithTile(int x, int y){
    return handler.getWorld().getTile(x, y).isSolid();
}

//GETTERS AND SETTERS

public float getxMove() {
    return xMove;
}

@SuppressWarnings("static-access")
public void setxMove(float xMove) {
    this.xMove = xMove;
}

public float getyMove() {
    return yMove;
}

@SuppressWarnings("static-access")
public void setyMove(float yMove) {
    this.yMove = yMove;
}

public int getHealth() {
    return health;
}

public void setHealth(int health) {
    this.health = health;
}

public float getSpeed() {
    return speed;
}

public void setSpeed(float speed) {
    this.speed = speed;
}

}

然后My Entity类(我的生物类延伸到这个类)

import java.awt.Graphics;
import java.awt.Rectangle;

public abstract class Entity {

protected Handler handler;
protected float x, y;
protected int width, height;
protected Rectangle bounds;

public Entity(Handler handler, float x, float y, int width, int height){
    this.handler = handler;
    this.x = x;
    this.y = y;
    this.width = width;
    this.height = height;

    bounds = new Rectangle(0, 0, width, height);
}

public abstract void tick();

public abstract void render(Graphics g);

public float getX() {
    return x;
}

public void setX(float x) {
    this.x = x;
}

public float getY() {
    return y;
}

public void setY(float y) {
    this.y = y;
}

public int getWidth() {
    return width;
}

public void setWidth(int width) {
    this.width = width;
}

public int getHeight() {
    return height;
}

public void setHeight(int height) {
    this.height = height;
}

}

我的玩家类(我的玩家类延伸到我的生物类)

import java.awt.Graphics;
import java.awt.image.BufferedImage;

public class Player extends Creatures{

//Animations
private Animation animRight, animLeft;

public Player(Handler handler, float x, float y) {
    super(handler, x, y, Creatures.DEFAULT_CREATURE_WIDTH, Creatures.DEFAULT_CREATURE_HEIGHT);

    bounds.x = 32;
    bounds.y = 32;
    bounds.width = 92;
    bounds.height = 96;

    //Animations
    animRight = new Animation(100, Assets.DerpDino_right);
    animLeft  = new Animation(100, Assets.DerpDino_left);
}

@Override
public void tick() {

    //Animations
    animRight.tick();
    animLeft.tick();
    //Movement
    getInput();
    move();
    handler.getGameCamera().centerOnEntity(this);

}

@SuppressWarnings("unused")
private void Dead(){
   //what to put in here
}

private void getInput(){
    xMove = 6;
    //Gravity
    yMove = 6;
    MinHeight = 0;

    if(handler.getKeyManager().left)
        xMove = -speed;
    if(handler.getKeyManager().right)
        xMove = speed;
    if(handler.getKeyManager().jumping)
        //this makes my player fly
        yMove = -speed;
}

@Override
public void render(Graphics g) {
    g.drawImage(getCurrentAnimationFrame(), (int) (x - handler.getGameCamera().getxOffset()), (int) (y -handler.getGameCamera().getyOffset()), width, height, null);    


private BufferedImage getCurrentAnimationFrame(){
    if(xMove < 0){
        return animLeft.getCurrentFrame();
    }else{
        return animRight.getCurrentFrame();
    }
}

}

Tile类(isSolid()所在的位置)

import java.awt.Graphics;
import java.awt.image.BufferedImage;

public class Tile {

//STATIC STUFF HERE

public static Tile[] tiles = new Tile[256];
public static Tile grassTile = new GrassTile(0);
public static Tile cactusTile = new CactusTile(1);
public static Tile dirtTile = new DirtTile(2);
public static Tile skyTile = new SkyTile(3);
public static Tile cloudTile = new CloudTile(4);
public static Tile caveTile = new CaveTile(5);
public static Tile stoneTile = new StoneTile(6);

//CLASS

public static final int TILEWIDTH = 128, TILEHEIGHT = 128;

protected BufferedImage texture;
protected final int id;

public Tile(BufferedImage texture, int id){
    this.texture = texture;
    this.id = id;

    tiles[id] = this;
}

public void tick(){

}

public void render(Graphics g, int x, int y){
    g.drawImage(texture, x, y, TILEWIDTH, TILEHEIGHT, null);
}

//HERE!!
public boolean isSolid(){
    return false;
}

public int getId(){
    return id;
}

}

共有2个答案

盖诚
2023-03-14

得到了答案!!!我刚刚添加了State.setstate(menustate),如果我的播放器与块冲突,在我的代码中找到//。

public boolean moveX(){
    if(xMove > 0){//Moving right
        int tx = (int) (x + xMove + bounds.x + bounds.width) / Tile.TILEWIDTH;

        if(!collisionWithTile(tx, (int) (y + bounds.y) / Tile.TILEHEIGHT) &&
                !collisionWithTile(tx, (int) (y + bounds.y + bounds.height) / Tile.TILEHEIGHT)){
            x += xMove;
        }else{
            x = tx * Tile.TILEWIDTH - bounds.x - bounds.width - 1;
            State.setState(handler.getGame().menuState);//here!!!
        }

    }else if(xMove < 0){//Moving left
        int tx = (int) (x + xMove + bounds.x) / Tile.TILEWIDTH;

        if(!collisionWithTile(tx, (int) (y + bounds.y) / Tile.TILEHEIGHT) &&
                !collisionWithTile(tx, (int) (y + bounds.y + bounds.height) / Tile.TILEHEIGHT)){
            x += xMove;
        }else{
            x = tx * Tile.TILEWIDTH + Tile.TILEWIDTH - bounds.x;
            State.setState(handler.getGame().menuState);//here!!!
        }
    }
    return false;
}

public boolean moveY(){
    if(yMove < 0){//Up
        int ty = (int) (y + yMove + bounds.y) / Tile.TILEHEIGHT;

        if(!collisionWithTile((int) (x + bounds.x) / Tile.TILEWIDTH, ty) &&
                !collisionWithTile((int) (x + bounds.x + bounds.width) /     Tile.TILEWIDTH, ty)){
            y += yMove;
        }else{
            y = ty * Tile.TILEHEIGHT + Tile.TILEHEIGHT - bounds.y;
            State.setState(handler.getGame().menuState);//here!!!
        }
锺离明煦
2023-03-14

你必须创建一个名为STATE的枚举,它将包含并处理你的游戏状态。

public enum STATE {GAME, MENU};
public STATE state = STATE.GAME;

在游戏循环中,必须实现if语句。

if (state == STATE.GAME) {
    // game logic here
} else if (state == STATE.MENU) {
    // menu logic here
}

也不要忘记在图形中添加这些,当状态设置为“游戏”时应该渲染什么,当设置为“菜单”时应该渲染什么。

那么你应该打电话:

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

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

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

  • 我已经尝试添加冲突检测一段时间了,但似乎做不到... 要绘制地图,我只需使用x,y坐标: 使用这种方法,我想出了这种检测: 我一直在尝试使用for循环遍历树来检测玩家(一个矩形)是否穿过树,但我想不出任何东西。 我已经试过了 如果碰撞=true,player.update(碰撞)将矩形更改为红色,如果为false,将矩形变为黑色。 我已尝试使用for和if,例如: 等但这不起作用,它只适用于wit

  • 所以我试图用Python和Pyplay创建一个益智平台游戏,但是我遇到了一点麻烦。当我为主要角色使用单点图像,而不是矩形图像时,如何制作碰撞检测器?我知道直角图像有左、右、顶部和底部像素功能(这对冲突检测非常有用),但是对于单片图像有这样的功能吗?或者我只需要为x和y坐标创建一个变量图像的宽度/高度?我试过用那个 但是catImg一直在通过窗户的尽头。我做错了什么?提前谢谢。

  • 我有一些关于碰撞角度的问题。我正在尝试为一个游戏编写物理代码,我不想使用任何第三方库,实际上我想自己编写每一个东西。我知道如何检测两个球体之间的碰撞,但我不知道如何找到两个球体之间的碰撞/斥力角。我试过扭转物体的方向,但没有成功。如果你把我链接到一个有趣的.pdf文件教物理编程,那将是非常好的。