SFML и C++ Уроки \ Разработка игр › Форумы › SFML System, Window и другие вопросы › Еденичное нажатие клавиши
В этой теме 7 ответов, 4 участника, последнее обновление saxartom 8 года/лет, 6 мес. назад.
-
АвторСообщения
-
Не подскажете, как можно реализовать единичное проигрывание анимации по единичному нажатию на клавишу. Например удар рукой: один раз нажал левую кнопку мыши и один раз проигралась анимация удара. Пытался по разному, но, либо вообще не проигрывается, либо только по зажатию кнопки, да еще и не один раз, а пока держишь кнопку.
Предоставьте свои попытки реализации.
в цикле событий проверять нажатие клавиши. сделать флаг, от которого будет зависеть проигрывание после нажатия
Вот код в основном цикле (объявление переменной вне цикла) . Пробовал его и в цикл событий вставлять – ничего.
bool CheckMouseClick = true;
if (Mouse::isButtonPressed(Mouse::Left)){
if (CheckMouseClick == true){
CurrentFrame += 0.005*time;
if (CurrentFrame > 7){
CheckMouseClick == false;
CurrentFrame -= 7;
}
hero.sprite.setTextureRect(IntRect(77 * int(CurrentFrame), 430, 77, 75));
}
else CheckMouseClick == true;C++1234567891011if (Mouse::isButtonPressed(Mouse::Left)){if (CheckMouseClick){CurrentFrame += 0.005*time;if (CurrentFrame > 7){CheckMouseClick = false;CurrentFrame -= 7;}hero.sprite.setTextureRect(IntRect(77 * int(CurrentFrame), 430, 77, 75));}}else CheckMouseClick = true;У меня получилось реализовать так. Но почему то работает только если вставить после вызова метода update. Я бы проигрывание в метод control вставил (как ходьбу), но не знаю как условие преобразовать так чтоб не использовать объект event. А передавать в качестве параметра в функцию – не хочется список параметров засорят (если конечно обойти можно) . Не посоветуете что-то?
C++12345678910if (event.type == event.MouseButtonReleased && event.mouseButton.button == Mouse::Left){if (CheckMouseClick == true){CurrentFrame += 0.014*time;if (CurrentFrame > 7){CheckMouseClick = false;CurrentFrame -= 7;}hero.sprite.setTextureRect(IntRect(77 * int(CurrentFrame), 430, 77, 75));}}if (CheckMouseClick) – это не опечатка Это идентично if (CheckMouseClick == true).
И покажи весь файл, посмотрим, что там.
Спасибо, я знаю что они одинаковы )). Просто когда я писал этот участок кода, то был сонный и не заметил, что вместо присвоения я поставил равно . И, честно, сначала подумал, что вы зачем то продублировали мое сообщение, но позже заметил, что вы указывали именно на это.
Скидывать весь код нет смысла, поскольку, то что меня интересует именно здесь )) А именно, я хочу разместить этот кусок в методе класса персонажа.
C++12345678910if (event.type == event.MouseButtonReleased && event.mouseButton.button == Mouse::Left){if (CheckMouseClick == true){CurrentFrame += 0.014*time;if (CurrentFrame > 7){CheckMouseClick = false;CurrentFrame -= 7;}hero.sprite.setTextureRect(IntRect(77 * int(CurrentFrame), 430, 77, 75));}}Но в условии “event.type == С && event.mouseButton.button == Mouse::Left” присутствует использование экземпляра класса Event, объявление которого в главной функции. Можно ли как то заменить “event.type”, “event.MouseButtonReleased” … на “слабую ссылку”.
Конечно можно передавать в качестве аргумента функции или глобального объявления, но хотелось бы обойтись без этого (если конечно можно).Я пытался что-то эквивалентное написать, но зачастую не работало.
-
АвторСообщения
Для ответа в этой теме необходимо авторизоваться.