2014-04-03 70 views
0

我是Java新手,我有基本的編程知識。我最近開始開發一個遊戲(在教程的幫助下)。遊戲是一款RPG遊戲。它的設置使得玩家的頭像始終位於屏幕的中心,但後臺會滾動。我知道這已經被問過,但沒有一個答案對我有意義。基本上,我如何爲多個對象創建碰撞檢測?我希望它能夠讓我的球員在撞牆時停止移動。我目前已經設定了邊界的碰撞,但是如何設置房屋,牆壁等的碰撞?我的代碼副本如下。先謝謝你。另外,我正在使用Slick2D。碰撞檢測

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; 
} 
} 
+0

這是基於瓦片的? – Cruncher

+0

@Cruncher到目前爲止,它並不是基於瓷磚的。將來,我希望它成爲現實。如果您有任何建議,請成爲我的客人。我很想創造這個遊戲,所以任何和所有的幫助是值得歡迎的! – user3495101

+0

作爲參考,我正在構想像Tibia。本質上,當你移動時,你不能停止移動,直到它移動整個瓷磚。然後在那一刻,你只需要一個2d的Tile對象數組。如果你正在移動的瓷磚有tile.passable()爲真,那麼允許散步,否則失敗 – Cruncher

回答

0

在您實際角色的移動,檢查下一個位置是「空」和邊界之內(你實際上是如何實現這取決於你如何實現你的房屋和牆壁),如果它只是移動的字符是。

對於實現,您可能需要遍歷每個「對象」並檢查角色的新位置是否在其中。

+0

我打算使用.tmx文件添加平鋪地圖。你有什麼想法我將如何能夠實現這一點?謝謝。 – user3495101