| 3d version of my 2d space game(incomplete) 
 
	 
	
		| Author | Message |   
		| Homer_simpson 
 
  
 
 
 | 
			
				|  Posted: Sat Jan 10, 2009 2:17 am    Post subject: 3d version of my 2d space game(incomplete) |  |   
				| 
 |  
				| it's still not finished controls are :
 arrow keys to change direction
 w speed up
 s slow down
 a,d are strafe buttons
 
 for now all you can do is chase the other ship in 3d space but i'll update it soon
 
 
 
 
	
		
	 
		| Description: |  |  Download
 |  
		| Filename: | ship.zip |  
		| Filesize: | 283.19 KB |  
		| Downloaded: | 188 Time(s) |  
 |  
				|  |  |   
		|  |  |  
	  
		|  |   
		| Sponsor Sponsor
 
  
   |  |   
		|  |   
		| Homer_simpson 
 
  
 
 
 | 
			
				|  Posted: Sat Jan 10, 2009 6:44 pm    Post subject: Re: 3d version of my 2d space game(incomplete) |  |   
				| 
 |  
				| i realized that in turing this will turn up really slow so i'll remake this in c++ 
 here's version with more airplane like controls
 
 
 
 
	
		
	 
		| Description: |  |  Download
 |  
		| Filename: | box.zip |  
		| Filesize: | 281.04 KB |  
		| Downloaded: | 181 Time(s) |  
 |  
				|  |  |   
		|  |  |  
	  
		|  |   
		| saltpro15 
 
  
 
 
 | 
			
				|  Posted: Sat Jan 10, 2009 7:25 pm    Post subject: Re: 3d version of my 2d space game(incomplete) |  |   
				| 
 |  
				| well, that just made my day.  Can I have a hint as to how you made it?  I'd like to do something like this for my final project |  
				|  |  |   
		|  |  |  
	  
		|  |   
		| Zren 
 
  
 
 
 | 
			
				|  Posted: Mon Jan 12, 2009 2:34 am    Post subject: Re: 3d version of my 2d space game(incomplete) |  |   
				| 
 |  
				| Funky, but what's the point of the game (not that flying around in space isn't awesome)? |  
				|  |  |   
		|  |  |  
	  
		|  |   
		| Homer_simpson 
 
  
 
 
 | 
			
				|  Posted: Mon Jan 12, 2009 9:19 pm    Post subject: Re: 3d version of my 2d space game(incomplete) |  |   
				| 
 |  
				| well i was going to make it a dogfight style game but turing is very slow with graphics specially 3d graphics so i decided to make it with c++, but here's the code if any1's interested : 
 Quote: 
 
 class Homer3Dengine
 export loadarf, loadraw, moveobject, drawobject, camera, obj, movecamera, vector
 type dot :
 record
 x, y, z : real
 end record
 proc assign3d (var d : dot, x, y, z : real)
 d.x := x
 d.y := y
 d.z := z + 10
 end assign3d
 
 type object :
 record
 axy, axz, ayz, cx, cy, cz : real
 maxpoly : int
 poly : array 1 .. 1000, 1 .. 3 of dot
 col : array 1 .. 1000 of int
 end record
 
 var obj : object
 var vector : dot
 
 type cam :
 record
 axy, axz, ayz, cx, cy, cz, zoom : real
 end record
 
 
 var camera : cam
 
 camera.cx := 0
 camera.cy := 0
 camera.cz := 0
 camera.axy := 0
 camera.axz := 0
 camera.ayz := 0
 camera.zoom := 300
 proc loadarf (filename : string)
 var file, i : int := 0
 var x1, y1, z1, x2, y2, z2, x3, y3, z3 : real
 var col : int
 vector.x := 0
 vector.y := 0
 vector.z := -1
 open : file, filename, read
 loop
 exit when eof (file)
 i += 1
 
 read : file, x1, y1, z1, x2, y2, z2, x3, y3, z3, col
 assign3d (obj.poly (i, 1), x1, y1, z1)
 assign3d (obj.poly (i, 2), x2, y2, z2)
 assign3d (obj.poly (i, 3), x3, y3, z3)
 obj.col (i) := col
 end loop
 obj.maxpoly := i
 /*        for i2 : 1 .. obj.maxpoly
 for ii : 1 .. 3
 obj.poly (i2, ii).z += 200
 end for
 end for*/
 obj.axy := 0
 obj.axz := 0
 obj.ayz := 0
 end loadarf
 
 
 proc loadraw (filename : string, lines : int)
 var file : int
 var x1, y1, z1, x2, y2, z2, x3, y3, z3 : real
 open : file, filename, get
 obj.maxpoly := lines
 for i : 1 .. lines
 get : file, x1, y1, z1, x2, y2, z2, x3, y3, z3
 assign3d (obj.poly (i, 1), x1, y1, z1)
 assign3d (obj.poly (i, 2), x2, y2, z2)
 assign3d (obj.poly (i, 3), x3, y3, z3)
 end for
 for i : 1 .. obj.maxpoly
 for ii : 1 .. 3
 obj.poly (i, ii).z += 200
 end for
 end for
 obj.axy := 0
 obj.axz := 0
 obj.ayz := 0
 end loadraw
 
 
 
 proc rotate (OriginX, OriginY : real, var secondpartX, secondpartY : real, Rotaion : real)
 var tempx := (((OriginX - secondpartX) * cosd (Rotaion)) + ((OriginY - secondpartY) * sind (Rotaion)))
 var tempy := (((OriginY - secondpartY) * cosd (Rotaion)) - ((OriginX - secondpartX) * sind (Rotaion)))
 secondpartY := OriginY - tempy
 secondpartX := OriginX - tempx
 end rotate
 
 
 proc findcenter (var x, y, z : real)
 x := 0.0
 y := 0.0
 z := 0.0
 for i : 1 .. obj.maxpoly
 for ii : 1 .. 3
 x += obj.poly (i, ii).x
 y += obj.poly (i, ii).y
 z += obj.poly (i, ii).z
 end for
 end for
 x /= (obj.maxpoly * 3)
 y /= (obj.maxpoly * 3)
 z /= (obj.maxpoly * 3)
 %drawfilloval (round (obj.cx / (obj.cz / camera.zoom)) + 320, round (obj.cy / (obj.cz / camera.zoom)) + 200, 10, 10, 12)
 
 end findcenter
 
 
 
 proc draw3ddot (d1, d2, d3 : dot, c, c2 : int, filled : boolean)
 if d1.z not= 0 and d2.z not= 0 and d3.z not= 0 then
 %    drawline (round (d1.x / (d1.z / camera.zoom)) + 320, round (d1.y / (d1.z / camera.zoom)) + 200, round (d2.x / (d2.z / camera.zoom)) + 320, round (d2.y / (d2.z / camera.zoom)) + 200, c)
 %    drawline (round (d1.x / (d1.z / camera.zoom)) + 320, round (d1.y / (d1.z / camera.zoom)) + 200, round (d3.x / (d3.z / camera.zoom)) + 320, round (d3.y / (d3.z / camera.zoom)) + 200, c)
 %    drawline (round (d2.x / (d2.z / camera.zoom)) + 320, round (d2.y / (d2.z / camera.zoom)) + 200, round (d3.x / (d3.z / camera.zoom)) + 320, round (d3.y / (d3.z / camera.zoom)) + 200, c)
 %drawline (round (obj.cx / (obj.cz / camera.zoom)) + 320, round (obj.cy / (obj.cz / camera.zoom)) + 200, round (d2.x / (d2.z / camera.zoom)) + 320, round (d2.y / (d2.z / camera.zoom)) + 200, 12)
 var xx : array 1 .. 3 of int
 var yy : array 1 .. 3 of int
 xx (1) := round ((d1.x - camera.cx) / ((d1.z - camera.cz) / camera.zoom)) + 320
 xx (2) := round ((d2.x - camera.cx) / ((d2.z - camera.cz) / camera.zoom)) + 320
 xx (3) := round ((d3.x - camera.cx) / ((d3.z - camera.cz) / camera.zoom)) + 320
 yy (1) := round ((d1.y - camera.cy) / ((d1.z - camera.cz) / camera.zoom)) + 200
 yy (2) := round ((d2.y - camera.cy) / ((d2.z - camera.cz) / camera.zoom)) + 200
 yy (3) := round ((d3.y - camera.cy) / ((d3.z - camera.cz) / camera.zoom)) + 200
 Draw.Dot (xx (1), yy (1), white)
 Draw.Dot (xx (2), yy (2), white)
 Draw.Dot (xx (3), yy (3), white)
 end if
 end draw3ddot
 
 proc draw3dpolygon (d1, d2, d3 : dot, c, c2 : int, filled : boolean)
 var draw := false
 if d1.z not= 0 and d2.z not= 0 and d3.z not= 0 then
 %    drawline (round (d1.x / (d1.z / camera.zoom)) + 320, round (d1.y / (d1.z / camera.zoom)) + 200, round (d2.x / (d2.z / camera.zoom)) + 320, round (d2.y / (d2.z / camera.zoom)) + 200, c)
 %    drawline (round (d1.x / (d1.z / camera.zoom)) + 320, round (d1.y / (d1.z / camera.zoom)) + 200, round (d3.x / (d3.z / camera.zoom)) + 320, round (d3.y / (d3.z / camera.zoom)) + 200, c)
 %    drawline (round (d2.x / (d2.z / camera.zoom)) + 320, round (d2.y / (d2.z / camera.zoom)) + 200, round (d3.x / (d3.z / camera.zoom)) + 320, round (d3.y / (d3.z / camera.zoom)) + 200, c)
 %drawline (round (obj.cx / (obj.cz / camera.zoom)) + 320, round (obj.cy / (obj.cz / camera.zoom)) + 200, round (d2.x / (d2.z / camera.zoom)) + 320, round (d2.y / (d2.z / camera.zoom)) + 200, 12)
 var xx : array 1 .. 3 of int
 var yy : array 1 .. 3 of int
 
 if d1.z not= camera.cz and d2.z not= camera.cz and d3.z not= camera.cz and d1.z > camera.cz and d2.z > camera.cz and d3.z > camera.cz then
 xx (1) := round ((d1.x - camera.cx) / ((d1.z - camera.cz) / camera.zoom)) + 320
 xx (2) := round ((d2.x - camera.cx) / ((d2.z - camera.cz) / camera.zoom)) + 320
 xx (3) := round ((d3.x - camera.cx) / ((d3.z - camera.cz) / camera.zoom)) + 320
 yy (1) := round ((d1.y - camera.cy) / ((d1.z - camera.cz) / camera.zoom)) + 200
 yy (2) := round ((d2.y - camera.cy) / ((d2.z - camera.cz) / camera.zoom)) + 200
 yy (3) := round ((d3.y - camera.cy) / ((d3.z - camera.cz) / camera.zoom)) + 200
 for ii : 1 .. 3
 if xx (ii) > 0 and xx (ii) < maxx and yy (ii) > 0 and yy (ii) < maxy then
 draw := true
 else
 draw := false
 end if
 end for
 if draw then
 if filled then
 Draw.FillPolygon (xx, yy, 3, c)
 end if
 Draw.Polygon (xx, yy, 3, c2)
 end if
 end if
 end if
 end draw3dpolygon
 
 proc drawobject (col, col2, typ : int)
 if typ = 1 then
 for i : 1 .. obj.maxpoly
 draw3dpolygon (obj.poly (i, 1), obj.poly (i, 2), obj.poly (i, 3), col, col2, true)
 end for
 end if
 if typ = 2 then
 var cc : real
 for i : 1 .. obj.maxpoly
 cc := (obj.poly (i, 2).z + obj.poly (i, 1).z + obj.poly (i, 3).z) / 3
 draw3dpolygon (obj.poly (i, 1), obj.poly (i, 2), obj.poly (i, 3), (16 + (14 - (round ((cc / 31) mod 14)))), col2, true)
 end for
 end if
 if typ = 3 then
 for i : 1 .. obj.maxpoly
 draw3dpolygon (obj.poly (i, 1), obj.poly (i, 2), obj.poly (i, 3), col, col2, false)
 end for
 end if
 if typ = 4 then
 for i : 1 .. obj.maxpoly
 draw3dpolygon (obj.poly (i, 1), obj.poly (i, 2), obj.poly (i, 3), obj.col (i), col2, true)
 end for
 end if
 if typ = 5 then
 var cc : real
 for i : 1 .. obj.maxpoly
 cc := (obj.poly (i, 2).z + obj.poly (i, 1).z + obj.poly (i, 3).z) / 3
 draw3ddot (obj.poly (i, 1), obj.poly (i, 2), obj.poly (i, 3), (16 + (14 - (round ((cc / 31) mod 14)))), col2, false)
 end for
 end if
 
 end drawobject
 
 proc moveobject (s : string, d : real)
 findcenter (obj.cx, obj.cy, obj.cz)
 case s of
 label "xy" :
 obj.axy += d
 rotate (0, 0, vector.x, vector.y, d)
 
 for i : 1 .. obj.maxpoly
 for ii : 1 .. 3
 rotate (obj.cx, obj.cy, obj.poly (i, ii).x, obj.poly (i, ii).y, d)
 end for
 end for
 label "xz" :
 rotate (0, 0, vector.x, vector.z, d)
 
 obj.axz += d
 for i : 1 .. obj.maxpoly
 for ii : 1 .. 3
 rotate (obj.cx, obj.cz, obj.poly (i, ii).x, obj.poly (i, ii).z, d)
 end for
 end for
 label "yz" :
 rotate (0, 0, vector.y, vector.z, d)
 
 obj.ayz += d
 for i : 1 .. obj.maxpoly
 for ii : 1 .. 3
 rotate (obj.cy, obj.cz, obj.poly (i, ii).y, obj.poly (i, ii).z, d)
 end for
 end for
 label "x" :
 for i : 1 .. obj.maxpoly
 for ii : 1 .. 3
 obj.poly (i, ii).x += d
 end for
 end for
 label "y" :
 for i : 1 .. obj.maxpoly
 for ii : 1 .. 3
 obj.poly (i, ii).y += d
 end for
 end for
 label "z" :
 for i : 1 .. obj.maxpoly
 for ii : 1 .. 3
 obj.poly (i, ii).z += d
 end for
 end for
 label :
 end case
 end moveobject
 
 
 proc movecamera (s : string, d : real)
 findcenter (obj.cx, obj.cy, obj.cz)
 var dis := sqrt (((camera.cx - obj.cx) ** 2) + ((camera.cz - obj.cz) ** 2))
 
 case s of
 label "xy" :
 camera.axy += d
 rotate (0, 0, vector.x, vector.y, d)
 
 for i : 1 .. obj.maxpoly
 
 for ii : 1 .. 3
 rotate (camera.cx, camera.cy, obj.poly (i, ii).x, obj.poly (i, ii).y, d)
 end for
 end for
 label "xz" :
 %vector.x += camera.cx - obj.cx
 %vector.z += camera.cz - obj.cz
 rotate (0, 0, vector.x, vector.z, d)
 %vector.x -= sind (d) * dis
 %vector.z -= cosd (d) * dis
 camera.axz += d
 for i : 1 .. obj.maxpoly
 for ii : 1 .. 3
 rotate (camera.cx, camera.cz, obj.poly (i, ii).x, obj.poly (i, ii).z, d)
 %rotate (camera.cx, camera.cz, vector.x, vector.z, d)
 end for
 end for
 label "yz" :
 camera.ayz += d
 rotate (0, 0, vector.y, vector.z, d)
 for i : 1 .. obj.maxpoly
 for ii : 1 .. 3
 rotate (camera.cy, camera.cz, obj.poly (i, ii).y, obj.poly (i, ii).z, d)
 %rotate (camera.cy, camera.cz, vector.y, vector.z, d)
 end for
 end for
 label "x" :
 camera.cx += d
 label "y" :
 camera.cy += d
 label "z" :
 camera.cz += d
 label "zoom" :
 camera.zoom += d
 if camera.zoom = 0 then
 camera.zoom += d
 end if
 label :
 end case
 end movecamera
 end Homer3Dengine
 
 
 
 
 
 
 
 
 
 
 
 
 
 class MainEngine
 
 export InitiateStars, loadraw, moveobject, drawobject, camera, obj, movecamera
 const MaxStars := 5
 
 type dot :
 record
 x, y, z : real
 end record
 proc assign3d (var d : dot, x, y, z : real)
 d.x := x
 d.y := y
 d.z := z + 10
 end assign3d
 
 type object :
 record
 axy, axz, ayz, cx, cy, cz : real
 maxpoly : int
 poly : array 1 .. 1000, 1 .. 3 of dot
 col : array 1 .. 1000 of int
 end record
 
 var obj : object
 
 type cam :
 record
 axy, axz, ayz, cx, cy, cz, zoom : real
 end record
 
 
 var camera : cam
 
 camera.cx := 0
 camera.cy := 0
 camera.cz := 0
 camera.axy := 0
 camera.axz := 0
 camera.ayz := 0
 camera.zoom := 300
 
 proc InitiateStars ()
 var x1, y1, z1, x2, y2, z2, x3, y3, z3 : real
 var col : int
 for i : 1 .. MaxStars
 for ii : 1 .. 3
 assign3d (obj.poly (i, ii), Rand.Int (-5000, 5000), Rand.Int (-5000, 5000), Rand.Int (50, 5000))
 end for
 obj.col (i) := 0
 obj.maxpoly := i
 end for
 for i2 : 1 .. obj.maxpoly
 for ii : 1 .. 3
 obj.poly (i2, ii).z += 200
 end for
 end for
 obj.axy := 0
 obj.axz := 0
 obj.ayz := 0
 end InitiateStars
 
 
 proc loadraw (filename : string, lines : int)
 var file : int
 var x1, y1, z1, x2, y2, z2, x3, y3, z3 : real
 open : file, filename, get
 obj.maxpoly := lines
 for i : 1 .. lines
 get : file, x1, y1, z1, x2, y2, z2, x3, y3, z3
 assign3d (obj.poly (i, 1), x1, y1, z1)
 assign3d (obj.poly (i, 2), x2, y2, z2)
 assign3d (obj.poly (i, 3), x3, y3, z3)
 end for
 for i : 1 .. obj.maxpoly
 for ii : 1 .. 3
 obj.poly (i, ii).z += 200
 end for
 end for
 obj.axy := 0
 obj.axz := 0
 obj.ayz := 0
 end loadraw
 
 
 
 proc rotate (OriginX, OriginY : real, var secondpartX, secondpartY : real, Rotaion : real)
 var tempx := (((OriginX - secondpartX) * cosd (Rotaion)) + ((OriginY - secondpartY) * sind (Rotaion)))
 var tempy := (((OriginY - secondpartY) * cosd (Rotaion)) - ((OriginX - secondpartX) * sind (Rotaion)))
 secondpartY := OriginY - tempy
 secondpartX := OriginX - tempx
 end rotate
 
 
 proc findcenter (var x, y, z : real)
 x := 0.0
 y := 0.0
 z := 0.0
 for i : 1 .. obj.maxpoly
 for ii : 1 .. 3
 x += obj.poly (i, ii).x
 y += obj.poly (i, ii).y
 z += obj.poly (i, ii).z
 end for
 end for
 x /= (obj.maxpoly * 3)
 y /= (obj.maxpoly * 3)
 z /= (obj.maxpoly * 3)
 %drawfilloval (round (obj.cx / (obj.cz / camera.zoom)) + 320, round (obj.cy / (obj.cz / camera.zoom)) + 200, 10, 10, 12)
 
 end findcenter
 
 
 
 proc draw3ddot (d1, d2, d3 : dot, c, c2 : int, filled : boolean, i : int)
 if d1.z not= 0 and d2.z not= 0 and d3.z not= 0 then
 %    drawline (round (d1.x / (d1.z / camera.zoom)) + 320, round (d1.y / (d1.z / camera.zoom)) + 200, round (d2.x / (d2.z / camera.zoom)) + 320, round (d2.y / (d2.z / camera.zoom)) + 200, c)
 %    drawline (round (d1.x / (d1.z / camera.zoom)) + 320, round (d1.y / (d1.z / camera.zoom)) + 200, round (d3.x / (d3.z / camera.zoom)) + 320, round (d3.y / (d3.z / camera.zoom)) + 200, c)
 %    drawline (round (d2.x / (d2.z / camera.zoom)) + 320, round (d2.y / (d2.z / camera.zoom)) + 200, round (d3.x / (d3.z / camera.zoom)) + 320, round (d3.y / (d3.z / camera.zoom)) + 200, c)
 %drawline (round (obj.cx / (obj.cz / camera.zoom)) + 320, round (obj.cy / (obj.cz / camera.zoom)) + 200, round (d2.x / (d2.z / camera.zoom)) + 320, round (d2.y / (d2.z / camera.zoom)) + 200, 12)
 var xx : array 1 .. 3 of int
 var yy : array 1 .. 3 of int
 if d1.z not= camera.cz and d2.z not= camera.cz and d3.z not= camera.cz and d1.z > camera.cz and d2.z > camera.cz and d3.z > camera.cz then
 xx (1) := round ((d1.x - camera.cx) / ((d1.z - camera.cz) / camera.zoom)) + 320
 xx (2) := round ((d2.x - camera.cx) / ((d2.z - camera.cz) / camera.zoom)) + 320
 xx (3) := round ((d3.x - camera.cx) / ((d3.z - camera.cz) / camera.zoom)) + 320
 yy (1) := round ((d1.y - camera.cy) / ((d1.z - camera.cz) / camera.zoom)) + 200
 yy (2) := round ((d2.y - camera.cy) / ((d2.z - camera.cz) / camera.zoom)) + 200
 yy (3) := round ((d3.y - camera.cy) / ((d3.z - camera.cz) / camera.zoom)) + 200
 for ii : 1 .. 3
 if xx (ii) > 0 and xx (ii) < maxx and yy (ii) > 0 and yy (ii) < maxy then
 Draw.Dot (xx (ii), yy (ii), white)
 else
 assign3d (obj.poly (i, ii), camera.cx + Rand.Int (-4500, 4500), camera.cy + Rand.Int (-2500, 2500), camera.cz + Rand.Int (4000, 5000))
 end if
 end for
 end if
 end if
 end draw3ddot
 
 proc draw3dpolygon (d1, d2, d3 : dot, c, c2 : int, filled : boolean)
 if d1.z not= 0 and d2.z not= 0 and d3.z not= 0 then
 %    drawline (round (d1.x / (d1.z / camera.zoom)) + 320, round (d1.y / (d1.z / camera.zoom)) + 200, round (d2.x / (d2.z / camera.zoom)) + 320, round (d2.y / (d2.z / camera.zoom)) + 200, c)
 %    drawline (round (d1.x / (d1.z / camera.zoom)) + 320, round (d1.y / (d1.z / camera.zoom)) + 200, round (d3.x / (d3.z / camera.zoom)) + 320, round (d3.y / (d3.z / camera.zoom)) + 200, c)
 %    drawline (round (d2.x / (d2.z / camera.zoom)) + 320, round (d2.y / (d2.z / camera.zoom)) + 200, round (d3.x / (d3.z / camera.zoom)) + 320, round (d3.y / (d3.z / camera.zoom)) + 200, c)
 %drawline (round (obj.cx / (obj.cz / camera.zoom)) + 320, round (obj.cy / (obj.cz / camera.zoom)) + 200, round (d2.x / (d2.z / camera.zoom)) + 320, round (d2.y / (d2.z / camera.zoom)) + 200, 12)
 var xx : array 1 .. 3 of int
 var yy : array 1 .. 3 of int
 xx (1) := round ((d1.x - camera.cx) / ((d1.z - camera.cz) / camera.zoom)) + 320
 xx (2) := round ((d2.x - camera.cx) / ((d2.z - camera.cz) / camera.zoom)) + 320
 xx (3) := round ((d3.x - camera.cx) / ((d3.z - camera.cz) / camera.zoom)) + 320
 yy (1) := round ((d1.y - camera.cy) / ((d1.z - camera.cz) / camera.zoom)) + 200
 yy (2) := round ((d2.y - camera.cy) / ((d2.z - camera.cz) / camera.zoom)) + 200
 yy (3) := round ((d3.y - camera.cy) / ((d3.z - camera.cz) / camera.zoom)) + 200
 if filled then
 Draw.FillPolygon (xx, yy, 3, c)
 end if
 Draw.Polygon (xx, yy, 3, c2)
 end if
 end draw3dpolygon
 
 proc drawobject (col, col2, typ : int)
 if typ = 1 then
 for i : 1 .. obj.maxpoly
 draw3dpolygon (obj.poly (i, 1), obj.poly (i, 2), obj.poly (i, 3), col, col2, true)
 end for
 end if
 if typ = 2 then
 var cc : real
 for i : 1 .. obj.maxpoly
 cc := (obj.poly (i, 2).z + obj.poly (i, 1).z + obj.poly (i, 3).z) / 3
 draw3dpolygon (obj.poly (i, 1), obj.poly (i, 2), obj.poly (i, 3), (16 + (14 - (round ((cc / 31) mod 14)))), col2, true)
 end for
 end if
 if typ = 3 then
 for i : 1 .. obj.maxpoly
 draw3dpolygon (obj.poly (i, 1), obj.poly (i, 2), obj.poly (i, 3), col, col2, false)
 end for
 end if
 if typ = 4 then
 for i : 1 .. obj.maxpoly
 draw3dpolygon (obj.poly (i, 1), obj.poly (i, 2), obj.poly (i, 3), obj.col (i), col2, true)
 end for
 end if
 if typ = 5 then
 var cc : real
 for i : 1 .. obj.maxpoly
 cc := (obj.poly (i, 2).z + obj.poly (i, 1).z + obj.poly (i, 3).z) / 3
 draw3ddot (obj.poly (i, 1), obj.poly (i, 2), obj.poly (i, 3), (16 + (14 - (round ((cc / 31) mod 14)))), col2, false, i)
 end for
 end if
 
 end drawobject
 
 proc moveobject (s : string, d : real)
 findcenter (obj.cx, obj.cy, obj.cz)
 case s of
 label "xy" :
 obj.axy += d
 for i : 1 .. obj.maxpoly
 for ii : 1 .. 3
 rotate (obj.cx, obj.cy, obj.poly (i, ii).x, obj.poly (i, ii).y, d)
 end for
 end for
 label "xz" :
 obj.axz += d
 for i : 1 .. obj.maxpoly
 for ii : 1 .. 3
 rotate (obj.cx, obj.cz, obj.poly (i, ii).x, obj.poly (i, ii).z, d)
 end for
 end for
 label "yz" :
 obj.ayz += d
 for i : 1 .. obj.maxpoly
 for ii : 1 .. 3
 rotate (obj.cy, obj.cz, obj.poly (i, ii).y, obj.poly (i, ii).z, d)
 end for
 end for
 label "x" :
 for i : 1 .. obj.maxpoly
 for ii : 1 .. 3
 obj.poly (i, ii).x += d
 end for
 end for
 label "y" :
 for i : 1 .. obj.maxpoly
 for ii : 1 .. 3
 obj.poly (i, ii).y += d
 end for
 end for
 label "z" :
 for i : 1 .. obj.maxpoly
 for ii : 1 .. 3
 obj.poly (i, ii).z += d
 end for
 end for
 label :
 end case
 end moveobject
 
 
 proc movecamera (s : string, d : real)
 case s of
 label "xy" :
 camera.axy += d
 for i : 1 .. obj.maxpoly
 for ii : 1 .. 3
 rotate (camera.cx, camera.cy, obj.poly (i, ii).x, obj.poly (i, ii).y, d)
 end for
 end for
 label "xz" :
 camera.axz += d
 for i : 1 .. obj.maxpoly
 for ii : 1 .. 3
 rotate (camera.cx, camera.cz, obj.poly (i, ii).x, obj.poly (i, ii).z, d)
 end for
 end for
 label "yz" :
 camera.ayz += d
 for i : 1 .. obj.maxpoly
 for ii : 1 .. 3
 rotate (camera.cy, camera.cz, obj.poly (i, ii).y, obj.poly (i, ii).z, d)
 end for
 end for
 label "x" :
 camera.cx += d
 label "y" :
 camera.cy += d
 label "z" :
 camera.cz += d
 label "zoom" :
 camera.zoom += d
 if camera.zoom = 0 then
 camera.zoom += d
 end if
 label :
 end case
 end movecamera
 end MainEngine
 
 
 
 const maxenemy := 10
 
 var chars : array char of boolean
 
 var main : ^MainEngine
 
 
 
 var spike : array 1 .. maxenemy of ^Homer3Dengine
 for i : 1 .. maxenemy
 new Homer3Dengine, spike (i)
 spike (i) -> loadarf ("box.arf")
 spike (i) -> moveobject ("z", Rand.Int (5000, 10000))
 spike (i) -> moveobject ("x", Rand.Int (-500, 500))
 spike (i) -> moveobject ("y", Rand.Int (-500, 500))
 spike (i) -> moveobject ("yz", Rand.Int (0, 360))
 spike (i) -> moveobject ("xz", Rand.Int (0, 360))
 spike (i) -> moveobject ("xy", Rand.Int (0, 360))
 end for
 new MainEngine, main
 
 
 main -> InitiateStars
 colorback (black)
 cls
 View.Set ("offscreenonly")
 color (white)
 
 
 
 
 
 var velocity : real := 40
 var tvelocityx, tvelocityy : real := 0
 
 loop
 Input.KeyDown (chars)
 if chars (KEY_LEFT_ARROW) then
 if tvelocityx < 4 then
 tvelocityx += .4
 end if
 end if
 
 if chars (KEY_RIGHT_ARROW) then
 if tvelocityx > -4 then
 tvelocityx -= .4
 end if
 end if
 
 if chars (KEY_UP_ARROW) then
 if tvelocityy < 4 then
 tvelocityy += .4
 end if
 end if
 
 if chars (KEY_DOWN_ARROW) then
 if tvelocityx > -4 then
 tvelocityy -= .4
 end if
 end if
 if chars ('a') then
 for i : 1 .. maxenemy
 spike (i) -> movecamera ("x", -100)     %moves camera in z axis
 end for
 main -> movecamera ("x", -100)        %moves camera in z axis
 end if
 if chars ('d') then
 for i : 1 .. maxenemy
 spike (i) -> movecamera ("x", 100)     %moves camera in z axis
 end for
 main -> movecamera ("x", 100)        %moves camera in z axis
 end if
 if chars ('w') then
 if velocity < 150 then
 velocity += 4
 end if
 end if
 if chars ('s') then
 if velocity > 10 then
 velocity -= 10
 end if
 end if
 
 for i : 1 .. maxenemy
 end for
 
 for i : 1 .. maxenemy
 spike (i) -> moveobject ("xz", 1)
 spike (i) -> moveobject ("yz", 1)
 
 spike (i) -> moveobject ("x", (spike (i) -> vector.x * 50))       %moves camera in z axis
 spike (i) -> moveobject ("z", (spike (i) -> vector.z * 50))      %moves camera in z axis
 spike (i) -> moveobject ("y", (spike (i) -> vector.y * 50))       %moves camera in z axis
 %spike (i) -> moveobject ("z", cosd (spike (i) -> obj.ayz) * 50)        %moves camera in z axis
 spike (i) -> movecamera ("z", velocity)             %moves camera in z axis
 if tvelocityx not= 0 then
 spike (i) -> movecamera ("xy", tvelocityx)     %moves camera in z axis
 end if
 if tvelocityy not= 0 then
 spike (i) -> movecamera ("yz", tvelocityy)     %moves camera in z axis
 end if
 end for
 main -> movecamera ("z", velocity)                %moves camera in z axis
 if tvelocityy not= 0 then
 main -> movecamera ("yz", tvelocityy)     %moves camera in z axis
 tvelocityy += - (tvelocityy / abs (tvelocityy)) / 5
 end if
 if tvelocityx not= 0 then
 main -> movecamera ("xy", tvelocityx)     %moves camera in z axis
 tvelocityx += - (tvelocityx / abs (tvelocityx)) / 5
 end if
 locate (1, 1)
 %put "Object coords :    ", spike (1) -> vector.x, " / ", spike (1) -> vector.y, " / ", spike (1) -> vector.z, " / "
 % put "Object angles :    ", spike -> obj.axy mod 360, " / ", spike -> obj.axz mod 360, " / ", spike -> obj.ayz mod 360, " / "
 /*put "Camera coords :    ", main -> camera.cx, " / ", main -> camera.cy, " / ", main -> camera.cz, " / "
 put "Camera angles :    ", main -> camera.axy mod 360, " / ", main -> camera.axz mod 360, " / ", main -> camera.ayz mod 360, " / "
 put "Camera zoom :    ", main -> camera.zoom, "X"     %*/
 %    spike -> moveobject ("xz", 1) %rotates the object in xz axis
 %    spike -> moveobject ("yz", 1) %moves object in x axis
 main -> drawobject (2, 2, 5)     %draws the object with color 1 and 10 and in method 1
 
 for i : 1 .. maxenemy
 spike (i) -> drawobject (2, 14, 1)     %draws the object with color 1 and 10 and in method 1
 end for
 View.Update
 %delay (5)
 cls
 end loop
 
 |  
				|  |  |   
		|  |  |  
	  
		|  |   
		|  |  
 |