Game Maker - щелчок мышью image_index Проверка

У меня есть этот спрайт: spr_meteoriteLv3, который имеет два подизображения с индексом image_index 0 и 1 соответственно.

У меня есть эти объекты: obj_meteoriteLv3, obj_tempMeteoriteLv3, а также obj_score, объект obj_meteoriteLv3 появляется сверху со случайным положением, случайным количеством и случайным изображением. объект obj_tempMeteoriteLv3 марки obj_meteoriteLv3спавн Когда игрок нажимает на метеорит, программа проверяет значение image_index для этого объекта.

obj_meteoriteLv3 имеет эти события:

Создать событие: изменить sprite_index в spr_meteoriteLv3и начните двигаться вниз.

Событие левой кнопки мыши: уничтожить self экземпляр и проверить image_index: если image_index == 0 затем score += 5; еще score -= 5).

obj_tempMeteoriteLv3 имеет эти события:

Создать событие: установите Alarm 0 на 3600, установите переменную exist в 1 и установите переменную add до 1.

Тревога 0: установить переменную add до 0 и уничтожить obj_meteoriteLv3 пример.

Тревога 1: установить переменную exist до 1.

Шаг Событие: если (exist == 1) тогда, если (add == 1) затем создать экземпляр obj_meteoriteLv3установить переменную exist 0 и установите Alarm 1 на 10.

obj_score имеет эти события:

Создать событие: установить score до 0.

Draw Event: нарисовать значение score,

Проблема в том, какой суб-образ метеорита image_index При нажатии счет всегда будет увеличиваться на 5 баллов. Это как else условие не работает. Как я могу это исправить? Пожалуйста, объясните свой ответ. Благодарю.

Я добавляю несколько изображений для лучшего понимания. Ссылка 1. Ссылка 2

2 ответа

В obj_meteoriteLv3 он уничтожается до того, как сможет выполнить оставшиеся блоки кода. Переместите "Уничтожить экземпляр" вниз.

В obj_tempMeteoriteLv3 обе переменные "добавить" и "существовать" не нужны, вместо этого есть

Создать событие-

Тревога [0] = 3600

тревога [1] = 10

Тревога [0] Событие-

destroy_instance

Тревога [1] Событие

Create_instance of obj_meteoriteLv3

тревога [1] = 10

Потенциально, когда вы нажимаете, каждый метеорит срабатывает. При событии щелчка левой кнопкой мыши по метеориту вы не проверяли, был ли курсор на спрайте. Вы должны использовать функцию position_meeting, которой вы передаете положение мыши и экземпляр, который нужно щелкнуть. это будет выглядеть так:

if (position_meeting(mouse_x, mouse_y, id))
{
    //your destroy code
}

Более того, когда instance_destroy(); строка читается, следующий код игнорируется, и программа переходит к destroy_event. Уильям хорошо объяснил это и предложил изменить порядок строк кода, но вы также можете напрямую изменить счет в событии уничтожения.

Я хотел бы добавить, что проверка на клики в каждом случае метеоритов не является оптимальной для производительности.

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

Ваше событие клика будет выглядеть так:

with (instance_position(mouse_x, mouse_y, obj_meteoriteLv3))
{
    instance_destroy();
}

и в событии уничтожения метеорита вы должны проверить image_index и соответственно изменить счет.

РЕДАКТИРОВАТЬ: почему счет не меняется

Я считаю, что вы объявили счет не как глобальную переменную, а как переменную экземпляра. Поэтому, когда вы пишете "оценка = ..." в другом объекте, он создает новую переменную оценки, не связанную с прецедентом.

У вас есть 2 варианта:

1 - Объявите счет глобальной переменной в событии create объекта obj_score:

глобальная оценка;
оценка = // ваш начальный счет

Помните, что глобальная переменная не может быть установлена ​​в строке инициализации.

2 - Изменить счет через объект оценки:

всякий раз, когда оценка должна измениться:

obj_score.score =...

Другие вопросы по тегам