2014-02-28 49 views
2

好的,所以我正在製作遊戲的過程中,我需要碰撞才能工作。我有一個if() { } else if() {} -statement,但是他們都被稱爲。這裏是我的代碼:Java同時調用if()和else if()語句

在我的播放器類:

public Rectangle[] tileRect; 

    public void update() { 
    tileRect = new Rectangle[Level1.tiles.size()]; 
    for (int w = 0; w < Level1.tiles.size(); w++) { 
     Tile m = (Tile) Level1.tiles.get(w); 
     tileRect[w] = m.getBounds(); 
     if(tileRect[w].intersects(getRect())) { 
      System.out.println("intersecting"); 
     dy = 0; 
     } else if (!tileRect[w].intersects(getRect())){ 
      dy = 4; 
     } 
    } 
    x += dx; 
    y += dy; 

} 

public Rectangle getRect() { 

    return new Rectangle(x, y, 32, 32); 
} 

這裏是我的瓷磚類(Level1.tiles是瓷磚的ArrayList):

package level; 

import java.awt.Rectangle; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 

import javax.imageio.ImageIO; 

public class Tile extends Rectangle { 

// Defines the id of the tile, used for setting textures. 

private static final long serialVersionUID = 1L; 

public int id; 

// Location 

public int x; 
public int y; 

// Variables for the terrain sprite sheet. 

public BufferedImage image; 
public String imageLocation; 
public BufferedImage[] sprite; 
public int rows = 16; 
public int collumns = 16; 
public int width = 16; 
public int height = 16; 

public Tile(int idVal, int xPos, int yPos) { 
    x = xPos * 32; 
    y = yPos * 32; 
    id = idVal; 

    setBounds(x, y, 32, 32); 

    createImages(); 
} 

public BufferedImage getImage() { 
    return sprite[id]; 
} 

public void createImages() { 

    imageLocation = "res/tile/terrain.png"; 
    try { 
     image = ImageIO.read(new File(imageLocation)); 
    } catch (IOException e) { 
     System.out.println("Unable to find file " + imageLocation 
       + ", printing stack trace!"); 
     e.printStackTrace(); 
    } 

    sprite = new BufferedImage[rows * collumns]; 

    for (int i = 0; i < rows; i++) { 
     for (int j = 0; j < collumns; j++) { 
      sprite[(i * collumns) + j] = image.getSubimage(j * width, i 
        * height, width, height); 
     } 
    } 
} 

public int getXLoc() { 
    return x; 
} 

public int getYLoc() { 
    return y; 
} 


public void setX(int xPos) { 
    x = xPos; 
} 

public void setY(int yPos) { 
    y = yPos; 
} 

}

我在控制檯中看到「相交」信息,但玩家仍然掉下來(因爲dy = 4)。請幫忙!我一直在努力解決這一整個上午...

+7

使用調試器和跟蹤'DY的價值'。立即學習;它會在以後得到回報。 –

回答

1

如果和否則不能同時在同一時間被捕獲。

看起來你正在循環,看到一個十字路口,然後繼續循環不管。

嘗試在for循環中添加一個break命令。

if(tileRect[w].intersects(getRect())) { 
    System.out.println("intersecting"); 
    dy = 0; 
    break; 
} else if (!tileRect[w].intersects(getRect())){ 
    dy = 4; 
} 

的突破將停止你的for循環持續,你將退出循環與dy = 0;,而不是去到下一個瓷磚和改變回dy = 4;

+0

這可能工作,我現在正在測試它! – LoafOfCat

+0

我猜想這個循環是主要的遊戲循環,所以你不想突破它,因爲這會結束遊戲。 – forgivenson

+1

如果你永遠不會擺脫它的行x + = dx;和y + = dy;是相當無用的 –

0

ifelse if不能在同一運行中調用。如果if條件爲真,則任何else都不會運行(甚至不檢查)。這可能是不同的運行。調試或放置日誌以查看流程。

而且

if(tileRect[w].intersects(getRect())) { 
     System.out.println("intersecting"); 
     dy = 0; 
    } else if (!tileRect[w].intersects(getRect())){ 
     dy = 4; 
    } 

簡單得多寫爲

if(tileRect[w].intersects(getRect())) { 
     System.out.println("intersecting"); 
     dy = 0; 
    } else { 
     dy = 4; 
    } 
+0

我只用了一個其他的東西,但是做了同樣的事情。我試圖看看它是否會有所作爲。我的update()方法被稱爲每秒30次... – LoafOfCat