| Проблема с передвижением танка. | 
|  | 
| 
| 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 5Case 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 разработчик. Инженер-программист программного обеспечения информационной безопасности мобильных систем.
 |  |  |  |  |