【问题标题】:Pacman method for move Java libGDX用于移动 Java libGDX 的 Pacman 方法
【发布时间】:2022-01-25 16:55:07
【问题描述】:

我正在使用 Java 和 libGDX 进行 Pacman 克隆 如何让吃豆人一键移动?

这是我的移动代码,但我认为这不是最佳选择:

import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Input;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.BitmapFont;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.graphics.g2d.TextureAtlas;
import com.badlogic.gdx.graphics.g2d.TextureRegion;
import com.badlogic.gdx.math.Vector2;


public class Hero {

    private int rightBorder;
    private int leftBorder;
    private int top;
    private int bottom;

    private GameController gc;
    private float cellX;
    private float cellY;
    private TextureRegion texture;
    private float speed;

    private boolean isPressedD;
    private boolean isPressedA;
    private boolean isPressedW;
    private boolean isPressedS;

    private float offset;

    private StringBuilder stringBuilder;
    private int score;






    public Hero(TextureAtlas atlas, GameController gc){
        this.texture = atlas.findRegion("Pacman");
        this.cellX = 1;
        this.cellY = 1;
        this.speed = 5f;
        this.isPressedD = false;
        this.isPressedA = false;
        this.isPressedS = false;
        this.isPressedW = false;
        this.offset = 36;
        this.stringBuilder = new StringBuilder();
        this.score = 0;
        this.gc = gc;
        this.leftBorder = 0;
        this.rightBorder = 15;
        this.top = 8;
        this.bottom = 0;
    }

    public void update(float dt){
        movement(dt);
        checkBounds();
    }

    private void checkBounds(){
        if (cellX > rightBorder){
            cellX = rightBorder;
        }
        if (cellX < leftBorder){
            cellX = leftBorder;
        }
        if (cellY > top){
            cellY = top;
        }
        if (cellY < bottom){
            cellY = bottom;
        }

//        if (position.x > 1280 - offset){
//            position.x = 1280 - offset;
//        }
//        if (position.x < 0 + offset){
//            position.x = 0 + offset;
//        }
//        if (position.y > 720 - offset){
//            position.y = 720 - offset;
//        }
//        if (position.y < 0 + offset){
//            position.y = 0 + offset;
//        }
    }

    public void movement(float dt){
        if (Gdx.input.isKeyJustPressed(Input.Keys.D)){
            isPressedD = true;
            isPressedA = false;
            isPressedS = false;
            isPressedW = false;
        }
        if (Gdx.input.isKeyJustPressed(Input.Keys.A)){
            isPressedD = false;
            isPressedA = true;
            isPressedS = false;
            isPressedW = false;
        }
        if (Gdx.input.isKeyJustPressed(Input.Keys.S)){
            isPressedD = false;
            isPressedA = false;
            isPressedS = true;
            isPressedW = false;
        }
        if (Gdx.input.isKeyJustPressed(Input.Keys.W)){
            isPressedD = false;
            isPressedA = false;
            isPressedS = false;
            isPressedW = true;
        }
        if (isPressedA){
            cellX -= speed * dt;
        }
        if (isPressedD){
            cellX += speed * dt;
        }
        if (isPressedS){
            cellY -= speed * dt;
        }
        if (isPressedW){
            cellY += speed * dt;
        }
    }

    public void renderGUI(SpriteBatch batch, BitmapFont font){
        stringBuilder.setLength(0);
        stringBuilder.append("Score: " + score);
        font.draw(batch, stringBuilder, 10, 700);
    }

    public void render(SpriteBatch batch){
        batch.draw(texture, cellX * GameMap.CELL_SIZE, cellY * GameMap.CELL_SIZE);
    }
}

这里是直接移动方法:

