RetroBASIC

Retrogamecoding(.org) => Examples => Topic started by: Rick3137 on November 10, 2015, 07:29:46 PM

Title: Rotating Cube
Post by: Rick3137 on November 10, 2015, 07:29:46 PM
    Since Pulsar seems to lack a 3D system like opengl, I have become interested in pre-windows methods for faking 3D.
    What I have so far is just simple Isometric drawing. I might not make it all the way to real 3d, but at least it is interesting.
    The rotating cube idea would give me something to build a Rubik's Cubic on . I hope it is not too big a problem to solve.

Code: [Select]

   -- Written by Rick3137.   Tested on Windows10
win = openwindow ("Start",-1,-1,1200,700)
setactivewindow (win)
backcolor (0,0,0,255)
cls()

sync()
    x=0 ; y=0 ; f= 0 ; x1=0 ; y1 = 0 ; Ang = 0 ; r = 500
    Pi = math.pi ; AngleS = Pi / 180 -- Angle Segment equal to 1.0 degrees
    px = {0,0,0,0,0,0,0,0,0,0}    --  Point X
    py = {0,0,0,0,0,0,0,0,0,0}    --  Point Y
    Ang = { 0,0,0,0 }             -- Holds the 4 bottom cube angles           
    color (255,225,255,100)

function DrawQuad( cx,cy,radius, Ang1)
          --Ang1 moves from 0 to 200
          local Angle = 0 ; a1 = Pi / 180 ; x2=0 ; y2=0 ; x3=400 ; y3 = 400
          Ang[1] = Ang1     
       for a=0,360 do
           Angle = a * AngleS
           x2 = cos(Angle) * radius + cx
           y2 = -.3 * sin(Angle) * radius + cy
           --dot(x2,y2)
           Ang[2] = Ang1 + 90 ; Ang[3] = Ang1 + 180 ; Ang[4] = Ang1 + 270
                for b=1,4 do
                    if (Ang[b] > 360 ) then
                        Ang[b] = Ang[b] - 360
                    end
                    if (a == Ang[b] ) then      -- start at 45
                         px[b] =  x2  ; py[b] = y2
                    end
                end
       
       end
       DrawLines(radius)
end

function DrawLines(radius)
       line( px[1], py[1], px[2], py[2] ) ;line( px[2], py[2], px[3], py[3] ) ;line( px[3], py[3], px[4], py[4] )
       line( px[1], py[1], px[4], py[4] )
       line( px[1], py[1] - radius, px[2], py[2] - radius ) ;line( px[2], py[2] - radius, px[3], py[3] - radius )
       line( px[3], py[3] - radius, px[4], py[4] - radius ) ; line( px[1], py[1] - radius, px[4], py[4] - radius )     
       line( px[1], py[1], px[1], py[1] - radius ) ; line( px[2], py[2], px[2], py[2] - radius )
       line( px[3], py[3], px[3], py[3] - radius ) ; line( px[4], py[4], px[4], py[4] - radius )
       
       drawtext ( Ang1,0,30)
       sync()
       --wait( 100)
end

   color (100,100,0,255)

  a = 45 ; cnt = 0 ; key = 200
    while key > 100 do
        color (0,0,0,255)
        --cls()
        fillrectangle( 0,40,1000,700 )
        color (255,255,255,255)
        DrawQuad( 400,400,200,a )   -- x,y,radius,angle
        wait(5)
        sync()
        a = a + 1 ; cnt = cnt + 1
        if (a>360) then
           a = a - 360
        end
        key = getkey()
        drawtext ("Press any key to exit ..",0,0)
        sync()
     end
sync()
closewindow(win)
closeapplication()