My version (which I believe was also converted from BlitzMax) :
// --------------------------------- //
// Project: Test1
// Start: Tuesday, April 10, 2012
// IDE Version: 11.001
TYPE T3DStar
xPos
yPos
zPos
zVel
FUNCTION Initialise%:
self.xPos=RND(1000)-500.0
self.yPos=RND(1000)-500.0
self.zPos=RND(900)+100
self.zVel=0.5+RND(5)
ENDFUNCTION
ENDTYPE
TYPE T3DStarProcess
screenWidth%;screenHeight%
stars[] AS T3DStar
FUNCTION Initialise%:screenWidth%,screenHeight%
LOCAL s AS T3DStar
self.screenWidth%=screenWidth%
self.screenHeight%=screenHeight%
DIM self.stars[500]
self.Reset()
RETURN TRUE
ENDFUNCTION
FUNCTION Finish%:
DIM self.stars[0]
ENDFUNCTION
FUNCTION Display%:
LOCAL s AS T3DStar
LOCAL c
ALPHAMODE -1.0
FOREACH s IN self.stars[]
c=((255-((s.zPos*255.0)*0.001))*s.zVel)*0.2
SETPIXEL ((s.xPos/s.zPos)*100.0)+(self.screenWidth%*0.5), _
((s.yPos/s.zPos)*100.0)+(self.screenHeight%*0.5), _
RGB(c,c,c)
NEXT
ENDFUNCTION
FUNCTION Process%:speed
LOCAL s AS T3DStar
FOREACH s IN self.stars[]
DEC s.zPos,s.zVel*speed
IF s.zPos<1.0
s.Initialise()
ENDIF
NEXT
ENDFUNCTION
FUNCTION Reset%:
LOCAL loop%
FOR loop%=0 TO BOUNDS(self.stars[],0)-1
self.stars[loop%].Initialise()
NEXT
ENDFUNCTION
ENDTYPE