在 java 游戏中为多个实体设置方向时出现问题
Problem with setting a direction for multiple entitys in a java game
我不想给我所有的神灵实体一个随机的方向,但我不知道如何
我已经设法将所有实体的方向设置为以 X 步或 Y 步移动,但这是静态移动,是否可以随机移动它们?也许通过使用某种计时器?
private GameScreen gs;
private boolean gameRunning = true;
private int fps;
private Entity player;
private ArrayList<Entity> entityList = new ArrayList<>();
private HashMap<String, Boolean> keyDown = new HashMap<>();
public void loadObjects() {
Image playerImg = new ImageIcon(getClass().getResource("/playerImg.png")).getImage();
Image gostImg = new ImageIcon(getClass().getResource("/gostImg.png")).getImage();
player = new Entity(playerImg, 100, 200, 200);
entityList.add(player);
entityList.add(new Entity(gostImg, 224, 350, 60));
entityList.add(new Entity(gostImg, 460, 250, 60));
entityList.add(new Entity(gostImg, 624, 300, 60));
entityList.add(new Entity(gostImg, 942, 550, 60));
entityList.add(new Entity(gostImg, 520, 560, 60));
}
public void update(long deltaTime) {
checkCollisionandRemove();
if(keyDown.get("right")) {
player.setDirectionX(1);
player.setDirectionY(0);
}
else if(keyDown.get("left")){
player.setDirectionX(-1);
player.setDirectionY(0);
}
if(keyDown.get("up")) {
player.setDirectionY(-1);
player.setDirectionX(0);
}
else if(keyDown.get("down")) {
player.setDirectionY(1);
player.setDirectionX(0);
}
if(player.getX() < 0) {
player.setX(0);
}
if(player.getX() > gs.getWidth() - player.getWidth()) {
player.setX(gs.getWidth() - player.getWidth());
}
if(player.getY() < 0) {
player.setY(0);
}
if(player.getY() > gs.getHeight() - player.getHeight()) {
player.setY(gs.getHeight() - player.getHeight());
}
for(Entity entity : entityList) {
entity.moveX(deltaTime);
entity.moveY(deltaTime);
entity.setDirectionX(1);
if(entity.equals(player)) {
player.setDirectionX(0);
player.setDirectionY(0);
}
if(entity.getX() < 0){
entity.setX(0);
}
if(entity.getX() > gs.getWidth() - entity.getWidth()) {
entity.setX(gs.getWidth() - entity.getWidth());
}
if(entity.getY() < 0) {
entity.setY(0);
}
if(entity.getY() > gs.getHeight() - entity.getHeight()) {
entity.setY(gs.getHeight() - player.getHeight());
}
}
player.moveX(deltaTime);
player.moveY(deltaTime);
}
我不希望我的实体有一个随机方向而不是一个静态方向。
所以你有一些问题。第一个是您有一个定义为全局变量的 "gost" 对象。然后多次设置它的值并将其添加到 ArrayList。我的假设是您的列表中只有一个 gost。
这是您的代码,稍作修改。我没有测试任何这些,但试一试。
private GameScreen gs;
private boolean gameRunning = true;
private int fps;
private Entity player;
//private Entity gost; Removed because I don't think you need this.
private ArrayList<Entity> entityList = new ArrayList<>();
private HashMap<String, Boolean> keyDown = new HashMap<>();
public void loadObjects() {
Image playerImg = new ImageIcon(getClass().getResource("/playerImg.png")).getImage();
Image gostImg = new ImageIcon(getClass().getResource("/gostImg.png")).getImage();
player = new Entity(playerImg, 100, 200, 200);
//entityList.add(player); I don't think you need this either, unless you check all of your entities in your checkCollisionandRemove() method
//Create your "Gost" entities this way.
entityList.add(new Entity(gostImg, 224, 350, 10));
entityList.add(new Entity(gostImg, 460, 20, 10));
entityList.add(new Entity(gostImg, 624, 300, 10));
entityList.add(new Entity(gostImg, 942, 550, 20));
entityList.add(new Entity(gostImg, 520, 760, 30));
}
public void update(long deltaTime) {
checkCollisionandRemove();
if(keyDown.get("right")) {
player.setDirectionX(1);
player.setDirectionY(0);
}
else if(keyDown.get("left")){
player.setDirectionX(-1);
player.setDirectionY(0);
}
if(keyDown.get("up")) {
player.setDirectionY(-1);
player.setDirectionX(0);
}
else if(keyDown.get("down")) {
player.setDirectionY(1);
player.setDirectionX(0);
}
if(player.getX() < 0) {
player.setX(0);
}
if(player.getX() > gs.getWidth() - player.getWidth()) {
player.setX(gs.getWidth() - player.getWidth());
}
if(player.getY() < 0) {
player.setY(0);
}
if(player.getY() > gs.getHeight() - player.getHeight()) {
player.setY(gs.getHeight() - player.getHeight());
}
player.moveX(deltaTime);
player.moveY(deltaTime);
//Move each gost this way.
for(Entity entity : entityList) {
/*
If you need to include your player object into the entity list you will need a way to tell whether entity is a gost or player.
Something like: if(entity.getType().equalsIgnoreCase("gost")) then move
*/
entity.moveX(deltaTime);
entity.moveY(deltaTime);
}
}
我不想给我所有的神灵实体一个随机的方向,但我不知道如何
我已经设法将所有实体的方向设置为以 X 步或 Y 步移动,但这是静态移动,是否可以随机移动它们?也许通过使用某种计时器?
private GameScreen gs;
private boolean gameRunning = true;
private int fps;
private Entity player;
private ArrayList<Entity> entityList = new ArrayList<>();
private HashMap<String, Boolean> keyDown = new HashMap<>();
public void loadObjects() {
Image playerImg = new ImageIcon(getClass().getResource("/playerImg.png")).getImage();
Image gostImg = new ImageIcon(getClass().getResource("/gostImg.png")).getImage();
player = new Entity(playerImg, 100, 200, 200);
entityList.add(player);
entityList.add(new Entity(gostImg, 224, 350, 60));
entityList.add(new Entity(gostImg, 460, 250, 60));
entityList.add(new Entity(gostImg, 624, 300, 60));
entityList.add(new Entity(gostImg, 942, 550, 60));
entityList.add(new Entity(gostImg, 520, 560, 60));
}
public void update(long deltaTime) {
checkCollisionandRemove();
if(keyDown.get("right")) {
player.setDirectionX(1);
player.setDirectionY(0);
}
else if(keyDown.get("left")){
player.setDirectionX(-1);
player.setDirectionY(0);
}
if(keyDown.get("up")) {
player.setDirectionY(-1);
player.setDirectionX(0);
}
else if(keyDown.get("down")) {
player.setDirectionY(1);
player.setDirectionX(0);
}
if(player.getX() < 0) {
player.setX(0);
}
if(player.getX() > gs.getWidth() - player.getWidth()) {
player.setX(gs.getWidth() - player.getWidth());
}
if(player.getY() < 0) {
player.setY(0);
}
if(player.getY() > gs.getHeight() - player.getHeight()) {
player.setY(gs.getHeight() - player.getHeight());
}
for(Entity entity : entityList) {
entity.moveX(deltaTime);
entity.moveY(deltaTime);
entity.setDirectionX(1);
if(entity.equals(player)) {
player.setDirectionX(0);
player.setDirectionY(0);
}
if(entity.getX() < 0){
entity.setX(0);
}
if(entity.getX() > gs.getWidth() - entity.getWidth()) {
entity.setX(gs.getWidth() - entity.getWidth());
}
if(entity.getY() < 0) {
entity.setY(0);
}
if(entity.getY() > gs.getHeight() - entity.getHeight()) {
entity.setY(gs.getHeight() - player.getHeight());
}
}
player.moveX(deltaTime);
player.moveY(deltaTime);
}
我不希望我的实体有一个随机方向而不是一个静态方向。
所以你有一些问题。第一个是您有一个定义为全局变量的 "gost" 对象。然后多次设置它的值并将其添加到 ArrayList。我的假设是您的列表中只有一个 gost。
这是您的代码,稍作修改。我没有测试任何这些,但试一试。
private GameScreen gs;
private boolean gameRunning = true;
private int fps;
private Entity player;
//private Entity gost; Removed because I don't think you need this.
private ArrayList<Entity> entityList = new ArrayList<>();
private HashMap<String, Boolean> keyDown = new HashMap<>();
public void loadObjects() {
Image playerImg = new ImageIcon(getClass().getResource("/playerImg.png")).getImage();
Image gostImg = new ImageIcon(getClass().getResource("/gostImg.png")).getImage();
player = new Entity(playerImg, 100, 200, 200);
//entityList.add(player); I don't think you need this either, unless you check all of your entities in your checkCollisionandRemove() method
//Create your "Gost" entities this way.
entityList.add(new Entity(gostImg, 224, 350, 10));
entityList.add(new Entity(gostImg, 460, 20, 10));
entityList.add(new Entity(gostImg, 624, 300, 10));
entityList.add(new Entity(gostImg, 942, 550, 20));
entityList.add(new Entity(gostImg, 520, 760, 30));
}
public void update(long deltaTime) {
checkCollisionandRemove();
if(keyDown.get("right")) {
player.setDirectionX(1);
player.setDirectionY(0);
}
else if(keyDown.get("left")){
player.setDirectionX(-1);
player.setDirectionY(0);
}
if(keyDown.get("up")) {
player.setDirectionY(-1);
player.setDirectionX(0);
}
else if(keyDown.get("down")) {
player.setDirectionY(1);
player.setDirectionX(0);
}
if(player.getX() < 0) {
player.setX(0);
}
if(player.getX() > gs.getWidth() - player.getWidth()) {
player.setX(gs.getWidth() - player.getWidth());
}
if(player.getY() < 0) {
player.setY(0);
}
if(player.getY() > gs.getHeight() - player.getHeight()) {
player.setY(gs.getHeight() - player.getHeight());
}
player.moveX(deltaTime);
player.moveY(deltaTime);
//Move each gost this way.
for(Entity entity : entityList) {
/*
If you need to include your player object into the entity list you will need a way to tell whether entity is a gost or player.
Something like: if(entity.getType().equalsIgnoreCase("gost")) then move
*/
entity.moveX(deltaTime);
entity.moveY(deltaTime);
}
}