Идея хорошая. реализация отчасти правильна. только есть несколько "но".
1) Почему вещественный ID?
2) вот вариант через handle, во первых удобнее, во вторых нет поля ID у родительского объекта (точнее нет пользовательского поля, мы пользуемся "неявным"), ну и наконец, мы отбрасываем ту мизерную вероятность возникновения дублирующего ID.

; Надеюсь, _здесь_ комментарии не нужны?
Graphics3D 800,600,32,2
SetBuffer BackBuffer()
SeedRnd MilliSecs()
cam = CreateCamera()
lit = CreateLight()
RotateEntity lit, 0,80,34
PositionEntity cam, 0,0,-30
;----------------
; Главный тип, содержащий поле из типа "coords"
Type player
Field img
Field pos.coords
End Type
; Подтип. ID-поля нужны для "синхронизации" главного типа и подтипа.
Type coords
Field ID
Field x#
Field y#
End Type
;----------------
; Генерим 30 спрайтов, и объектов соответственно
For c=1 To 30
p.player = New player
p\img = CreateSprite()
p\pos.coords = New coords ; Обращаемся непосредственно к подтипу
p\pos\x = Rand(-40,40)
p\pos\y = Rand(-40,40)
p\pos\ID = Handle(p) ; присваиваем ID подобъекта настоящий ID родителя
; Начальная расстановка
PositionEntity p\img,p\pos\x,p\pos\y,0
EntityColor p\img,Rand(255),Rand(255),Rand(255)
Next
;----------------
While Not KeyDown(1)=True
;----------------
; Обращаемся к типу и его подтипу, вычисляем новые значения а также применяем их...
; не забыв "синхронизировать" (;
For p.player = Each player
For p\pos.coords = Each coords
If Handle(p) = p\pos\ID Then ;ето лучше перенисти сюда, если ребенок не связан с текущим объектом, то вообще забудем про него
p\pos\x = p\pos\x-0.003*Sgn(p\pos\x)
p\pos\y = p\pos\y-0.003*Sgn(p\pos\y)
PositionEntity p\img,p\pos\x,p\pos\y,0
EndIf
Next
Next
;----------------
RenderWorld()
Flip
Wend
End ; no comments for this block. . .
;----------------
остались проблемы с полным перебором, но ето хз как обойти на блице. даже через "хитрозакрученну жопу"©Билл Гейтс ето не сделать