#java #java-me #midlet
#java #java-me #мидлет
Вопрос:
Я пытаюсь создать 2d-игру, используя java microedition, и я просто хочу сделать свой контроль более плавным, но проблема в том, что когда я нажимаю левую клавишу при нажатии клавиши UP, условие не работает, я не знаю почему
public void moveJet2() throws IOException{
int gameAction = getKeyStates();
if(gameAction==LEFT_PRESSED amp;amp; gameAction==UP_PRESSED){
padX-=padXVel;
padY-=padYVel;
}
else if(gameAction==RIGHT_PRESSED){
padX = padXVel;
}
else if(gameAction==UP_PRESSED){
padY-=padYVel;
}
else if(gameAction==DOWN_PRESSED){
padY =padYVel;
}
}
Ответ №1:
getKeyStates()
возвращает состояние ключей в одном int. Различные ключи имеют индивидуальные значения. UP_PRESSED = 0x0002 и LEFT_PRESSED = 0x0004. Поэтому, если вы нажмете UP на d-pad во время вызова getKeyStates()
, вы получите обратно 2 и if (getKeyStates()==UP_PRESSED)
, таким образом, будет true . Аналогично, если вы нажмете ВЛЕВО на d-pad во время вызова getKeyStates()
, вы получите 4 обратно.
Но если вы одновременно нажмете ВВЕРХ и ВЛЕВО, вы не сможете вернуть 2 и 4 — потому что это, очевидно, 2 целых числа — и getKeyStates()
возвращает только одно целое число.
Однако то, что вы получаете обратно, довольно просто: 2 4 = 6. Таким образом, запрос if (getKeyStates()==6)
будет верным, если одновременно нажать ВВЕРХ и ВЛЕВО. Или if (getKeyStates()==UP_PRESSED LEFT_PRESSED)
.
Обычно, однако, вы бы попросили использовать битовые операторы, например:
public void moveJet2() throws IOException{
int gameAction = getKeyStates();
if((gameAction amp; LEFT_PRESSED)!=0) {
padX -= padXVel;
}
if((gameAction amp; RIGHT_PRESSED)!=0) {
padX = padXVel;
}
if((gameAction amp; UP_PRESSED)!=0) {
padY-=padYVel;
}
if((gameAction amp; DOWN_PRESSED)!=0){
padY =padYVel;
}
}
Потому что использование этого подхода будет работать с любым из 8 направлений, которые вы можете нажать одновременно.
Комментарии:
1. Большое вам спасибо, мистер 🙂