Четверг, 28 Марта 2024, 11:51

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Форум игроделов » Конструкторы игр и лёгкие в освоении системы разработки игр » Game Maker » Проблема со стенами. (...)
Проблема со стенами.
GAZ777Дата: Четверг, 03 Ноября 2011, 18:17 | Сообщение # 1
участник
Сейчас нет на сайте
1) У меня есть танк, этот танк при столкновении со стеной останавливается, НО продолжает крутиться на месте. Маски не помогают. В чем проблема?
2) Как реализовать задний ход?

Выложил исходник с проблемой. вот он (ссылка на zalil.ru)


<-- КЛИКНИ! Ты поможешь ему вырасти.



Invincible Tanks
TimKruzДата: Четверг, 03 Ноября 2011, 18:39 | Сообщение # 2
старожил
Сейчас нет на сайте
Просто у тебя в step'е стоит код поворота, который обрабатывается вне зависимости от наличия столкновения. Проверяй столкновение (и скорость<>0) здесь:
Quote
if (keyboard_check(vk_left) and блаблабла)
{image_angle+=5}

if (keyboard_check(vk_right) and блаблабла)
{image_angle-=5}}
}

Чтобы сделать задний ход, просто делай проверку. Если (скорость = 0) и (нажата кнопка "назад") то присвоить скорости значение -8.

***
Сейчас попробую исправить твой код и здесь допишу...




Сообщение отредактировал TimKruz - Четверг, 03 Ноября 2011, 18:44
GAZ777Дата: Четверг, 03 Ноября 2011, 18:46 | Сообщение # 3
участник
Сейчас нет на сайте
TimKruz, if keyboard_chek(vk_left) and not столкновоние со стеной?
а как будет столкновение?


<-- КЛИКНИ! Ты поможешь ему вырасти.



Invincible Tanks
TimKruzДата: Четверг, 03 Ноября 2011, 18:47 | Сообщение # 4
старожил
Сейчас нет на сайте
GAZ777, о, я разобрался. biggrin Ты там со скобками нафигачил. Замени код в step на:
Code
if keyboard_check(vk_down)
         {speed=-8
         direction=image_angle}
              
if keyboard_check_released(vk_down)
         {speed=0}         

if keyboard_check(vk_up)
{          
if keyboard_check(vk_left)
         {image_angle+=5}
              
if keyboard_check(vk_right)
         {image_angle-=5}
              
         speed=8
         direction=image_angle
}
              
if keyboard_check_released(vk_up)
         {speed=0}

И всё работает.
***
Quote (GAZ777)
if keyboard_chek(vk_left) and not столкновоние со стеной?

Не, это уже не надо, я по-другому сделал. :D

***
А, не, вот так лучше будет (поворачивает задом):
Code
if keyboard_check(vk_down)
     {speed=-8
     direction=image_angle}
      
if keyboard_check_released(vk_down)
     {speed=0}     

if keyboard_check(vk_up)
{
     speed=8
     direction=image_angle
}

if (keyboard_check(vk_left) and speed<>0)
     {image_angle+=5}
      
if (keyboard_check(vk_right) and speed<>0)
     {image_angle-=5}

      
if keyboard_check_released(vk_up)
     {speed=0}

Однако, если нажать одновременно вперёд или назад и влево или вправо, то всё равно в стенке поворачивает. Нужно проверять столкновение.




Сообщение отредактировал TimKruz - Четверг, 03 Ноября 2011, 18:51
GAZ777Дата: Четверг, 03 Ноября 2011, 18:51 | Сообщение # 5
участник
Сейчас нет на сайте
TimKruz, а теперь при малейшем столкновении или легком задевании он тупо застревает:)

<-- КЛИКНИ! Ты поможешь ему вырасти.



Invincible Tanks
TimKruzДата: Четверг, 03 Ноября 2011, 18:52 | Сообщение # 6
старожил
Сейчас нет на сайте
GAZ777, как в коде GML проверять столкновение, знаешь?
***
Вот: http://rghost.ru/28392111. Только проверку столкновений добавь. biggrin




Сообщение отредактировал TimKruz - Четверг, 03 Ноября 2011, 18:57
GAZ777Дата: Четверг, 03 Ноября 2011, 18:59 | Сообщение # 7
участник
Сейчас нет на сайте
TimKruz, да, эт я знаю biggrin

Добавлено (03.11.2011, 18:59)
---------------------------------------------
TimKruz, спасибо smile


<-- КЛИКНИ! Ты поможешь ему вырасти.



Invincible Tanks


Сообщение отредактировал GAZ777 - Четверг, 03 Ноября 2011, 18:59
CHROMДата: Четверг, 03 Ноября 2011, 21:34 | Сообщение # 8
частый гость
Сейчас нет на сайте
Вот глянь ... залил на RGhost мож норм? icecream


+ CHROM +
TimKruzДата: Четверг, 03 Ноября 2011, 21:43 | Сообщение # 9
старожил
Сейчас нет на сайте
Quote (CHROM)
Вот глянь ... залил на RGhost мож норм?

