Poor pseudo 3D track

Previous topic - Next topic

MrTAToad

This is a conversion of a BlitzMax pseudo 3D track demo :

Code (glbasic) Select
// --------------------------------- //
// Project: TestTrack
// Start: Wednesday, June 23, 2010
// IDE Version: 8.006

GLOBAL scx=1024,scy=768

GLOBAL pathsize%=1024 // this is the paths TRUE length
GLOBAL multiplier#=50 // this is how much this path is interpolated. (pathsize is multiplied by this)
GLOBAL pathlength#=pathsize*multiplier // this is the virtual paths length.
GLOBAL pathc2#[]; DIM pathc2#[pathsize+1]
GLOBAL pathd2#[]; DIM pathd2#[pathsize+1]
GLOBAL maxcars%=500 // 500 cars at one time on the track!?!?! lower this FOR less ;)
GLOBAL carx#[]; DIM carx#[maxcars+1] // Where on the track the car is (left-right. Values -1 TO +1)
GLOBAL cary#[]; DIM cary#[maxcars+1] // NOT used yet- Maybe add jumping?
GLOBAL carpos#[]; DIM carpos#[maxcars+1] //  where along the path each car is stored
GLOBAL drawcar%[]; DIM drawcar[maxcars+1] // Flag FOR each car- does it get drawn?
GLOBAL drawx%[]; DIM drawx[maxcars+1] // X coordinate FOR drawing car. Set when you set Drawcar[car]=1
GLOBAL drawy%[]; DIM drawy[maxcars+1] // y coordinate FOR drawing car. Set when you set Drawcar[car]=1
GLOBAL drawsz#[]; DIM drawsz#[maxcars+1] // size FOR drawing car. Set when you set Drawcar[car]=1
GLOBAL carspeed#[]; DIM carspeed#[maxcars+1]  // Speed of car. Best results are between 1 AND 2. values 0-2 work good.

SETSCREEN scx,scy,0

// Position the cars randomly
FOR n%=0 TO maxcars
carx#[n]=(RND(16)-8)/10.0 // -.8,.8)
carspeed[n]=(RND(5)-2.5)/10.0 // RND(.6,1.1)
carpos[n]=RND(pathlength)
NEXT

// Generate the level DATA using random info
c#=0
d#=0

targd#=RND(10)-5 // Rand(-5,5)
targc#=RND(10)-5 // Rand(-5,5)
FOR n=0 TO pathlength
IF RND(100)>99 THEN targc#=RND(6)-3;IF RND(10)>5 THEN targc=0
mc#=(c#-targc#)/10.0;IF ABS(mc)>.1 THEN mc=SGN(mc)*.1
c#=c#-mc
IF RND(100)>90 THEN targd#=RND(6)-3;IF RND(10)>2 THEN targd=0
md#=(d#-targd#)/10.0;IF ABS(md)>.1 THEN md=SGN(md)*.1
d#=d#-md
pathc2#[n/multiplier]=c
pathd2#[n/multiplier]=d*.8
NEXT

pathpos#=0

REPEAT

FOR n=1 TO maxcars
IF carx[n]<0 THEN carpos[n]=carpos[n]+carspeed[n]
IF carx[n]>=0 THEN carpos[n]=carpos[n]-carspeed[n]
carpos[n]=MOD(carpos[n],pathlength)
IF carpos[n]<0 THEN carpos[n]=carpos[n]+pathlength
// carpos[n]=carpos[n]drawcar[n]=0 ???
NEXT

pathpos=MOD((pathpos+1),pathlength)
pathpos2#=pathpos

FOR dodraw=0 TO 1
pos#=pathpos
y#=scy
x#=scx/2.0
z#=scx/2.0
d#=10
D2#=10*120.0
oy#=y
miny#=scy
REPEAT
ok=0
d#=d#/(1.03*1.03)
IF ABS(D2)>2
D2=D2/(1.029*1.03)
// D2=// D*120
x1=x-(pathc(pos))-d2
x2=x+(pathc(pos))+d2
dq=0// :IF ABS(d)>.1 THEN dq=1
IF ABS(oy-y)>.01 THEN dq=1
IF y>miny AND oy<=miny
DRAWLINE x1,y,x2,y,RGB(255,255,255)
ENDIF
ENDIF
miny=scy
IF y<=miny
IF dodraw=1
// tarmac colouring
IF INTEGER(MOD(pos/7,2))=0
colour%=RGB(120,120,120)
ELSE
colour%=RGB(80,80,80)
ENDIF
// draw tarmac
IF dq=1

drawquad(x1,y,x2,y,ox2,oy,ox1,oy,colour%)
ENDIF
// grass colouring
IF INTEGER(MOD(pos/4,2))=0
colour%=RGB(0,255,0)
ELSE
colour%=RGB(0,128,0)
ENDIF

