degortg, в примере используется всего один объект типа Sprite. Для различных элементов игры используются кадры анимации, скорость которой равна 0 (т.е. анимация не проигрывается).
Суть в том, что у каждой копии спрайта есть переменная ID. В нее мы изначально записываем (в каждую копию отдельно) номер кадра анимации, элемент которого эта копия будет показывать (начиная с 0). Ну т.е. на кадре анимации №1 (втором по счету) у нас желтый человечек. Мы в переменную ID записываем 1, на кадре анимации №2 - зеленый монстр, в переменной ID этой копии лежит значение 2 и т.д. для каждой копии спрайта (причем попарно).
Дальше выставляем кадр анимации всех копий на 0 (т.е. самый первый кадр - с синим квадратом). Теперь, если мы нажали на одну из копий (в тот момент, когда Temp = -1, т.е. изначальное состояние игры), то мы в эту переменную Temp записываем значение из переменной ID, и выставляем кадр анимации, равный переменной ID. Поскольку Temp изменился (теперь он либо равен 1, либо 2 и т.д. - одним словом, больше 0), то игра перешла во второе состояние (т.е. подчиняется действиям в событии Temp > 0). Здесь же, при нажатии на копию спрайта, кадр анимации которой равен 0 (т.е. при нажатии на синий квадрат), мы сравниваем значение переменной ID этого спрайта и то, что записано в переменной Temp. Если они равны, то система переходит в состояние -2 (Temp = -2), и соответственно выполняется условие ожидания 0,8 сек и удаление этих двух копий, в ином случае (ID не равен Temp), игра переходит в состояние -3, т.е. происходит ожидание 0,8 сек и игра возвращается в исходное состояние (Temp = -1).
На самом деле, мне очень нравится использовать глобальные переменные в качестве некоторых переключателей/тумблеров состояния программы. Т.е. события проверки этих переменных ограничивают набор некоторых действий для каждого состояния игры.
