Всем привет. Странно ведет себя код. В отладчике не меняются координаты объекта.
Суть вот в чем: Есть герой и есть автомобиль. При нажатии F он "садится" в автомобиль, а при нажатии X "выходит". Смысл такой что когда персонаж сел его координатам присваеваются значения автомобиля, а при выходе смещается только координата х для того что бы персонаж появился левее машины.
Но при езде не меняются координаты ни машины не персонажа, но машина ездит нормально(повторюсь, в отладчике координаты не меняются), а персонаж стоит на месте.
Интересно, что моб, который всегда нацелен на персонажа стреляет по координатам буд-то персонаж в машине.
Видео под спойлером:
Вот код:
Код
// УПРАВЛЕНИЕ if ( keyboard_check(ord('W')) || keyboard_check(ord('A')) || keyboard_check(ord('S')) || keyboard_check(ord('D')) ) { if (in_car == false) { if (keyboard_check(ord('W'))) y -= walk_speed; if (keyboard_check(ord('S'))) y += walk_speed; if (keyboard_check(ord('A'))) x -= walk_speed; if (keyboard_check(ord('D'))) x += walk_speed;
audio_sound_gain(snd_step, 0.1, 0); if(!audio_is_playing(snd_step)){ audio_play_sound(snd_step, 1, true); } } else { with (obj_car) { backride = false; friction = 0.2; if (keyboard_check(ord('W'))) { backride = false; speed = +obj_player.ride_speed; sprite_index = spr_car; } if (keyboard_check(ord('S'))) { backride = true; speed = -obj_player.ride_speed / 2; sprite_index = spr_car; } if (keyboard_check(ord('A'))) { sprite_index = spr_car_l; if (!backride) { direction += 2; } else { direction -= 2; } } if (keyboard_check(ord('D'))) { sprite_index = spr_car_r; if (!backride) { direction -= 2; } else { direction += 2; } } image_angle = direction; } } } else { audio_stop_sound(snd_step); }
// ВОЗЛЕ МАШИНЫ if (distance_to_object(obj_car) < 10) { act_msg = true; if (in_car == false) { act_msg_txt = "PRESS " + chr(34) + "F" + chr(34) + " FOR GET IN THE CAR"; } if (keyboard_check(ord('F'))) { in_car = true; //visible = false; } } else { act_msg = false; } // В МАШИНЕ if (in_car == true) { act_msg = true; act_msg_txt = "PRESS " + chr(34) + "X" + chr(34) + " FOR GET OUT FROM CAR"; view_object[0] = obj_car; obj_player.x = obj_car.x; obj_player.y = obj_car.y; if (keyboard_check(ord('X'))) { obj_player.x -= 40; in_car = false; //visible = true; view_object[0] = obj_player; } }
Я подозреваю, что координаты не меняются из-за того, что при движении в машине координаты не наращиваются(х += 10), а используется speed.
Сообщение отредактировал Code_Bryant - Вторник, 28 Февраля 2017, 14:01
Вот писал не в GM, но должно работать, в этот код добавь всё остальное, что нужно.
Код
with(obj_car){ if global.pl_aktiw=false{ if keyboard_check(ord('W')){//движение в нужную сторону} if keyboard_check(ord('A')) {} if keyboard_check(ord('S')) {} if keyboard_check(ord('D')){} }} with(obj_player){ if global.pl_aktiw=true{ if keyboard_check(ord('W')){//движение в нужную сторону} if keyboard_check(ord('A')) {} if keyboard_check(ord('S')) {} if keyboard_check(ord('D')){} }
if (distance_to_object(obj_car) < 10){ if keyboard_check(ord('F')){ global.pl_aktiw=false}} /////////////////////////////////// if global.pl_aktiw=false{ obj_player.x=obj_car.x obj_player.y=obj_car.y if keyboard_key_press(ord('F')){ if place_free(obj_car.x+10,obj_car.y){ global.pl_aktiw=true}} } }
Сообщение отредактировал Интернет - Вторник, 28 Февраля 2017, 22:50
// УПРАВЛЕНИЕ with(obj_car) { if (global.in_car == true) { backride = false; friction = 0.2; if (keyboard_check(ord('W'))) { backride = false; speed = +obj_player.ride_speed; sprite_index = spr_car; } if (keyboard_check(ord('S'))) { backride = true; speed = -obj_player.ride_speed / 1.5; sprite_index = spr_car; } if (keyboard_check(ord('A'))) { sprite_index = spr_car_l; if (!backride) { direction += 2; } else { direction -= 2; } } if (keyboard_check(ord('D'))) { sprite_index = spr_car_r; if (!backride) { direction -= 2; } else { direction += 2; } } image_angle = direction; } }
with(obj_player) { if (global.in_car == false) { if ( keyboard_check(ord('W')) || keyboard_check(ord('A')) || keyboard_check(ord('S')) || keyboard_check(ord('D')) ) { if (keyboard_check(ord('W'))) y -= walk_speed; if (keyboard_check(ord('S'))) y += walk_speed; if (keyboard_check(ord('A'))) x -= walk_speed; if (keyboard_check(ord('D'))) x += walk_speed;
но координаты персонажа все равно не меняются когда едешь в машине
Добавлено (06 марта 2017, 03:54) --------------------------------------------- Уточню, что все происходит в Step евенте. Возможно, что-то нужно перенести в step end?
Сообщение отредактировал Code_Bryant - Воскресенье, 05 Марта 2017, 18:15
Берешь Scirra construct и не паришься делаешь, все равно дальше гцупа игра не пойдет.
Боюсь смена инструмента ничего не даст.
Добавлено (06 марта 2017, 11:24) --------------------------------------------- Code_Bryant, Позже если будет время проверю ваш код на предмет ошибки.
Добавлено (06 марта 2017, 11:37) --------------------------------------------- Елки-палки! Что за код??!! %)
Добавлено (06 марта 2017, 11:38) --------------------------------------------- Мой вам совет, старайтесь как можно меньше использовать with, а то такого там нагородили!
Добавлено (06 марта 2017, 11:43) --------------------------------------------- Есть несколько способов решения вашей проблемы. Опишу не самый оптимальный, но под ваши запросы. Убрать всю эту галиматью и сделать просто управление отдельно машиной, отдельно героем. Но предварительно, введите к примеру глобальную переменную global.incar ,которая изначально равно 0. Далее в степе героя в самом начале перед управлением идет проверка:
Код
if global.incar=0 { if (keyboard_check(ord('W'))) y -= walk_speed; if (keyboard_check(ord('S'))) y += walk_speed; и т.д. (т.е. все управление героем прописываем здесь) } else { x=obj_car.x y=obj_car.y }
Добавлено (06 марта 2017, 11:44) --------------------------------------------- Т.е. тут проверяем, если герой не в машине, то им можно управлять как обычно, а если же он в машине, то управлять с помощью клавиш вы им уже не сможете, а его координаты будут всегда равны координатам машины.
Добавлено (06 марта 2017, 11:46) --------------------------------------------- В степе машины пишем почти такой же код, но только уже global.incar=1 когда:
Код
if global.incar=1 { тут пишем все управление машиной }
Добавлено (06 марта 2017, 11:48) --------------------------------------------- Ну а когда менять переменную global.incar думаю сами поймете. Т.е. когда герой подошел на определенное расстояние к машине и нажал определенную кнопку, переменная global.incar меняется с 0 на 1. Все это естественно пишем в степе героя. В степе машины же напротив, когда игрок нажимает определенную клавишу, то global.incar меняем с 1 на 0 и выставляем координаты героя чуть в стороне от машины тут же.
Добавлено (06 марта 2017, 11:50) --------------------------------------------- Вот и весь алгоритм. Ну и глубина depth машины должна быть естественно больше глубины героя, чтобы она закрывала игрока. Хотя его на время поездки можно делать вообще невидимым. А можно и вообще было делать, чтобы он просто исчезал, а не двигать его вместе с машиной (зачем вам это вообще не понял? ). Но если нужно, чтобы именно игрок двигался с машиной, я вам описал алгоритм. Будет что-то непонятно, спрашивайте.
Добавлено (06 марта 2017, 11:55) --------------------------------------------- И не слушайте глупые советы о переходе с одного инструмента на другой при невозможности решить проблему. Смена конструктора только подкинет вам новых проблем и вопросов. Лучше досканально изучить один инструмент. А ваша задачка довольно проста, если вы не смогли ее решить самостоятельно, то я вам советую изучить GM на более простых примерах. Лишь обучение от простого к сложному дает нужный результат. Я сам так лет пять если не больше уже работаю на нем. И если честно, то я еще не весь потенциал GMS освоил. Только сейчас пилю игрушку, в которой хочу проверить все свои навыки.
Убрать всю эту галиматью и сделать просто управление отдельно машиной, отдельно героем. Но предварительно, введите к примеру глобальную переменную global.incar ,которая изначально равно 0.
Так же и реализовано. Управление игроком и машиной в обработчике событий игрока сделано для удобства тестирования и потом переедет на сове место. Как Вы могли бы заметить если бы читали мой код, там как раз используется глобальная булева переменная global.in_car.
ЦитатаRaven84 ()
if global.incar=0 { if (keyboard_check(ord('W'))) y -= walk_speed; if (keyboard_check(ord('S'))) y += walk_speed; и т.д. (т.е. все управление героем прописываем здесь) } else { x=obj_car.x y=obj_car.y }
Вы вот реально думаете, что я так не делал? Я создал максимально понятный топик и максимально описал проблему. Эта часть кода
Код
x=obj_car.x y=obj_car.y
Не срабатывает.
ЦитатаRaven84 ()
А можно и вообще было делать, чтобы он просто исчезал, а не двигать его вместе с машиной
Вот это уже похоже на совет, спасибо. Как-то не подумал, что может сработать. Единственное, при удалении объекта и создании его снова сработает событие Create и все характеристики сбросятся или Вы знаете как с этим бороться?
Цитатаmlpmmo ()
Берешь Scirra construct и не паришься делаешь, все равно дальше гцупа игра не пойдет.
Хорошие мальчики вкладывают не несущие смысла сообщения в спойлер.
Раз такое дело пошло я поясню. Возможно, Вы(профессионалы) создаете игры сразу как нужно правильно распределяя весь код и без ошибок, но я знаком с Game Maker 2-3 недели по выходным и еще не изучил все его возможности. Здесь на форуме я стараюсь задавать вопрос только если долго искал решение сам, затем в поиске и если нигде не нашел. Так что не стоит думать, что это все не работает из-за того, что я не в том месте прописал x=obj_car.x и y=obj_car.y.
mlpmmo, конкретно для тебя. Ты вот испускаешь свой негатив, но знаешь, использовать игровой движок для того что бы сделать онлайн калькулятор целых чисел на фоне чужой картинки это тоже не признак мастерства, сорян.
Сообщение отредактировал Code_Bryant - Понедельник, 06 Марта 2017, 13:14
Code_Bryant, Еще раз повторюсь! Если нужна помощь, то прислушивайся к советам, а не критикуй, тем более, что знаком с Game Maker'ом 2-3 недели всего! Вот этой фразой ты можешь вывести кого угодно, даже меня, хотя я очень спокойный человек:
Цитата
Так что не стоит думать, что это все не работает из-за того, что я не в том месте прописал x=obj_car.x и y=obj_car.y.
Пойми, твой код не работает не из за того, что ты это не там прописал, а из за того, что он в корне не верен. И я не думаю, я знаю. Ладно бы я на GM сам месяц поработал, я же на нем работаю, повторюсь, уже более пяти лет и даже делаю коммерческие игры, на продажу. Или ты делал его по примеру? Еще раз повторюсь, перепиши код, как я тебе посоветовал и все будет работать как часы.
Цитата
Единственное, при удалении объекта и создании его снова сработает событие Create и все характеристики сбросятся или Вы знаете как с этим бороться?
Что касается вашего кода, то он вообще не оптимизирован!
Код
if ( keyboard_check(ord('W')) || keyboard_check(ord('A')) || keyboard_check(ord('S')) || keyboard_check(ord('D')) ) { if (in_car == false) { if (keyboard_check(ord('W'))) y -= walk_speed; if (keyboard_check(ord('S'))) y += walk_speed; if (keyboard_check(ord('A'))) x -= walk_speed; if (keyboard_check(ord('D'))) x += walk_speed;
К примеру зачем тут два раза проверять нажата ли клавиша?! Я честно не понимаю. Ну точнее я понимаю, что делает этот код, но я не понимаю зачем так!
Добавлено (06 марта 2017, 14:36) --------------------------------------------- Code_Bryant,
Цитата
Спасибо. Сорян за негатив. День не задался
Да ничего. Так бы я даже и не подсказал. Сюда в последнее время не так часто захожу,т.к. занят часто. Но вот на тебя наткнулся и решил подсказать. Раньше очень многим подсказывал. Перепеши на мой код. Если боишься свой вариант потерять, то сохрани отдельно его и попробуй с моим. Все получится. Он и более оптимизированный получится, так как ты кучу ненужного отсекешь. Super Knight Story (в разработке) Idolzzz - игра доступна в Steam и Play Market Oliver's Adventures in the Fairyland
Code_Bryant, У тебя это и так прописано в шаге, что значит "один раз прописать, а не в каждом шаге" ? Ты имеешь в виду, чтобы это один раз только выполнялось?
Добавлено (06 марта 2017, 14:45) --------------------------------------------- Вообще, судя по ролику у тебя шаги как-то странно звучат. Т.е. звук шага звучит лишь один раз, когда только ты начинаешь двигаться в каком-нибудь направлении. Ты так и хотел? Не логичнее бы было, чтобы пока ты двигаешься, звуки шагов звучали постоянно?
Code_Bryant, Ты скажи одно, ты сам код понимаешь или просто скачал или делаешь по примеру? Мне это важно знать. В этом нет ничего такого. Я сам когда-то начинал с чужих исходников. Так я смогу более четкие тебе советы давать. Если ты код не понимаешь, тогда тебе полностью весь код нужно скидывать, если понимаешь, тогда я могу тебе просто принцип действия подсказывать, т.е. алгоритм, а код ты сам напишешь под него. Так какой вариант?
Добавлено (06 марта 2017, 14:49) --------------------------------------------- Code_Bryant,
Цитата
Оооооо.... Я догнал в чем дело с этими координатами и где косячина с перемещениями...
ы скажи одно, ты сам код понимаешь или просто скачал или делаешь по примеру? Мне это важно знать. В этом нет ничего такого. Я сам когда-то начинал с чужих исходников. Так я смогу более четкие тебе советы давать. Если ты код не понимаешь, тогда тебе полностью весь код нужно скидывать, если понимаешь, тогда я могу тебе просто принцип действия подсказывать, т.е. алгоритм, а код ты сам напишешь под него. Так какой вариант?
Понимаю)) Связан с программированием по работе, а тут меня что-то клинит
Добавлено (06 марта 2017, 15:00) --------------------------------------------- Raven84, Алгоритм всетаки Ваш я бы очень хотел почитать. Всетаки, совет от человека с опытом не каждый день получишь. Блин, звучит как сарказм опять, но это не так)
Связан с программированием по работе, а тут меня что-то клинит
Ну это возможно, что по работе пишешь на одном языке, а тут совсем другой. Порой такое бывает. Сложно сначала привыкнуть и перестроиться. Я проблему вижу как раз в том, что ты программируешь как обычно, т.е. весь код у тебя идет в одном месте сплошняком. В GM как раз лучше по другому работать, стараться избегать with, в степе писать как можно меньше (по возможности конечно), весь код разбивать по событиям желательно (к примеру у тебя из Step'а можно убрать все что связано с нажатием клавиш, и перенести это в события именно нажатия,а не шага). Все это не критично, но в целом влияет на удобность, читаемость кода, производительность и прочие вещи.
Добавлено (06 марта 2017, 15:03) --------------------------------------------- Code_Bryant,
Цитата
Так я же в третьем сообщении обновил код исходя из советов Интернета)
Извини, я только твой код рассматривал, который в топике.
Цитата
Алгоритм всетаки Ваш я бы очень хотел почитать.
Так я же его весь и описал! Тебе осталось только все это в GM вбить.
Добавлено (06 марта 2017, 15:07) --------------------------------------------- Code_Bryant,
Цитата
Так я же в третьем сообщении обновил код исходя из советов Интернета)