У тебя поворот работает только когда вперёд едешь и машина совсем застревает (задний ход не работает), если врезаться в стену. А плавное ускорение и торможение легко сделать. wacko
Кстати, GAZ777, чтобы машина не застревала совсем, можно при обнаружении столкновения, например, менять вектор скорости на противоположный, типа машина врезалась и оттолкнулась от стены, и потом останавливать. smile Либо отодвигать на несколько пикселей назад.




Сообщение отредактировал TimKruz - Четверг, 03 Ноября 2011, 21:43
GAZ777Дата: Пятница, 04 Ноября 2011, 12:25 | Сообщение # 10
участник
Сейчас нет на сайте
TimKruz, круто, хорошая идея smile скорость сделать -3, а потом 0. я правильно понял?

Добавлено (04.11.2011, 12:25)
---------------------------------------------
TimKruz, там где ты в комменте добавил if (keyboard_check(vk_right) and speed<>0) //тут еще проверка столкновения должна быть

if (keyboard_check(vk_right) and speed<>0) and not collision_point(....) - так?
-


<-- КЛИКНИ! Ты поможешь ему вырасти.



Invincible Tanks
TimKruzДата: Пятница, 04 Ноября 2011, 13:04 | Сообщение # 11
старожил
Сейчас нет на сайте
Quote (GAZ777)
я правильно понял?

Да, но перед тем как делать 0, подождать несколько миллисекунд (чтобы успела откатиться). Но это будет только если машина не "наехала" на другой объект (т.е. не застряла на нём)... Если уже "наехала" - то тут надо не скорость менять, а принудительно сдвигать обратно... Но если всё правильно сделать, "наезжать" не должна...
Quote (GAZ777)
if (keyboard_check(vk_right) and speed<>0) and not collision_point(....) - так?

Если функция collision_point возвращает true при наличии столкновения между двумя объектами, то да, именно так. Только я со скобками запутался... wacko Наверное, так скобки расставить:
Quote
if (keyboard_check(vk_right) and (speed<>0) and not collision_point(...))

Просто я не уверен, какой приоритет логических операций в GML... wacko А от порядка действий зависит результат.


GAZ777Дата: Пятница, 04 Ноября 2011, 13:17 | Сообщение # 12
участник
Сейчас нет на сайте
Quote (TimKruz)
перед тем как делать 0, подождать несколько миллисекунд

да я поставил аларм на 100мл.

Quote (TimKruz)
if (keyboard_check(vk_right) and (speed<>0) and not collision_point(...))

так делать нелзя, так как между ними стоит AND. это два отдельных условия.

Quote (TimKruz)
Просто я не уверен, какой приоритет логических операций в GML...

ты GML не изучаешь?

Добавлено (04.11.2011, 13:17)
---------------------------------------------
проверка не помогает, если нажать две клавиши одновременно, то всё равно заходит в стену. sad


<-- КЛИКНИ! Ты поможешь ему вырасти.



Invincible Tanks
GameMixДата: Пятница, 04 Ноября 2011, 13:49 | Сообщение # 13
старожил
Сейчас нет на сайте
Quote (TimKruz)
Просто я не уверен, какой приоритет логических операций в GML... А от порядка действий зависит результат.

В GML в сложном условии с and'ами проверяются по очереди все выражения, при первом же ложном значении выражения условие прерывается, возвращая ложь.


Steel Standoff - 2D аркада.
Мои статьи
TimKruzДата: Пятница, 04 Ноября 2011, 16:08 | Сообщение # 14
старожил
Сейчас нет на сайте
Quote (GAZ777)
ты GML не изучаешь?

Нет. biggrin Но тут не нужно иметь глубоких знаний в языке...
GameMix, я имел в виду то, что "not" должен выполняться раньше "and", а "<>" - позже "and". wacko Или в GML по-другому?
Quote (GAZ777)
проверка не помогает, если нажать две клавиши одновременно, то всё равно заходит в стену.

У тебя speed<>0, как только нажимается кнопка, в не зависимости от столкновения со стеной. Там тоже надо добавить условие, что изменяем скорость, только если нет соприкосновения со стеной... (т.е. на vk_up и vk_down)
У меня есть подозрение, что ты неправильно используешь collision_point(...). huh Получается, эта функция у тебя всё время возвращает false. Тогда получаем «истина (нажата кнопка поворота) и истина (нажата кнопка движения => получили speed<>0) и не ложь (не знаю, почему)»...


GAZ777Дата: Пятница, 04 Ноября 2011, 16:11 | Сообщение # 15
участник
Сейчас нет на сайте
Quote (TimKruz)
У меня есть подозрение, что ты неправильно используешь collision_point(...).


дак напиши весь код collisionа. я проверю


<-- КЛИКНИ! Ты поможешь ему вырасти.



Invincible Tanks
Форум игроделов » Конструкторы игр и лёгкие в освоении системы разработки игр » Game Maker » Проблема со стенами. (...)
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг