Четверг, 26 Декабря 2024, 18:00

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

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 2
  • 1
  • 2
  • »
Не работает смена координат
Code_BryantДата: Вторник, 28 Февраля 2017, 03:11 | Сообщение # 1
частый гость
Сейчас нет на сайте
Всем привет.
Странно ведет себя код.
В отладчике не меняются координаты объекта.

Суть вот в чем:
Есть герой и есть автомобиль.
При нажатии 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
ИнтернетДата: Вторник, 28 Февраля 2017, 22:49 | Сообщение # 2
постоянный участник
Сейчас нет на сайте
Вот писал не в 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
Code_BryantДата: Понедельник, 06 Марта 2017, 03:54 | Сообщение # 3
частый гость
Сейчас нет на сайте
Интернет, я переписал код по твоему примеру



но координаты персонажа все равно не меняются когда едешь в машине

Добавлено (06 марта 2017, 03:54)
---------------------------------------------
Уточню, что все происходит в Step евенте. Возможно, что-то нужно перенести в step end?




Сообщение отредактировал Code_Bryant - Воскресенье, 05 Марта 2017, 18:15
mlpmmoДата: Понедельник, 06 Марта 2017, 08:29 | Сообщение # 4
YBRONY
Сейчас нет на сайте
Берешь Scirra construct и не паришься делаешь, все равно дальше гцупа игра не пойдет.

Простая арифметика (Web игра)
Raven84Дата: Понедельник, 06 Марта 2017, 11:56 | Сообщение # 5
старожил
Сейчас нет на сайте
mlpmmo,
Цитата
Берешь 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 освоил. Только сейчас пилю игрушку, в которой хочу проверить все свои навыки.


Добавлено (06 марта 2017, 11:56)
---------------------------------------------
Так что удачи вам в обучении!


Super Knight Story (в разработке)
Idolzzz - игра доступна в Steam и Play Market
Oliver's Adventures in the Fairyland


Сообщение отредактировал Raven84 - Понедельник, 06 Марта 2017, 12:10
Code_BryantДата: Понедельник, 06 Марта 2017, 13:11 | Сообщение # 6
частый гость
Сейчас нет на сайте
Цитата Raven84 ()
Убрать всю эту галиматью и сделать просто управление отдельно машиной, отдельно героем.
Но предварительно, введите к примеру глобальную переменную 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 и все характеристики сбросятся или Вы знаете как с этим бороться?





Сообщение отредактировал Code_Bryant - Понедельник, 06 Марта 2017, 13:14
Raven84Дата: Понедельник, 06 Марта 2017, 14:32 | Сообщение # 7
старожил
Сейчас нет на сайте
Code_Bryant, Еще раз повторюсь! Если нужна помощь, то прислушивайся к советам, а не критикуй, тем более, что знаком с Game Maker'ом 2-3 недели всего!
Вот этой фразой ты можешь вывести кого угодно, даже меня, хотя я очень спокойный человек:
Цитата
Так что не стоит думать, что это все не работает из-за того, что я не в том месте прописал x=obj_car.x и y=obj_car.y.

Пойми, твой код не работает не из за того, что ты это не там прописал, а из за того, что он в корне не верен. И я не думаю, я знаю. Ладно бы я на GM сам месяц поработал, я же на нем работаю, повторюсь, уже более пяти лет и даже делаю коммерческие игры, на продажу. Или ты делал его по примеру?
Еще раз повторюсь, перепиши код, как я тебе посоветовал и все будет работать как часы.
Цитата
Единственное, при удалении объекта и создании его снова сработает событие Create и все характеристики сбросятся или Вы знаете как с этим бороться?

Ну если решил пойти по этому пути,т.е. удалять объект и создавать его снова, то можно к примеру все характеристики записывать так же в глобальные переменные или считывать их с файла.


Super Knight Story (в разработке)
Idolzzz - игра доступна в Steam и Play Market
Oliver's Adventures in the Fairyland
Code_BryantДата: Понедельник, 06 Марта 2017, 14:34 | Сообщение # 8
частый гость
Сейчас нет на сайте
Raven84, Спасибо. Сорян за негатив. День не задался

