Тема: Type in Type
Показать сообщение отдельно
Старый 05.01.2008, 17:51   #1
Taugeshtu
scientist.alien
 
Аватар для Taugeshtu
 
Регистрация: 12.02.2007
Сообщений: 2,098
Написано 1,030 полезных сообщений
(для 2,593 пользователей)
Type in Type

В лабораторных условиях после 20-тиминутного мозгового штурма (аж самому смешно) был взращен код, реализующий конструкцию "тип в типе". Люди, использую(овав)ши(/щи)е BlitzMax поймут, насколько это может быть удобно. Так вот, в Blitz3D это все возможно, но вот по поводу удобства... В общем, все как всегда (;

Воть кодь:

; Надеюсь, _здесь_ комментарии не нужны?
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
    Field ID#
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()
    ; выбираем ID... Как видно, шансы совпадения ID->0. Для чего? А сами поразмыслите...
    ; Можно конечно было сделать все через счетчик, но данный метод довольно надежен
    p\ID = Rnd(-2^31,2^31)
        p\pos.coords = New coords    ; Обращаемся непосредственно к подтипу
        p\pos\x = Rand(-40,40)
        p\pos\y = Rand(-40,40)
        p\pos\ID = p\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
    p\pos\x = p\pos\x-0.003*Sgn(p\pos\x)
    p\pos\y = p\pos\y-0.003*Sgn(p\pos\y)
    If p\ID = p\pos\ID Then
        PositionEntity p\img,p\pos\x,p\pos\y,0
    EndIf
Next
Next
;----------------
RenderWorld()
Flip
Wend
End    ; no comments for this block. . .
;----------------
Прощения прошу, если я открываю Америку. Лично мне кажется подобная вещь весьма полезной. Могу и ошибаться.
__________________
Public service announcement: вы можете заблокировать отображение сообщений определённого пользователя, добавив его ник в список игнорируемых.
Tau lab.
We LOVE you. We MADE you.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
tormoz (03.03.2008)