Page 1 of 1

Classic Ship Demo

Posted: Tue Jun 23, 2015 10:58 am
by DrChip

Code: Select all

rem The Ship Demo
rem iPhone 6 plus / iOS 9 b1 / 4.9
rem Enjoy...
'3D Routine... 
'This one uses a hidden line algorithm
'to take away the need for depth sorting... 
'It's much quicker than other methods but 
'less flexible.


gosub initialize
debug=-1
loop:
refresh off
   fill color 20/255,10/255,10/255
    fill tri 0,0 , sw,sh , 0,sh
    fill tri 0,0 , sw,sh , sw,0
   fill color 0,0,10/255
    fill tri 0,sh-140 , sw,sh , 0,sh
    fill tri 0,sh-140 , sw,sh , sw,sh-140 

    gosub cobra

draw color 0,0,0
draw text "SHIP DEMO" at 0,4
draw rect 3,3 to sw-3,23
draw text mid$(s$,p,67) at scx+3,sh/2+3
draw color 1,1,1
draw text "SHIP DEMO" at 0,0
draw rect 0,0 to sw,20
draw text mid$(s$,p,67) at scx,sh/2

scx=scx-1
if scx<-10 then
 scx=scx+10
 p=p+1
 if p>len(s$)-1 then p=0
end if


if debug>0 then
draw color 250/255,250/255,250/255
for a=1 to polys
draw text str$(a) at tx(a),ty(a)
next a
end if
refresh on
goto loop


cobra:
    gosub rotate
    r=80 ! g=20 ! b=20
    f1=1 ! f2=3 ! f3=2 
    gosub draw
    gosub draw2

    r=90 ! g=30 ! b=30
    f1=2 ! f2=3 ! f3=4 
    gosub draw
    gosub draw2

    r=100 ! g=100 ! b=200
    f1=3 ! f2=5 ! f3=4 
    gosub draw
    gosub draw2

    r=90 ! g=30 ! b=30
    f1=4 ! f2=5 ! f3=6
    gosub draw
    gosub draw2

    r=80 ! g=20 ! b=20
    f1=5 ! f2=7 ! f3=6
    gosub draw
    gosub draw2

    r=10 ! g=40 ! b=10
    f1=9 ! f2=3 ! f3=1
    gosub draw
    gosub draw2

    r=10 ! g=40 ! b=10
    f1=5 ! f2=10 ! f3=8
    gosub draw
    gosub draw2

    r=10 ! g=40 ! b=10
    f1=9 ! f2=10 ! f3=3
    gosub draw
    gosub draw2

    r=10 ! g=20 ! b=10
    f1=10 ! f2=5 ! f3=3
    gosub draw
    gosub draw2

    r=10 ! g=20 ! b=10
    f1=7 ! f2=5 ! f3=8
    gosub draw
    gosub draw2

    r=100 ! g=0 ! b=0
    f1=1 ! f2=2 ! f3=9
    gosub draw
    gosub draw2

    r=100 ! g=0 ! b=0
    f1=7 ! f2=8 ! f3=6
    gosub draw
    gosub draw2

    r=40 ! g=40 ! b=40
    f1=2 ! f2=4 ! f3=9
    gosub draw
    gosub draw2

    r=40 ! g=40 ! b=40
    f1=4 ! f2=6 ! f3=8
    gosub draw
    gosub draw2

    r=60 !g=65 ! b=60
    f1=9 ! f2=4 ! f3=8
    gosub draw
    gosub draw2
return
draw:
'Draw A Face Of The Ship
  vx1= tx(f1)-tx(f2)
  vy1= ty(f1)-ty(f2)
  vx2= tx(f3)-tx(f2)
  vy2= ty(f3)-ty(f2)
  if  (vx1*vy2-vx2*vy1)<0 then
light=-(tz(f1)+tz(f2)+tz(f3))*4
fill color (r+light)/255,(g+light)/255,(b+light)/255
fill tri tx(f1),ty(f1) , tx(f2),ty(f2) , tx(f3),ty(f3)
end if
return

draw2:
'Draw inverted Face Of The Ship
  vx1= tx(f1)-tx(f2)
  vy1= ty(f1)-ty(f2)
  vx2= tx(f3)-tx(f2)
  vy2= ty(f3)-ty(f2)
  if  (vx1*vy2-vx2*vy1)<0 then