Raven84Дата: Понедельник, 06 Марта 2017, 14:36 | Сообщение # 9
старожил
Сейчас нет на сайте
Что касается вашего кода, то он вообще не оптимизирован!
Код
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:37 | Сообщение # 10
частый гость
Сейчас нет на сайте
Цитата Raven84 ()
К примеру зачем тут два раза проверять нажата ли клавиша?! %) Я честно не понимаю. Ну точнее я понимаю, что делает этот код, но я не понимаю зачем так!


Это временное решение для того что бы это
Код

            audio_sound_gain(snd_step, 0.1, 0);
            if(!audio_is_playing(snd_step)){
                audio_play_sound(snd_step, 1, true);
            }


один раз прописать, а не в каждом шаге.


Raven84Дата: Понедельник, 06 Марта 2017, 14:45 | Сообщение # 11
старожил
Сейчас нет на сайте
Code_Bryant, У тебя это и так прописано в шаге, что значит "один раз прописать, а не в каждом шаге" ? Ты имеешь в виду, чтобы это один раз только выполнялось?

Добавлено (06 марта 2017, 14:45)
---------------------------------------------
Вообще, судя по ролику у тебя шаги как-то странно звучат. Т.е. звук шага звучит лишь один раз, когда только ты начинаешь двигаться в каком-нибудь направлении. Ты так и хотел? Не логичнее бы было, чтобы пока ты двигаешься, звуки шагов звучали постоянно?


Super Knight Story (в разработке)
Idolzzz - игра доступна в Steam и Play Market
Oliver's Adventures in the Fairyland
Code_BryantДата: Понедельник, 06 Марта 2017, 14:47 | Сообщение # 12
частый гость
Сейчас нет на сайте
Цитата Raven84 ()
У тебя это и так прописано в шаге, что значит "один раз прописать, а не в каждом шаге" ? Ты имеешь в виду, чтобы это один раз только выполнялось?


Оооооо.... Я догнал в чем дело с этими координатами и где косячина с перемещениями...
Не сарказм)
Спасибо, дружище!))

Я, кажется, писал код в тумане. Сейчас сел переосмыслил и догнал что куда и где моя логика была все это время))


Raven84Дата: Понедельник, 06 Марта 2017, 14:49 | Сообщение # 13
старожил
Сейчас нет на сайте
Code_Bryant, Ты скажи одно, ты сам код понимаешь или просто скачал или делаешь по примеру? Мне это важно знать. В этом нет ничего такого. Я сам когда-то начинал с чужих исходников. Так я смогу более четкие тебе советы давать. Если ты код не понимаешь, тогда тебе полностью весь код нужно скидывать, если понимаешь, тогда я могу тебе просто принцип действия подсказывать, т.е. алгоритм, а код ты сам напишешь под него. Так какой вариант?

Добавлено (06 марта 2017, 14:49)
---------------------------------------------
Code_Bryant,

Цитата
Оооооо.... Я догнал в чем дело с этими координатами и где косячина с перемещениями...

Ну потом скинешь сюда рабочий код? В любом случае тебе его нужно менять/оптимизировать. Там много лишнего.


Super Knight Story (в разработке)
Idolzzz - игра доступна в Steam и Play Market
Oliver's Adventures in the Fairyland
Code_BryantДата: Понедельник, 06 Марта 2017, 14:49 | Сообщение # 14
частый гость
Сейчас нет на сайте
Цитата Code_Bryant ()
Вообще, судя по ролику у тебя шаги как-то странно звучат

Там плохо слышно, они все время звучат, но я все равно перепишу, что б лишние разы события клавиш и прочего не дергать


Raven84Дата: Понедельник, 06 Марта 2017, 14:51 | Сообщение # 15
старожил
Сейчас нет на сайте
Code_Bryant,
Цитата
Оооооо.... Я догнал в чем дело с этими координатами и где косячина с перемещениями...

Рад за тебя. Ну скинешь сюда рабочий вариант кода. Может другим полезно будет узнать в чем проблема была. На чужих ошибках проще учиться. А код тебе все равно нужно менять/оптимизировать. Очень много лишнего.


