2016-12-23 21 views
-1

2Dタイルゲーム(Slg2Dのlibgdxなし)を構築するのが楽しいです。私は15時間以上もかけて衝突に取り組んでいます。私はそれが質問をする時間だと思う。私はたくさん検索しましたが、私が検索したものには本当に反応しません。 (プレイヤーが中に歩いてすることはできませんでしたされて暗いタイル)2D game captureAnother 2D game captureJava - 2Dタイルゲームの検出衝突

矩形は衝突が発生する可能性がありました、次のとおりです。

だから、これはどのように見えるかです。彼らが衝突すると、まだタイルにロックされるだけで十分に動いています。 (もう何もできません)

私のクラスは、入力ハンドラ、更新と描画によって呼び出されます。 3つは「演奏」クラスで演奏されます。誰がただ物事を更新する。 (Player.MoveUp()、Player.draw、...)

  • "WorldManagerは" タイルが管理されている場合、それらとのgetType(の(唯一の4)は、それがブロックされていた場合にルックアップするためにあります(0有効、1ブロック)

  • "LevelGeneration"はレベル、タイルの位置とそのIDが (int [] [])でマップされている場所です(彼はOKです。私は
    を表示しています)。

  • AssetManagerは、スプライトシートをカットして、 BufferedImageのen

  • タイルサイズは50、プレーヤーは41x36です。

  • 私はmouvementsの自由(4辺が8 mouvements側を作るために)とアンカーポイントを持つようにしたいので、私は問題があるので、ここで左上側に

ように見えるが(私のクラスであります輸入品とパッケージなし):

public class Player { 

public static double SPEED; 
public static int WIDTH, HEIGHT; 
public static float XPos, YPos; 
public static float destXPos, destYPos; 

public static BufferedImage presentImage; 
public static int[] position; 
public static boolean moving; 
public static boolean movementlock; 
public static int side; // 0 up 1 right 2 down 3 left 
public static Rectangle p = null; 
public static Rectangle e = null; 
private static boolean mouvementlock; 
private static boolean collision; 

public static void CreateHero(){ 
    // Valeurs de test 
    position = new int[2]; 
    SPEED = 1; 
    XPos = destXPos = 100; 
    YPos = destYPos = 100; 
    presentImage = AssetManager.Player[0][0]; 
    moving = false; 
    movementlock = false; 
    collision = false; 

    position[0] = (int) (XPos/WorldManager.TileSize); 
    position[1] = (int) (YPos/WorldManager.TileSize); 

} 

public static void MoveUp(){ 
    side = 0; 
    destYPos -= SPEED; 
    moving = ValidateNextPosition(); 
} 
public static void MoveRight(){ 
    side = 1; 
    destXPos += SPEED; 
    moving = ValidateNextPosition(); 
} 

public static void MoveDown(){ 
    side = 2; 
    destYPos += SPEED; 
    moving = ValidateNextPosition(); 
} 

public static void MoveLeft(){ 
    side = 3; 
    destXPos -= SPEED; 
    moving = ValidateNextPosition(); 
} 

static void updateMovement(){ 
    if(moving == true && mouvementlock == false){ 
     mouvementlock = true; 
     System.out.println("Mouvement"); 
     System.out.println("X : " + XPos); 
     System.out.println("Y : " + YPos); 
     XPos = destXPos; 
     YPos = destYPos; 
     System.out.println("Xdest : " + destXPos); 
     System.out.println("Ydest : " + destYPos); 
     System.out.println("" + moving); 
     moving = false; 
     mouvementlock = false;} 
    else{ 
     destXPos = XPos; 
     destYPos = YPos; 
    } 
} 


public static boolean ValidateNextPosition(){ 
    if(moving) return false; 
    if(collision) return false; 

    p = new Rectangle((int) XPos, (int) YPos, presentImage.getWidth(null),presentImage.getHeight(null)); 
    int tileid = 0; 
    boolean validate = true; 
    int destpos[] = new int[2]; 
    double TileCollision[] = new double[2]; 
    destpos[0] = (int) destXPos/WorldManager.TileSize; 
    destpos[1] = (int) destYPos/WorldManager.TileSize; 
    TileCollision[0] = 0; 
    TileCollision[1] = 0; 


    if(side == 0 && collision != true){ 
     if(destpos[1] - 1 > 0){ 
      tileid = LevelGenerator.getIdmap()[destpos[0]][destpos[1] - 1]; 
      if(destYPos + 1 < 0 || WorldManager.Tuiles[tileid].getType() == 1){ 
       destpos[1] -= 1;collision = true;}} 
    } 
    if(side == 1 && collision != true){ 
     tileid = LevelGenerator.getIdmap()[destpos[0] + 1][destpos[1]]; 
     if(destXPos + 1 < 0 || WorldManager.Tuiles[tileid].getType() == 1){ 
      destpos[0] += 1;collision = true;} 
    } 
    if(side == 2 && collision != true){ 
     tileid = LevelGenerator.getIdmap()[destpos[0]][destpos[1] + 1]; 
     if(destYPos - 1 < 0 || WorldManager.Tuiles[tileid].getType() == 1){ 
      destpos[1] += 1;collision = true;} 
    } 
    if(side == 3 && collision != true){ 
     tileid = LevelGenerator.getIdmap()[destpos[0]][destpos[1]]; 
     if(destXPos - 1 < 0 || WorldManager.Tuiles[tileid].getType() == 1){ 
      /*destpos[0] -= 1*/;collision = true;} 
    } 
    if (collision == true){ 
     TileCollision[0] = LevelGenerator.getPosmap()[destpos[0]][destpos[1]][0]; 
     TileCollision[1] = LevelGenerator.getPosmap()[destpos[0]][destpos[1]][1]; 
     e = new Rectangle((int) TileCollision[0], (int) TileCollision[1],WorldManager.TileSize,WorldManager.TileSize);} 

    if(e != null && p.intersects(e)){ 
     validate = false; 
     System.out.println("collision");} 

    return validate; 
} 


public static void update() { 
    updateMovement(); 
} 

public static void draw(Graphics2D g) { 
    g.drawImage(presentImage,(int) XPos,(int) YPos,presentImage.getWidth(null),presentImage.getWidth(null),null); 
    if(p != null){ 
     g.setColor(Color.BLACK); 
     g.drawRect(p.x, p.y, p.width, p.height);} 
    if(e != null){ 
     g.setColor(Color.BLACK); 
     g.drawRect(e.x, e.y, e.width, e.height);} 
    } 

} 

再開するには、

  1. 衝突が遅すぎる起こるとプレーヤーはブロックされたブロックに詰まります。
  2. 時々それはそれを通過する(私が思う)左上がブロックを打つことはない。
  3. それは問題なくマップの外に行くことができますし、それがクラッシュしたが、私が試したすべてのものは、ゲーム

をクラッシュ保つありがとうございましたし、素敵な一日

を持ってHell'no

(PS:英語は第三者の言語ですので、完全に理解できない場合は質問してください)

+0

なぜあなたのゲームを修正したいですか?なぜあなたは問題を選んでそれに集中しているのですか? – gpasch

答えて

0

collisionがtrueに設定され、ValidateNextPositionメソッドがfalseを返すと、collision (そしてmoving変数の拡張子)は、if(collision) return falseという文が一番上にあるため、再度切り替えることはできません。

+0

こんにちは、私はちょうど試して、プレーヤーは再び壁にこだわってしまいます。別の提案がありますか? –