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 =...