2014-11-05 208 views
0

我正在開發俄羅斯方塊遊戲,我已經開始了碰撞部分。目前第一條線正常工作,碰撞做到了它應該做的。當我得到第二行時,它停止工作..我仍然將矩形添加到數組中,代碼中沒有任何錯誤。我一直在使用調試器,但我找不到問題。這是我做過的第一個編程項目。現在已經學習了3個月的Java,所以這肯定是一個小問題。這是我的創建和渲染方法。謝謝你的閱讀。Java libGDX俄羅斯方塊碰撞

@Override 
public void create() { 
    camera = new OrthographicCamera(); 
    camera.setToOrtho(false, WIDTH, HEIGHT); 
    blocks = new Array<Blocks>(); 
    boxes = new Array<Rectangle>(); 


    block = new Block(); 
} 


@Override 
public void render() { 
    Gdx.gl.glClearColor(0, 0, .2f, 1); 
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); 

    block.getRenderer().setProjectionMatrix(camera.combined); 

    block.draw(); 



    // Update 
    block.drop(Gdx.graphics.getDeltaTime()); 
    isFalling = true; 


    Rectangle box = block.getBox(); 

    // Collision 
    for(Rectangle r: boxes) { 
     if(box.overlaps(r)) { 
      isFalling = false; 
      System.out.println("collision"); 
      block.setY(r.height); 
      boxes.add(box); 
      blocks.add(block); 
      System.out.println("Block added. creating new block.."); 
      block = new Block(); 
      break; 
     } 
    } 


    // Borders 
    if(box.x < 0) box.x = 0; 
    if(box.x > WIDTH - box.width) box.x = WIDTH - box.width; 
    if(box.y < 0) { 
     isFalling = false; 
     System.out.println("not falling"); 
     box.y = 0; 
     boxes.add(box); 
     blocks.add(block); 
     System.out.println("Block added. creating new block.."); 
     block = new Block(); 
    } 


    // Controls 
    if(Gdx.input.isKeyJustPressed(Keys.LEFT) && isFalling) 
     block.stepLeft(); 
    if(Gdx.input.isKeyJustPressed(Keys.RIGHT) && isFalling) 
     block.stepRight(); 
    if(Gdx.input.isKeyJustPressed(Keys.DOWN)) 
     block.setDown(); 

    for(Blocks b: blocks) { 
     b.draw(); 
    } 

} 

回答

2

俄羅斯方塊塊有謹慎的立場。它的遊戲區域高20行,10列寬。可能不需要標準的碰撞檢測。

可以例如使用與該表示上的位置處的正方形的存在布爾或整數值的二維數組:

int[][] squares = new int[20][10]; 

然後,可以使用此信息來確定是否存在衝突:

  • 只有當該動作的結果位置不會導致任何正方形與遊戲區域上已有的正方形重疊且位於遊戲區域邊界內(20行和10列)時,才應允許旋轉或移動。
  • 如果當前活動塊上的任何方塊到達最下一行或者位於同一列中,並且一行上方已經填充了正方形,則該塊已到達其最終目的地。
  • 如果屏幕第一次出現在屏幕上時,它的某些方塊已經在佔用的位置,那麼它就是遊戲結束。
  • 等等

我使用libgdx幾年前做了一個俄羅斯方塊克隆,檢查出來,如果你認爲它可以幫助你。您可以看到一些圖像here並從here獲取源代碼。澄清:當我說塊時,我的意思是一個tetromino,整個物體從頂部落下。每個俄羅斯方塊塊包含四個不同排列的方塊。

+0

好的俄羅斯方塊遊戲!看起來不錯,但是..我想我需要以我想象的方式來解決這個問題。否則,我只會複製別人的代碼,並且不會讓我成爲更好的程序員。我已經把我的項目分解成了一些小問題,每個問題都應該讓我接近完成的遊戲。目前它是我需要解決的碰撞部分。但再次感謝=) – Sociopaten 2014-11-05 12:19:03

+0

@Siopiopaten你不需要使用不同的方法,你只需要考慮別人使用的方法,而不是複製它。如果你理解這種方法,你可能會使用它(或稍微改變的版本)來解決其他問題,如果你只是複製它,你將無法再次使用這種方法。在俄羅斯方塊的情況下,「碰撞檢測」僅僅是檢查一個單元格,我的俄羅斯方塊對象是否佔用以及是否已經被其他人佔用而發生碰撞。 – Springrbua 2014-11-05 14:34:58

+0

@Sociopaten請注意,在某些情況下標準碰撞檢測可能會導致問題,例如當您嘗試在兩個方格之間的一個插槽中安裝正方形時,或者甚至在一些更常見的情況下 - 您可能會在不應該有一個。此外,我沒有發明這種方法 - 我認爲我從某處偷走了它:) – mrzli 2014-11-05 19:00:29