Сообщение от Devilox
for...each я пробовал и функцию отдельную делал, но я не могу понять, как в этом случае мне выделять отдельные объекты и для каждого прописывать координаты...
|
ты пули создаёшь, и ставишь им координату, так же и тут:
;1й блок
local b.blocks = New blocks
b\ent = CopyEntity(block)
;сохраняем в имени объекта "указатель на тип", который позволит
;без перебора в цикле получить доступ к объекту типа
NameEntity (b\ent, Handle(b))
PositionEntity b\ent, 0, -6, 5
;2й блок
b.blocks = New blocks
b\ent = CopyEntity(block)
NameEntity (b\ent, Handle(b))
PositionEntity b\ent, 0, -2, -15
;и так далее
для обработки коллизии игрока с блоками не нужно пробегать в цикле по блокам, т.к. можно сделать проверку коллизии не блоков с игроком, а игрока с блоками. При этом пригодятся команды
Handle и Object:
Local blockEntity% = EntityCollided(player, Tblock)
If (blockEntity<>0)
;получаем "указатель на тип", который заранее сохранили в имени энтити
Local b.blocks = Object.blocks (EntityName (blockEntity))
FreeEntity (blockEntity)
Delete (b)
EndIf
а если надо по порядковому номеру (index) или идентификатору (id) получить объект из списка, то можно такие функции применить:
Function getBlockByIndex.blocks(index%)
Local b.blocks
Local i%=0
For b = Each blocks
If(i = index) Return b
i = i+1
Next
Return Null
End Function
Function getBlockById.blocks(id%)
Local b.blocks
For b = Each blocks
If(b\id = id) Return b
Next
Return Null
End Function
предварительно добавив в тип blocks поле id%.
Я рекомендую по стилю вот что:
- типы называй начиная с заглавной буквы T: TBullet, TBlock и т.д.
- типы коллизий объявляй константой и большими буквами, как сделано для пуль:
Const TYPE_PLAYER = 1
Const TYPE_BLOCK = 2
Const TYPE_BULLET = 3