首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >碰撞检测

碰撞检测
EN

Stack Overflow用户
提问于 2014-04-04 02:52:57
回答 1查看 214关注 0票数 0

我是Java新手,而且我有基本的编程知识。我最近开始开发一个游戏(在教程的帮助下)。这个游戏是一个RPG。它的设置使得玩家的头像始终位于屏幕的中心,但背景会滚动。我知道以前有人问过这个问题,但对我来说没有一个答案是有意义的。基本上,我如何为多个对象创建碰撞检测?我希望它是这样的,这样我的球员在撞到墙时就停止移动。我目前为边界设置了碰撞,但是如何为房屋、墙等设置碰撞?下面是我的代码副本。提前谢谢你。另外,我使用的是Slick2D。

代码语言:javascript
复制
package javagame;

import org.newdawn.slick.*;
import org.newdawn.slick.geom.Rectangle;
import org.newdawn.slick.state.*;
//Need "extends etc." for creating basic screen/state
public class Play extends BasicGameState{

public Rectangle lake1;

Animation avatar, movingUp, movingDown, movingLeft,  movingRight;
Image worldMap;
boolean quit = false;
int[] duration = {200,200};
float avatarPositionX = 0;
float avatarPositionY = 0;
float shiftX = avatarPositionX + 250;
float shiftY = avatarPositionY + 180;

public Play(int state){
}

public void init(GameContainer gc, StateBasedGame sbg) throws SlickException{   
    worldMap = new Image("res/WaterMap.png");
    Image[] walkUp = {new Image("res/CharBack.png"), new 
Image("res/CharBack.png")};
    Image[] walkDown = {new Image("res/CharFront.png"), new 
Image("res/CharFront.png")};
    Image[] walkLeft = {new Image("res/CharLeft.png"), new  
Image("res/CharLeft.png")};
    Image[] walkRight = {new Image("res/CharRight.png"), new
Image("res/CharRight.png")};

    movingUp = new Animation(walkUp, duration, false);
    movingDown = new Animation(walkDown, duration, false);
    movingLeft = new Animation(walkLeft, duration, false);
    movingRight = new Animation(walkRight, duration, false);
    avatar = movingDown;
}
//Takes gc and StateBasedGame and Graphics
public void render(GameContainer gc, StateBasedGame sbg, Graphics g) throws    
SlickException{
    lake1 = new Rectangle(132, 277, 87, 54);
    worldMap.draw(avatarPositionX, avatarPositionY);
    avatar.draw(shiftX, shiftY);
    g.drawString("Your X: "+avatarPositionX+"\nYour Y: "+avatarPositionY, 350,  
20);

    if(quit==true){
        g.drawString("Resume (R)", 200, 100);
        g.drawString("Main Menu (M)", 200, 150);
        g.drawString("Quit (Q)", 200, 200);
        if(quit==false){
            g.clear();
        }
    }
}
//Updates images on screen; creates animation
public void update(GameContainer gc, StateBasedGame sbg, int delta) throws   
SlickException{
    Input input = gc.getInput();
    //up
    if(input.isKeyDown(Input.KEY_UP)){
        avatar = movingUp;
        avatarPositionY += delta * .1f;
        //+= changed to -=
        if(avatarPositionY>180){
            avatarPositionY -= delta * .1f;
        }
    }
    //down
    if(input.isKeyDown(Input.KEY_DOWN)){
        avatar = movingDown;
        avatarPositionY -= delta * .1f;
        if(avatarPositionY<-497){
            avatarPositionY += delta * .1f;
        }
    }
    //left
    if(input.isKeyDown(Input.KEY_LEFT)){
        avatar = movingLeft;
        avatarPositionX += delta * .1f;
        if(avatarPositionX>249){
            avatarPositionX -= delta * .1f;
        }
    }
    //right
    if(input.isKeyDown(Input.KEY_RIGHT)){
        avatar = movingRight;
        avatarPositionX -= delta * .1f;
        if(avatarPositionX<-433){
            avatarPositionX += delta * .1f;
        }
    }
    //escape
    if(input.isKeyDown(Input.KEY_ESCAPE)){
        quit = true;
    }
    //when menu is up
    if(quit == true){
        if(input.isKeyDown(Input.KEY_R)){
            quit = false;
        }
        if(input.isKeyDown(Input.KEY_M)){
            sbg.enterState(0);
        }
        if(input.isKeyDown(Input.KEY_Q)){
            System.exit(0);
        }   
    }
}

public int getID(){
    return 1;
}
}
EN

回答 1

Stack Overflow用户

发布于 2014-04-04 03:04:52

在你实际移动角色之前,检查下一个位置是否为“空”并且在边界内(你如何实现这取决于你如何实现你的房子和墙),如果是,只移动角色。

对于实现,您可能希望遍历每个“对象”,并检查字符的新位置是否在其中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22846462

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档