public void movement(float dt){
    if (Gdx.input.isKeyJustPressed(Input.Keys.D)){
        isPressedD = true;
        isPressedA = false;
        isPressedS = false;
        isPressedW = false;
    }
    if (Gdx.input.isKeyJustPressed(Input.Keys.A)){
        isPressedD = false;
        isPressedA = true;
        isPressedS = false;
        isPressedW = false;
    }
    if (Gdx.input.isKeyJustPressed(Input.Keys.S)){
        isPressedD = false;
        isPressedA = false;
        isPressedS = true;
        isPressedW = false;
    }
    if (Gdx.input.isKeyJustPressed(Input.Keys.W)){
        isPressedD = false;
        isPressedA = false;
        isPressedS = false;
        isPressedW = true;
    }
    if (isPressedA){
        cellX -= speed * dt;
    }
    if (isPressedD){
        cellX += speed * dt;
    }
    if (isPressedS){
        cellY -= speed * dt;
    }
    if (isPressedW){
        cellY += speed * dt;
    }
}

它正在工作,但我无法检查与墙壁的碰撞。

如何改变移动方式?

我需要按下按钮并立即释放。

【问题讨论】:

  • 请编辑问题以将其限制为具有足够详细信息的特定问题,以确定适当的答案。

标签: java libgdx


【解决方案1】:

无需创建布尔值然后对其进行检查。只需检查是否按下了键,然后将代码放入该 if 语句中。

import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Input;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.BitmapFont;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.graphics.g2d.TextureAtlas;
import com.badlogic.gdx.graphics.g2d.TextureRegion;
import com.badlogic.gdx.math.Vector2;


public class Hero {

    private int rightBorder;
    private int leftBorder;
    private int top;
    private int bottom;

    private GameController gc;
    private float cellX;
    private float cellY;
    private TextureRegion texture;
    private float speed;

    private float offset;

    private StringBuilder stringBuilder;
    private int score;

   
    public Hero(TextureAtlas atlas, GameController gc){
        this.texture = atlas.findRegion("Pacman");
        this.cellX = 1;
        this.cellY = 1;
        this.speed = 5f;
        this.offset = 36;
        this.stringBuilder = new StringBuilder();
        this.score = 0;
        this.gc = gc;
        this.leftBorder = 0;
        this.rightBorder = 15;
        this.top = 8;
        this.bottom = 0;
    }

    public void update(float dt){
        movement(dt);
        checkBounds();
    }

    private void checkBounds(){
        if (cellX > rightBorder){
            cellX = rightBorder;
        }
        if (cellX < leftBorder){
            cellX = leftBorder;
        }
        if (cellY > top){
            cellY = top;
        }
        if (cellY < bottom){
            cellY = bottom;
        }

//        if (position.x > 1280 - offset){
//            position.x = 1280 - offset;
//        }
//        if (position.x < 0 + offset){
//            position.x = 0 + offset;
//        }
//        if (position.y > 720 - offset){
//            position.y = 720 - offset;
//        }
//        if (position.y < 0 + offset){
//            position.y = 0 + offset;
//        }
    }

    public void movement(float dt){
        if (Gdx.input.isButtonPressed(Input.Keys.D)){
            cellX += speed * dt;
        }
        else if (Gdx.input.isButtonPressed(Input.Keys.A)){
            cellX -= speed * dt;
        }
        else if (Gdx.input.isButtonPressed(Input.Keys.S)){
            cellY -= speed * dt;
        }
        else if (Gdx.input.isButtonPressed(Input.Keys.W)){
            cellY += speed * dt;
        }
    }

    public void renderGUI(SpriteBatch batch, BitmapFont font){
        stringBuilder.setLength(0);
        stringBuilder.append("Score: " + score);
        font.draw(batch, stringBuilder, 10, 700);
    }

    public void render(SpriteBatch batch){
        batch.draw(texture, cellX * GameMap.CELL_SIZE, cellY * GameMap.CELL_SIZE);
    }
}

【讨论】:

猜你喜欢
  • 2015-03-31
  • 2014-09-14
  • 2014-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多