light=-(tz(f1)+tz(f2)+tz(f3))*3
fill color (r+light)/255,(g+light)/255,(b+light+20)/255
fill tri tx(f1),ry(f1) , tx(f2),ry(f2) , tx(f3),ry(f3)
end if
return


rotate:
'Rotate And Scale Each Point Store Result
 for a=1 to polys
  x1=x(a)
  y1=y(a)
  z1=z(a)
'X,Y,Z rotations
  xx=x1
  yy=y1*cs(xr)+z1*sn(xr)
  zz=z1*cs(xr)-y1*sn(xr)
  y1=yy
  x1=xx*cs(yr)-zz*sn(yr)
  z1=xx*sn(yr)+zz*cs(yr)
  zz=z1
  xx=x1*cs(zr)-y1*sn(zr)
  yy=x1*sn(zr)+y1*cs(zr)
'Apply Perspective
  xx=size*(xx/((zz/50)+1))+sw/2
  yy=size*(yy/((zz/50)+1))+sh/2-80
  tx(a)=xx
  ty(a)=yy
  ry(a)=(-(yy/3))+sh 
  tz(a)=zz
 next a
xr=xr+4
yr=yr+2
zr=zr+2
if xr>720 then xr=xr-720
if yr>720 then yr=yr-720
if zr>720 then zr=zr-720
return

initialize:
'This Sub-Routine Initializes The Program.
'Open Gfx Screen
graphics
sw=screen_width()
sh=screen_height()
s$="                                                                    "
s$=s$&"THIS SPACESHIP SHOULD BE INSTANTLY FAMILIAR TO "
s$=s$&"ANYONE WHO PLAYED THE CLASSIC GAME 'ELITE' BY "
s$=s$&"THE GENIUS DAVID BRABEN... I REMEMBER THIS GAME "
s$=s$&"FROM THE BBC AND COMMODORE 64, A REAL CLASSIC... "
s$=s$&"I WANTED A DIFFERENT OBJECT TO SHOWCASE MY NEWEST "
s$=s$&"3D ROUTINE, WHICH IS BLINDINGLY QUICK... I WAS A " 
s$=s$&"BIT BORED WITH CUBE DERIVATIVES SO I THOUGHT "
s$=s$&"I'D MODEL AN ELITE SPACESHIP, I ALSO ADDED "
s$=s$&"THE REFLECTION AND SCROLL AND IT'S STILL ZIPPING "
s$=s$&"ALONG AT FULL FRAME RATE, FULLY LIGHTSOURCED WITH "
s$=s$&"INDEPENDANTLEY COLORED FACES, THERE'S SO MUCH "
s$=s$&"SPARE PROCESOR TIME THAT I LEFT MY DEBUG MODE IN "
s$=s$&"HERE, TO TOGGLE THE DEBUG JUST ADJUST "
s$=s$&"THE DEBUG VAR... I USE THIS WHEN I'M CONNECTING UP "
s$=s$&"THE VERTICES OF THE OBJECT DURING ITS' CREATION.. "
s$=s$&"EVERYONE ELSE WHO KNOWS ME   " 
s$=s$&"SEE YOU ALL NEXT TIME, BYE......       "
scx=0
p=0
'Define the necessary variables
size=13.5 ' how big do you want it?
pi=3.1415 '            Double buffering Variable
polys=10 '        The amount of points in the object
dim x(polys+1) '  Original X co-ordinate store
dim y(polys+1) '  Original Y co-ordinate store
dim z(polys+1) '  Original Z co-ordinate store
dim tx(polys+1) ' Transformed  X co-ordinate store
dim ty(polys+1) ' Transformed Y co-ordinate store
dim tz(polys+1) ' Transformed Z co-ordinate store
dim ry(polys+1) ' Inverted Y co-ord store (reflection).
'Define Sine Tables
 dim cs(721)
 dim sn(721)
 for ang=0 to 720
  cs(ang)=cos(ang*(pi/360))
  sn(ang)=sin(ang*(pi/360))
 next ang
'Read in the object
for a=1 to polys
 read x(a),y(a),z(a)
next a
'The Object Description As Data
'The Data Below Describes the Ship.
data -15,-10,0,-5,-10,5,-5,10,0
data 0,-10,5,7,10,0,5,-10,5
data 15,-10,0
data 5,-10,-5,-5,-10,-5,0,-10,-5
return

Re: Classic Ship Demo

Posted: Sun Jun 28, 2015 7:06 pm
by Dav
Another nice demo. I remember that ship!

- Dav