Проблема с передвижением танка.
|
|
Minskii | Дата: Понедельник, 16 Мая 2016, 20:17 | Сообщение # 1 |
участник
Сейчас нет на сайте
| Я делаю игру,код ещё сырой,но есть проблема которую я не могу решить. Мне надо исключить движение по диагонали! Код движения такой(знаю туповатенький) var i; if keyboard_check(vk_left) // Åñëè èãðîê íàæàë ñòðåëêó âëåâî x-=3 if keyboard_check(vk_left) direction=90 if keyboard_check(vk_right) // Åñëè èãðîê íàæàë ñòðåëêó âïðàâî x+=3 if keyboard_check(vk_right) direction=-90 if keyboard_check(vk_up) // Åñëè èãðîê íàæàë ñòðåëêó ââåðõ y-=3 if keyboard_check(vk_up) direction=180 if keyboard_check(vk_down) // Åñëè èãðîê íàæàë ñòðåëêó âíèç y+=3 if keyboard_check(vk_down) direction=0 Нужно исключить движение по диагонали,что бы танк ездил только вправо,и влево. Знаю что можно к каждой кнопке чекать нажатие других кнопок и не давать ему двигатся в две стороны. Но это тоже не вариант. Через кнопки(кей прессед,кей релисэд) очень сильно лагает.
Один терранозавр - это 1024 гиганозавра, или 1048576 меганозавров. Java/Kotlin, C#, C++. Android разработчик. Инженер-программист программного обеспечения информационной безопасности мобильных систем.
|
|
| |
TLT | Дата: Понедельник, 16 Мая 2016, 20:36 | Сообщение # 2 |
Сейчас нет на сайте
| Переписать и сделать на выбор 4 кейса.
Нажал на кнопку вверх - выбран кейс 1, в котором прописано движение вверх, и т.д. Так не будет возможности выбрать сразу несколько кейсов, и игрок не будет двигаться по сумарным данным.
Дао, выраженное словами, не есть истинное Дао.
|
|
| |
URGINSAN | Дата: Понедельник, 16 Мая 2016, 22:53 | Сообщение # 3 |
почти ветеран
Сейчас нет на сайте
| Minskii, как вариант что то типа:
Код if (keyboard_check(vk_left)){ y = y_previous; x-=3; } if (keyboard_check(vk_up)){ x = x_previous; y-=3; }
Попробуй, думаю идея ясна. Просто при нажатии кнопки делай так, чтобы двигаться по другой оси танк не мог.
Либо, второй вариант использовать переменную заглушку.
Код if (keyboard_check(vk_left)){ can_move = 1; x-=3; } if (keyboard_check_released(vk_left)){ can_move = 0; } if (keyboard_check(vk_up) && can_move == 0){ y-=3; }
То есть, есть переменная запрещающая двигаться не туда, когда у нас нажата не та кнопка. Грубо говоря так.
Я на драйве
Сообщение отредактировал URGINSAN - Понедельник, 16 Мая 2016, 23:06 |
|
| |
TLT | Дата: Вторник, 17 Мая 2016, 16:36 | Сообщение # 4 |
Сейчас нет на сайте
| Цитата А как вобщем-то кейсы делать то? Нигде не нашёл инфы такой
не знаю как там на GML, но суть такова:
Делаешь функцию, например ControlEngine. Далее делаешь кейс с вариантами положений. Примерно так (условный код на Байсике привожу):
Код 'если выбран кейс 0 (он по умолчанию выбран) if ControlEngine=0 then Сдвиг спрайта=СТОП. если нажал ВНИЗ то ControlEngine=1 если нажал ВВЕРХ то ControlEngine=2 если нажал ВЛЕВО то ControlEngine=3 если нажал ВПРАВО то ControlEngine=4 end if
'если выбран кейс 1 if ControlEngine=1 then Сдвиг спрайта=ВНИЗ. если нажал ВНИЗ то ControlEngine=1 если нажал ВВЕРХ то ControlEngine=2 если нажал ВЛЕВО то ControlEngine=3 если нажал ВПРАВО то ControlEngine=4 end if
'если выбран кейс 2 if ControlEngine=2 then Сдвиг спрайта=ВВЕРХ. если нажал ВНИЗ то ControlEngine=1 если нажал ВВЕРХ то ControlEngine=2 если нажал ВЛЕВО то ControlEngine=3 если нажал ВПРАВО то ControlEngine=4 end if
'если выбран кейс 3 if ControlEngine=3 then Сдвиг спрайта=ВЛЕВО. если нажал ВНИЗ то ControlEngine=1 если нажал ВВЕРХ то ControlEngine=2 если нажал ВЛЕВО то ControlEngine=3 если нажал ВПРАВО то ControlEngine=4 end if
'если выбран кейс 4 if ControlEngine=4 then Сдвиг спрайта=ВПРАВО. если нажал ВНИЗ то ControlEngine=1 если нажал ВВЕРХ то ControlEngine=2 если нажал ВЛЕВО то ControlEngine=3 если нажал ВПРАВО то ControlEngine=4 end if
Код Select Case 5 Case 0: locate 1,15: print "0" Exit Select Case 1: locate 1,15: print "1" Exit Select Case 2: locate 1,12: print "2" Exit Select Case 3: locate 1,15: print "3" Exit Select Case 4: locate 1,15: print "4" Exit Select Case 5: locate 1,15: print "5" Exit Select End Select
Дао, выраженное словами, не есть истинное Дао.
|
|
| |
Minskii | Дата: Вторник, 17 Мая 2016, 16:53 | Сообщение # 5 |
участник
Сейчас нет на сайте
| TLT, Ммм,вроде понял,а вот GM коды мои не понимает)))Как вводится команда "здвиг спрайта=стоп" Can_move=0?Или как?
if ControlEngine=0 then can_move=0 if (keyboard_check(vk_left)) ControlEngine=1 if (keyboard_check(vk_up)) ControlEngine=2 if (keyboard_check(vk_right)) ControlEngine=3 if (keyboard_check(vk_down)) ControlEngine=4 end if
ошибка чё то в "end if"
Один терранозавр - это 1024 гиганозавра, или 1048576 меганозавров. Java/Kotlin, C#, C++. Android разработчик. Инженер-программист программного обеспечения информационной безопасности мобильных систем.
Сообщение отредактировал Minskii - Вторник, 17 Мая 2016, 16:54 |
|
| |
TLT | Дата: Вторник, 17 Мая 2016, 20:12 | Сообщение # 6 |
Сейчас нет на сайте
| Цитата Minskii ( ) Ммм,вроде понял,а вот GM коды мои не понимает)))Как вводится команда "здвиг спрайта=стоп"Can_move=0?Или как?
В первом же посте есть этот код, типа:
См. свой код - там же уже реализовал смещение по координатам, как понимаю. Это твой код?
Я не спец по GML, я просто немного разбираюсь в программировании. Скинь мне свой шаблон для GM с имеющимся кодом движения, я гляну или кто-то ещё глянет, что там как сделать.
У тебя GM8 или GMS?
Дао, выраженное словами, не есть истинное Дао.
|
|
| |
Minskii | Дата: Среда, 18 Мая 2016, 15:36 | Сообщение # 7 |
участник
Сейчас нет на сайте
| TLT, У меня gm8.1 http://rgho.st/7bMNq7MpV
Один терранозавр - это 1024 гиганозавра, или 1048576 меганозавров. Java/Kotlin, C#, C++. Android разработчик. Инженер-программист программного обеспечения информационной безопасности мобильных систем.
|
|
| |
TLT | Дата: Среда, 18 Мая 2016, 18:46 | Сообщение # 8 |
Сейчас нет на сайте
| Буду дома ночью - гляну... Ща нет под рукой.
Дао, выраженное словами, не есть истинное Дао.
|
|
| |
URGINSAN | Дата: Среда, 18 Мая 2016, 22:56 | Сообщение # 9 |
почти ветеран
Сейчас нет на сайте
| Minskii, мой вариант как понимаю не подошел?
Я на драйве
|
|
| |
TLT | Дата: Четверг, 19 Мая 2016, 00:39 | Сообщение # 10 |
Сейчас нет на сайте
| Классика жанра! 100% нужно было в справке Кейсы смотреть, там 100% твой случай. Я сделал тебе код на GML:
Код { switch (keyboard_key) { case vk_left: // Если игрок нажал стрелку влево // case ord("A"): // Если игрок нажал стрелку A x-=3 direction=180 break; case vk_right: // Если игрок нажал стрелку вправо // case ord("D"): // Если игрок нажал стрелку D x+=3 direction=0 break; case vk_up: // Если игрок нажал стрелку вверх // case ord("W"): // Если игрок нажал стрелку W y-=3 direction=90 break; case vk_down: // Если игрок нажал стрелку вниз // case ord("S"): // Если игрок нажал стрелку S y+=3 direction=-90 break; } }
Удали //, если нужно WASD продублировать.
Дао, выраженное словами, не есть истинное Дао.
|
|
| |
Minskii | Дата: Четверг, 19 Мая 2016, 14:01 | Сообщение # 11 |
участник
Сейчас нет на сайте
| TLT, Огромные спасибы!Сам почему-то в справке кейсов не нашёл))) Добавлено (19 мая 2016, 09:49) --------------------------------------------- TLT, Вообще как надо код вошёл Добавлено (19 мая 2016, 14:01) --------------------------------------------- URGINSAN, ваш вариант хорош как вариант,но через кейсы получилось играбельнее.Спаксибо за инфу однако
Один терранозавр - это 1024 гиганозавра, или 1048576 меганозавров. Java/Kotlin, C#, C++. Android разработчик. Инженер-программист программного обеспечения информационной безопасности мобильных систем.
|
|
| |