Положение части головоломки во Flash Jigsaw - PullRequest
0 голосов
/ 31 августа 2011

У меня есть 4 * 4 сетки. У меня 16 мувиклипов, разбросанных по сетке. Каждый мувиклип имеет размер 40 * 40, и его можно перетаскивать. Пользователь может перетащить мувиклипы в сетку. Каждый клип имеет правильную позицию. Например для

клип 0: x = 0, y = 0

клип 1: x = 40, y = 0

клип 2: х = 120, у = 0

клип 3: х = 160, у = 0

клип 15: х = 160, у = 160

Игра заканчивается, когда все клипы находятся в правильном положении. Так что это легко проверить на игру окончена. Используйте цикл и ENTER_FRAME, чтобы отслеживать позиции всех клипов.

Есть небольшая проблема, которую я не могу решить. Когда пользователь перетаскивает клип, он привязывается к положению в сетке, независимо от того, правильно оно или нет. В этом случае позиции, которые можно привязать, будут кратны 40. Возможно закрепление двух клипов в определенном месте, и этого следует избегать. Если я поместил клип в (40,120), я не смог бы поместить туда еще один мувиклип. По сути, я должен быть в состоянии получить некоторое указание, говорящее мне, что эта позиция занята.

Используя указание, я верну мувиклип в исходное положение.

Как этого можно достичь. Точки регистрации MovieClips являются наиболее совершенными.

1 Ответ

2 голосов
/ 31 августа 2011

Несите объект с информацией о занятии 16 полей.Если клип присутствует, установите для соответствующего свойства значение true.Альтернатива: Изящное решение - просто использовать int var и двоичную сумму:

1 = first field
2 = second field
4 = third field
8 = ...

Если первые три позиции заняты, ваша сумма будет 1 + 2 + 4 = 7.

Вы проверяетеесли поле занято следующим образом:

if ((SUM & testFieldNumber) == testFieldNumber) THEN occupied

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

SUM += fieldNumber

Если клип покидает свое поле:

SUM -= fieldNumber

Резюме:

  • Сохранять всегда последнюю действительную позицию каждого из ваших клипов
  • Сохранять заполнение полей (объект или двоичная сумма)
  • Рассчитать возможную позицию клипа (поле), когдапользователь отпускает мышь
  • Если поле свободно: переместить туда клип, сохранить занятие поля (в сумме объекта или корзины).Сохранить новую позицию клипа как последнюю действительную позицию.
  • Если поле занято: переместить клип в прежнюю позицию
  • Когда клип покидает свою прежнюю позицию, обновить список заполнения поля (объект или корзина).сумма)
...