2013-05-29 2 views
2

죄송합니다. 제목을 설명하는 가장 좋은 방법이 있는지 모르겠습니다. 나는 libgdx로 자바에서 팩맨 클론을 만들고있다. 지도가 렌더링되고 타일의 충돌 감지가 작동합니다. 유일한 문제는 팩맨이 무엇이든간에 계속 움직이고 있다고 가정합니다. 그가 올바르게 가고, 당신이 막히거나 밟아 버리면, 그는 멈 춥니 다. 나는 다른 것들을 잔뜩 시도하고 제대로 작동하도록 할 수 없습니다.팩맨 클론, 접근 할 수없는 방향으로 버튼을 누르면 팩맨을 계속 움직일 수 있습니까

이 내 팩맨 플레이어 클래스

package com.psillidev.pacman1; 

import com.badlogic.gdx.Gdx; 
import com.badlogic.gdx.graphics.Texture; 
import com.badlogic.gdx.graphics.g2d.SpriteBatch; 
import com.badlogic.gdx.graphics.glutils.ShapeRenderer; 
import com.badlogic.gdx.graphics.glutils.ShapeRenderer.ShapeType; 
import com.badlogic.gdx.math.Rectangle; 

public class player { 
    private static int height = 16; 
    private static int width = 16; 

    private int playerX , playerY; 
    private int direction; 
    private Texture playerTexture; 
    private boolean isAlive; 


    public player(int startX,int startY) { 
     playerTexture = new Texture(Gdx.files.internal("data/pacman.png")); 
     playerX = startX; 
     playerY = startY; 
    } 

    public void move(Map map) { 
     if (direction == 0) { 
      if (isNoTile(map,direction,getX(),getY())) { 
       setY(getY() + (int)(Gdx.graphics.getDeltaTime() + 2)); 
      } 
     } 

     if (direction ==1) { 
      if (isNoTile(map,direction,getX(),getY())) { 
       setX(getX() + (int)(Gdx.graphics.getDeltaTime() + 2)); 
      } 
     } 

     if (direction ==2) { 
      if (isNoTile(map,direction,getX(),getY())) { 
       setY(getY() - (int)(Gdx.graphics.getDeltaTime() + 2)); 
      } 
     } 

     if (direction ==3) { 
      if (isNoTile(map,direction,getX(),getY())) { 
       setX(getX() - (int)(Gdx.graphics.getDeltaTime() + 2)); 
      } 
     } 

    } 

    private boolean isNoTile(Map map, int dir, int translated_x, int translated_y) { 
     System.out.println("X: " + translated_x + " Y: " + translated_y); 
     for (Rectangle r : map.getBlockedTiles()) { 

      switch (dir) { 
      case 0: 
       Rectangle up = new Rectangle(translated_x,translated_y + 2 , 16, 16); 

       if (up.overlaps(r)) { 

        return false; 

       } 
       break; 

      case 1: 
       Rectangle right = new Rectangle(translated_x+2,translated_y, 16, 16); 
       if (right.overlaps(r)) { 
        return false; 
       } 
       break; 

      case 2: 
       Rectangle down = new Rectangle(translated_x,translated_y - 2, 16, 16); 
       if (down.overlaps(r)) { 
        return false; 
       } 
       break; 

      case 3: 
       Rectangle left = new Rectangle(translated_x-2,translated_y, 16, 16); 
       if (left.overlaps(r)) { 
        return false; 
       } 
       break; 

      default: 
       break; 
      } 
     } 

     return true; 
    } 

    public void render(SpriteBatch batch) { 
     batch.draw(playerTexture, playerX, playerY); 
    } 

    public int getX() { 
     return playerX; 
    } 

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

    public int getY() { 
     return playerY; 
    } 

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

    public int getDirection() { 
     return direction; 
    } 

    public void setDirection(int dir) { 

     direction = dir; 
    } 

    public Rectangle getRect() { 
     return new Rectangle(playerX,playerY,width,height); 
    } 
} 
+0

할 필요가있다. 그렇지 않으면 계속 이동합니다. – wisemann

답변

1

나는 당신이 제공 한 코드에서 대답 할 수없는,하지만 내 제안은 당신이 당신의 KeyListener 클래스에 조정을 할 필요가있다. 나는 당신이 화살표 키를 누르는 사용자를 청취하고있는 KeyListener을 가지고 있다고 가정하고있다. 키를 누를 때 Pacman.setDirection()과 같은 것을하고 있습니까?

setDirection()에 전화하기 전에 방향이 유효한지 여부를 실제로 확인해야합니다. 그래서 KeyListener의 코드는 방향이 유효한 경우

  1. 는 사용자가 위로, 아래로, 누르면 왼쪽 또는 오른쪽으로
  2. 확인이 게임 그리드 /지도보고 여부를 결정합니다 ...이 같은 것 팩맨의 현재 위치를 기준으로
  3. 방향이 유효한 경우 setDirection()으로 전화하십시오. 그렇지 않다면 아무 것도하지 마십시오. 팩맨은 현재 방향으로 계속됩니다.
0

이것은 실제로 플레이어 자체에서 처리해서는 안되지만 운동 관리자가 처리해야하므로 게임을 쉽게 테스트/확장 할 수 있습니다. 코드에서 입력이 결정한 방향으로 만 빈 타일로 이동할 수 있도록 허용하므로 오른쪽이 무엇인지에 관계없이 UP이 벽 인 경우 오른쪽으로 이동할 때 UP 키를 누르면 자동으로 이동이 중지됩니다.

은 당신이 할 수있는 것은 입력에 : 최대가 비어있는 경우, 이동 확인 요청이있을 경우 최대 그때 그가 이전에 이동 된 방향으로 이동 유지 비어 있지 않은 경우, 다음, 이동. 다른 방향에도 동일합니다.

0

당신의 setDirection 방법이 잘못 그것은 당신이 팩맨 다른 타일을 올 때 방향을 처리해야

public void setDirection(int dir) { 
    // only change direction if we can. 
    if (isValidDirection(dir)){ 
     direction = dir; 
    } 
} 
관련 문제