我正在创建一个Java游戏,用户可以在其中输入up
,left
,right
或down
的命令来移动该位置的角色一定数量的像素。在Player
类中,我在按下开始按钮后,在ArrayList
JTextField
个for
内收到用户发出的命令。然后,我使用x
循环遍历用户的所有输入,并在y
和{{1}的多维数组中创建x
和y
个目标玩家需要移动的距离。最后,我有一个名为updatePosition()
的函数,它在主游戏循环中调用。在这个函数中,我循环遍历目标的多维数组,并有一个if
语句来检查目标是否已到达。但是,当执行此方法并且用户输入了up
和right
的命令时,角色会向上对角移动。我想要一种方法,将角色移动到用户指定的方向,一个接一个地执行它们。
以下是代码:
moveSpeed = 1;
private double moveAmt = 20;
private Double[][] targetCoordinates = null;
private ArrayList<JTextField> userInputTextFields = new ArrayList<JTextField>();
使用下面的方法,我获取用户输入命令的ArrayList
JTextFields
并将其存储在本地ArrayList
中。我还设置了Array
,其大小与用户输入命令的JTextFields
相当。此数组将用于存储x
和y
目标为了角色。然后,我最后调用moveChar();
方法,该方法将设置目标x
和y
。
public void getInputText(ArrayList<JTextField> textFields){
this.userInputTextFields = textFields;
targetCoordinates = new Double[userInputTextFields.size()][2];
moveChar();
}
此方法将检查用户已命令的命令,并在x
数组中设置y
和targetCoordinates
目标。
private void moveChar(){
for (int i = 0; i < userInputTextFields.size(); i++) {
if(userInputTextFields.get(i).getText().equals("up")){
targetCoordinates[i][0] = x;
targetCoordinates[i][1] = y - moveAmt;
} else if(userInputTextFields.get(i).getText().equals("down")){
targetCoordinates[i][0] = x;
targetCoordinates[i][1] = y + moveAmt;
} else if(userInputTextFields.get(i).getText().equals("left")){
targetCoordinates[i][0] = x - moveAmt;
targetCoordinates[i][1] = y;
} else if(userInputTextFields.get(i).getText().equals("right")){
targetCoordinates[i][0] = x + moveAmt;
targetCoordinates[i][1] = y;
}
}
}
最后,这是在主游戏循环中调用的方法。它遍历targetCoordinates
数组并检查目标是否已满足。如果没有,则相应地增加或减少角色的x
和y
位置。
public void updatePosition(){
if(targetCoordinates != null){
for (int i = 0; i < targetCoordinates.length; i++) {
if(y >= targetCoordinates[i][1]) {
moveCharacter(x, y - moveSpeed);
} else if(y < targetCoordinates[i][1]) {
moveCharacter(x, y + moveSpeed);
} else if(x > targetCoordinates[i][0]) {
moveCharacter(x - moveSpeed, y);
} else if(x <= targetCoordinates[i][0]) {
moveCharacter(x + moveSpeed, y);
}
}
}
}
答案 0 :(得分:0)
目前,您使用所有可用命令创建单个目标位置,并使用它来指导您的动作(或可能同时向所有目标位置移动)。
相反,您需要一个超出特定游戏循环的命令“漏斗”,并且仅在当前游戏完成后才会获取新命令。新命令位于顶部和底部以便完成。
这很可能看起来像这样
public class Player {
//holding commands as strings is a little bug prone, consider creating a custom class or enum
ArrayList<String> commandsHopper=new ArrayList<String>();
//replace with some sort of Vector2i as improvement
double[] targetCoOrdinates=new double[2];
public void addCommand(String command){
commandsHopper.add(command); //commands added at the top of arraylist
}
public void update(double timeSlice){
//Called once, every game loop
if (isAtTarget()){
getNextTarget();
}
moveTowardsTarget(timeSlice);
}
public void getNextTarget(){
if (commandsHopper.isEmpty()==false){
//commands used from bottom of the arraylist
targetCoOrdinates=determineTargetFromCommand(commandsHopper.get(0));
commandsHopper.remove(0); //inefficient with arraylist, consider other collections
}
}
}