
-----------------------------------
Homer_simpson
Sat Jan 10, 2009 2:17 am

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

-----------------------------------
Homer_simpson
Sat Jan 10, 2009 6:44 pm

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

-----------------------------------
saltpro15
Sat Jan 10, 2009 7:25 pm

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
Mon Jan 12, 2009 2:34 am

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
Mon Jan 12, 2009 9:19 pm

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 :



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