Super Knight Story (в разработке)
Idolzzz - игра доступна в Steam и Play Market
Oliver's Adventures in the Fairyland
Code_BryantДата: Понедельник, 06 Марта 2017, 14:52 | Сообщение # 16
частый гость
Сейчас нет на сайте
Цитата Code_Bryant ()
ы скажи одно, ты сам код понимаешь или просто скачал или делаешь по примеру? Мне это важно знать. В этом нет ничего такого. Я сам когда-то начинал с чужих исходников. Так я смогу более четкие тебе советы давать. Если ты код не понимаешь, тогда тебе полностью весь код нужно скидывать, если понимаешь, тогда я могу тебе просто принцип действия подсказывать, т.е. алгоритм, а код ты сам напишешь под него. Так какой вариант?

Понимаю))
Связан с программированием по работе, а тут меня что-то клинит


Raven84Дата: Понедельник, 06 Марта 2017, 14:56 | Сообщение # 17
старожил
Сейчас нет на сайте
Code_Bryant,
Цитата
Как Вы могли бы заметить если бы читали мой код, там как раз используется глобальная булева переменная global.in_car.

Ну в твоем коде не видно, что она глобальная. По нему похоже на локальную:
Код
) {
    if (in_car == false) {
        if (keyboard_check(ord('W'))) y -= walk_speed;
        if (keyboard_check(ord('S'))) y += walk_speed;


Super Knight Story (в разработке)
Idolzzz - игра доступна в Steam и Play Market
Oliver's Adventures in the Fairyland
Code_BryantДата: Понедельник, 06 Марта 2017, 15:00 | Сообщение # 18
частый гость
Сейчас нет на сайте
Цитата Raven84 ()
Ну в твоем коде не видно, что она глобальная. По нему похоже на локальную

Так я же в третьем сообщении обновил код исходя из советов Интернета)

Добавлено (06 марта 2017, 15:00)
---------------------------------------------
Raven84, Алгоритм всетаки Ваш я бы очень хотел почитать.
Всетаки, совет от человека с опытом не каждый день получишь.
Блин, звучит как сарказм опять, но это не так)


Raven84Дата: Понедельник, 06 Марта 2017, 15:07 | Сообщение # 19
старожил
Сейчас нет на сайте
Code_Bryant,
Цитата
Связан с программированием по работе, а тут меня что-то клинит

Ну это возможно, что по работе пишешь на одном языке, а тут совсем другой. Порой такое бывает. Сложно сначала привыкнуть и перестроиться.
Я проблему вижу как раз в том, что ты программируешь как обычно, т.е. весь код у тебя идет в одном месте сплошняком. В GM как раз лучше по другому работать, стараться избегать with, в степе писать как можно меньше (по возможности конечно), весь код разбивать по событиям желательно (к примеру у тебя из Step'а можно убрать все что связано с нажатием клавиш, и перенести это в события именно нажатия,а не шага). Все это не критично, но в целом влияет на удобность, читаемость кода, производительность и прочие вещи.

Добавлено (06 марта 2017, 15:03)
---------------------------------------------
Code_Bryant,

Цитата
Так я же в третьем сообщении обновил код исходя из советов Интернета)

Извини, я только твой код рассматривал, который в топике.
Цитата
Алгоритм всетаки Ваш я бы очень хотел почитать.

Так я же его весь и описал! :D Тебе осталось только все это в GM вбить.

Добавлено (06 марта 2017, 15:07)
---------------------------------------------
Code_Bryant,

Цитата
Так я же в третьем сообщении обновил код исходя из советов Интернета)

Сейчас его просмотрел взглядом, но там еще хуже все! :D %)
Ты в событии шага объекта через with обращаешься к нему же! Это вообще незачем!
Ну как по мне тут явные проблемы перехода с обычного кода на особенности кода в GM. Я изначально почти так же делал, когда с Бэйсика переучивался! :D
Все со временем и с опытом прийдет.


Super Knight Story (в разработке)
Idolzzz - игра доступна в Steam и Play Market
Oliver's Adventures in the Fairyland
Code_BryantДата: Понедельник, 06 Марта 2017, 15:08 | Сообщение # 20
частый гость
Сейчас нет на сайте
Raven84, Хорошо!) Спасибо за советы, ты лучший!))



Сообщение отредактировал Code_Bryant - Понедельник, 06 Марта 2017, 15:09
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск:

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