IF dq=1
drawquad(0,y,x1,y,ox1,oy,0,oy,colour%)
drawquad(scx,y,x2,y,ox2,oy,scx,oy,colour%)
ENDIF

IF INTEGER(MOD(pos/2,2))=0
colour%=RGB(255,0,0)
ELSE
colour%=RGB(255,255,255)
ENDIF

drawquad(x1-d*8,y,x1+d*8,y,ox1+od#*8,oy,ox1-od*8,oy,colour%)
drawquad(x2-d*8,y,x2+d*8,y,ox2+od*8,oy,ox2-od*8,oy,colour%)

IF INTEGER(MOD(pos/9,2))=0 AND dq=1
drawquad(x-d,y,x+d,y,ox+od#,oy,ox-od#,oy,RGB(255,255,255))
// DRAWLINE x,y,ox,oy
ENDIF

//SetColor 255,255,255

FOR n=1 TO maxcars
// set flag AND store where toDraw the cars!?
IF INTEGER(carpos[n])=pos
drawcar[n]=1
drawx[n]=x+carx[n]*(d2)
drawy[n]=y;drawsz#[n]=d*10
ENDIF
NEXT
ENDIF
ox1=x1
ox2=x2

ox=x
oy=y
IF Floor(oy)=Floor(y)
oy=y+1
ENDIF
od#=d#
ENDIF

IF y<miny THEN miny=y
// Change X value TO make the tracks corners work properly

x=x+(pathc(pos)*(40.0-d)/5.0)
x=x-(pathc(pathpos2)*(40.0-d#)/5.0)

// Change y value TO make the tracks corners work properly AND give perspective
y=y+pathd(pos)*d#
y=y-pathd(pathos2)*d
y=y-d*1.5
IF d<.001  THEN ok=1  // set the OK flag IF weve drawn enough track.
pos=MOD((pos+1),pathlength)

UNTIL ok=1 OR KEY(1)

IF dodraw=0
DRAWRECT 0,0,scx,miny-1,RGB(70,50,200)
ENDIF
NEXT

FOR n=1 TO maxcars
IF drawcar[n]=1
DRAWRECT drawx[n]-drawsz[n]/2.0,drawy[n]-drawsz[n]/2.0,drawsz[n],drawsz[n]/2.0,RGB(255,255,255)
ENDIF
NEXT

//DrawText pathpos,10,10
SHOWSCREEN
UNTIL KEY(1)

END



FUNCTION drawquad%:x1#,y1#,x2#,y2#,x3#,y3#,x4#,y4#,colour%
IF x1<0 THEN x1=0
IF x2<0 THEN x2=0
IF x3<0 THEN x3=0
IF x4<0 THEN x4=0
IF y1<0 THEN y1=0
IF y2<0 THEN y2=0
IF y3<0 THEN y3=0
IF y4<0 THEN y4=0

IF x1>scx THEN x1=scx
IF x2>scx THEN x2=scx
IF x3>scx THEN x3=scx
IF x4>scx THEN x4=scx
IF y1>scy THEN y1=scy
IF y2>scy THEN y2=scy
IF y3>scy THEN y3=scy
IF y4>scy THEN y4=scy

STARTPOLY -1,0
POLYVECTOR x1,y1,x2,y2,colour%
POLYVECTOR x2,y2,x3,y3,colour%
POLYVECTOR x3,y3,x4,y4,colour%
POLYVECTOR x4,y4,x1,y1,colour%
ENDPOLY
ENDFUNCTION

FUNCTION pathc#:pos#
pos=pos/multiplier
pos=MOD(pos,pathsize)
LOCAL pos2
pos2=MOD((pos+1),pathsize)
val1#=pathc2#[Floor(pos)]
val2#=pathc2#[Floor(pos2)]
val3#=pos#-Floor(pos#)
RETURN interpolate(val1#,val2#,val3#)
ENDFUNCTION

FUNCTION pathd#:pos#
pos=pos/multiplier
pos=MOD(pos,pathsize)
LOCAL pos2

pos2=MOD((pos+1),pathsize)
val1#=pathd2#[Floor(pos)]
val2#=pathd2#[Floor(pos2)]
val3#=pos#-Floor(pos#)
// val4#=val1#+(val2#-val1#)*val3#
RETURN interpolate(val1#,val2#,val3#)
ENDFUNCTION

FUNCTION interpolate#:val1#,val2#,decimal#
RETURN val1+(val2-val1)*decimal
ENDFUNCTION

FUNCTION Floor%:value%
RETURN INTEGER(value)
ENDFUNCTION


It works - sort of...  For some reason the track is too thin, is not grey and bends are smooth, so it'll be an interesting project for someone who knows what the hell the code does :)