0

800x600pxのボード上に50x50の正方形で16x12のグリッドを正常に作成するこのコードを作成しました。ご覧のとおり、プレーヤーはプレーヤーのマウスクリックの座標に移動します。

グリッドの各正方形には、フェルト(フィールド)のオブジェクトがあり、それをロースト(ロック)することができます。フィールドロック属性が1に設定されている場合、プレーヤーはその位置に移動しないでください。

これを達成するためにプレーヤーが移動しようとしているフィールドを検出するにはどうすればよいですか?

public class SimpleGame extends BasicGame{

    private Image plane;
    private float planeX;
    private float planeY;

    public SimpleGame()
    {
        super("SpilTest");
    }

    @Override
    public void init(GameContainer gc) throws SlickException {
        plane = new Image("figur.png");
    }

    @Override
    public void update(GameContainer gc, int delta) throws SlickException {
        Input input = gc.getInput();

        if (input.isMousePressed(input.MOUSE_LEFT_BUTTON)) {
            this.planeX = input.getMouseX() - 30;
            this.planeY = input.getMouseY() - 50;
        }

    }

    public void render(GameContainer gc, Graphics g) throws SlickException {

        Felt board[][] = nytGrid();

        int distancex = 0;
        int distancey = 0;
        int counter = 0;

        for (int i=0; i < board.length ; i++) {
            for (int j=0; j < board[i].length ; j++) {                
                if (board[i][j].getLaast() == 1) {
                    g.setColor(Color.red);
                    g.fillRect(distancex, distancey, 50, 50);
                }

                distancex += 50;
                counter++;
                if (counter == 16) {
                    distancey += 50;
                    distancex = 0;
                    counter = 0;
                }
            }
        }

        g.drawImage(plane, planeX, planeY);

    }

    public static void main(String[] args) throws SlickException {

         AppGameContainer app = new AppGameContainer(new SimpleGame());

         app.setDisplayMode(800, 600, false);
         app.setTargetFrameRate(60);
         app.start();
    }

    public Felt[][] nytGrid() {

        Felt [][] board = new Felt[16][12];        

        for (int i=0; i < board.length ; i++) {
            for (int j=0; j < board[i].length ; j++) {
                int x = i;
                int y = j;
                board[i][j] = new Felt(x, y);

                if (i == 5 && j == 5) {
                    board[i][j].setLaast(1);
                }
            }
        }

        return board;
    }
}
4

2 に答える 2

0

それは簡単です!

int mx = Mouse.getX();
int my = Mouse.getY();

ただし、世界座標が得られるので、それをピクセルに変換する必要があります。

int mx = Mouse.getX();
int my = Mouse.getY() * -1 + (Window.WIDTH / 2) + 71;
于 2015-04-02T15:42:09.900 に答える
0

まず、レンダリングの代わりに init() メソッドでボードを初期化する必要があるため、フレームごとに行う必要はありません。また、グリッドの宣言を、クラスの平面、平面 X および平面 Y 宣言の隣に移動します。 .

ロックされた正方形への移動を無効にするには、最初に特定の座標の正方形がロックされているかどうかを確認するメソッドを追加します。

private boolean isLocked(int x, int y) {
    int square = board[x/50][y/50];
    if (square == 1) return true;
    else return false;
}

次に、平面座標を更新する update() メソッドの部分を変更します。漠然と次のようになります。

if (input.isMousePressed(input.MOUSE_LEFT_BUTTON)) {
        int destX = input.getMouseX() - 30;
        int destY = input.getMouseY() - 50;
        if (!isLocked(destX, destY)) {
                   this.planeX = destX;
                   this.planeY = destY;     
        }
}
于 2012-12-21T09:34:30.863 に答える