Я смотрел на эту проблему весь день, и я не могу понять, что происходит.По сути, у меня есть 2 класса, один - JFrame
, а другой - просто игровой цикл.Класс JFrame
должен изменять некоторые переменные в зависимости от того, что нажимает пользователь.
Однако при нажатии на кнопку методы не изменяют никакие переменные.Единственный способ изменить переменную в моем JFrame
- это вызвать в ней метод из моего вызывающего класса.
Вот пример соответствующего кода.
public class CMBBattle {
public void startCombat (object.PlayerVariables p1Char1, object.PlayerVariables p1Char2, object.PlayerVariables p1Char3){
boolean status;
int teamMovesLeft = 0;
Battle battle = new Battle(p1Char1, p1Char2, p1Char3);
status = battle.combatStatus();
teamMovesLeft = battle.getMovesLeft();
while (status == true){
teamMovesLeft = battle.getMovesLeft();
if (teamMovesLeft <= 0){
battle.createBattleOrder();
battle.doBattle();
}
status = battle.combatStatus();
if(status == true){
battle.newRound();
}
}
}
public class Battle extends JFrame implements MouseListener {
private String currentCharacter;
private void characterOrders(String userChoice, String playerHit){
int playerAttacker = 0;
int abilityUsed = 0;
int speedOfHit = 0;
boolean finished = false;
//TODO Currently nothing is happening with what you actually used, i think this was in the old code. Re-implement
//TODO At this point I am going to just say everything is a quick attack. So, it'll take up 1 per attack.
//TODO Add logic to see if something is over their move limit or not
speedOfHit = 1;
if(currentCharacter.equals(Player1.charName)){
playerAttacker = 1;
char1Orders[moveUses][0] = figureDamage(abilityUsed);
char1Orders[moveUses][1] = playerAttacker;
char1Orders[moveUses][2] = getCharacterID(playerHit);
if((currentPlayerMoves - speedOfHit) <= 0){
player1.ordersFinished = true;
finished = true;
}
}
else if(currentCharacter.equals(player2.charName)){
playerAttacker = 2;
char2Orders[moveUses][0] = figureDamage(abilityUsed);
char2Orders[moveUses][1] = playerAttacker;
char2Orders[moveUses][2] = getCharacterID(playerHit);
if((currentPlayerMoves - speedOfHit) <= 0){
player2.ordersFinished = true;
finished = true;
}
}
else if(currentCharacter.equals(player3.charName)){
playerAttacker = 3;
char3Orders[moveUses][0] = figureDamage(abilityUsed);
char3Orders[moveUses][1] = playerAttacker;
char3Orders[moveUses][2] = getCharacterID(playerHit);
if((currentPlayerMoves - speedOfHit) <= 0){
player3.ordersFinished = true;
finished = true;
}
}
moveUses += 1;
//The following decides if it's time for the next player or not, if this is the last player,
//then it's time to set it to zero and let the handler do the rest.
if(finished == true){
if(player1.ordersFinished == false){
currentCharacter = player1.charName;
currentPlayerMoves = player1.moves;
}
else if(player2.ordersFinished == false){
currentCharacter = player2.charName;
//THE PROBLEM IS RIGHT HERE, THE LINE ABOVE SHOULD HAVE
//CHANGED CURRENTCHARACTER, BUT IT DID NOT
currentPlayerMoves = player2.Moves;
}
else if(player3.ordersFinished == false){
currentCharacter = player3.charName;
currentPlayerMoves = player3.moves;
}
else {
currentCharacter = "";
currentPlayerMoves = 0;
}
moveUses = 0;
}
else{
currentPlayerMoves -= 1;
}
/*
if (actualUses != Character.moves){
//TODO We should add logic so that an unitilized variable isn't used...
//If they don't do anything, set the rest of their array to zeroe's so we can later say, if zero exclude them from round or don't worry about the shite
}
*/
}
public String setCurrent(){
currentCharacter = "NewPerson";
}
@Override
public void mouseClicked(MouseEvent e) {
if(!currentCharacter.equals("")){
String playerHit = JOptionPane.showInputDialog(null, "Who should " + currentCharacter + " attack?");
if(e.getSource() == attackButton){
characterOrders("Attack", playerHit);
}
}
}
}
Теперь, если я вызову setCurrent
из моего startCombat
метода, переменная изменится.Однако нажатие не меняет переменную.Он прекрасно выполнит код, однако, когда он попадет в ту часть, где он его меняет, он не изменит его.Я уверен, что просто что-то упустил, но я не могу понять правило, которое я просмотрел ...
- ОБНОВЛЕНИЕ - Я обновил CharacterOrders
, чтобы отразить мои фактическиекод как он есть сейчас Обратите внимание, что currentCharacter
является текущим Character
, который издает приказы.