i got it to compile by stopping it from running certain lines when the array indeces would be invalid (x or y > size or x or y < 0) but it ran so slowly i couldn't even move my mouse :/
Here's my modified version of digger's code. Why it runs so slow is prolly the massive size of everything.. if you can run this full speed digger i want ur pc
(or my pc's graphics are playing up again :\)
sync on
backdrop on
sync rate 40
set camera range 50,10000
set ambient light 40
gosub make_car
gosub make_texture
gosub make_desert
color backdrop RGB(0,0,64)
fog on
fog color RGB(0,0,64)
fog distance 9000
accel#=1
speed#=0
brake#=2
gfric#=0.5
x#=7500.0
z#=7500.0
oldm_x=2
oldm_z=2
do
if upkey()
speed#=speed#+accel#
else
if downkey()
speed#=speed#-brake#
else
speed#=speed#-gfric#
endif
endif
if speed#<=0 then speed#=0
if speed#>60 then speed#=60
if speed#>0 then yr#=wrapvalue(yr#+rightkey()-leftkey())
x#=x#+sin(yr#)*speed#
z#=z#+cos(yr#)*speed#
y#=get ground height(1,x#,z#)
cx#=x#-sin(yr#)*500
cz#=z#-cos(yr#)*500
cy#=y#+200
pos_bugy(x#,y#,z#,yr#)
position object 1,x#,y#+25,z#
position camera cx#,cy#,cz#
point camera x#,y#,z#
if spacekey() then end
sync
loop
end
make_car:
`create the "car" thingy
make object box 1,40,30,100
color object 1,RGB(128,128,0)
make object sphere 2,20: scale object 2,400,20,20: make mesh from object 1,2
add limb 1,1,1: add limb 1,2,1
delete object 2: delete mesh 1
make object sphere 2,40: scale object 2,50,100,100: make mesh from object 1,2
for k=3 to 6: add limb 1,k,1: next k
offset limb 1,1,0,-10,-35: color limb 1,1,RGB(255,255,255)
offset limb 1,2,0,-10,35: color limb 1,2,RGB(255,255,255)
offset limb 1,3,35,-10,-35: color limb 1,3,RGB(0,0,0)
offset limb 1,4,-35,-10,-35: color limb 1,4,RGB(0,0,0)
offset limb 1,5,35,-10,35: color limb 1,5,RGB(0,0,0)
offset limb 1,6,-35,-10,35: color limb 1,6,RGB(0,0,0)
delete object 2
delete mesh 1
`create arrays for wheel positioning and axis rotation
`4 - number of wheels
`5 - x,y,z position plus 2 angles(x,z)
dim w_pos#(4,5)
return
make_desert:
`matrix tile count and smoothing value
size=600
smooth=5
factor#=3
dim hm#(size,size)
dim nhm#(size,size)
`generate random height table
randomize timer()
for y=0 to size
for x=0 to size
c=rnd(255)
hm#(x,y)=c
next x
next y
`smoothing process (my english is sooo rusty...)
for k=1 to smooth
for y=0 to (size)
for x=0 to (size)
if x < size and x > 0 and y < size and y > 0
tot#=hm#(x-1,y-1)+hm#(x-1,y)+hm#(x-1,y+1)
tot#=tot#+hm#(x,y-1)+hm#(x,y+1)+hm#(x+1,y-1)
tot#=tot#+hm#(x+1,y)+hm#(x+1,y+1)
tot#=tot#/8.0
tot#=(tot#+hm#(x,y))/2.0
endif
nhm#(x,y)=tot#`it ought to use the same one as the last loop, just to give it a valid value :)
next x
next y
`update height table
for y=0 to (size)
for x=0 to (size)
hm#(x,y)=nhm#(x,y)
next x
next y
next k
`raise height by a factor
for y=0 to size
for x=0 to size
nhm#(x,y)=nhm#(x,y)*factor#
next x
next y
`wrapping the edges
for tile=0 to (size)
tot#=(nhm#(0,tile)+nhm#((size),tile))/2.0
nhm#(0,tile)=tot#
nhm#((size),tile)=tot#
tot#=(nhm#(tile,0)+nhm#(tile,(size)))/2.0
nhm#(tile,0)=tot#
nhm#(tile,(size))=tot#
next tile
`creating the matrix
make matrix 1,100000,100000,size,size
prepare matrix texture 1,1,1,1
fill matrix 1,0,1
for y=0 to (size)
for x=0 to (size)
set matrix height 1,x,y,nhm#(x,y)
next x
next y
`normalise (or something like that. too lazy to properly do it)
for y=0 to (size)
for x=0 to (size)
if x < size and x > 0 and y < size and y > 0
nx#=nhm#(x+1,y)-nhm#(x,y)
nz#=nhm#(x,y+1)-nhm#(x,y)
nx#=-1*cos(atanfull((100000/size),nx#))
nz#=-1*cos(atanfull((100000/size),nz#))
ny#=0.1
endif
set matrix normal 1,x,y,nx#,ny#,nz#`it ought to use the same one as the last loop, just to give it a valid value :)
next x
next y
update matrix 1
return
make_texture:
ink RGB(176,133,2),0
box 1,1,128,128
`creating the sand texture
`its an effort to estimate values that should create
`several shades of orange-yellow.
`the slow way as always. couldn't be bothered.
for k=1 to 5000
shadeR=rnd(70)
red=150+shadeR
shadeG=(6*shadeR)/7
green=124+shadeG
shadeB=shadeR/7
blue=18+shadeB
dot rnd(128),rnd(128),rgb(red,green,blue)
next k
get image 1,1,1,128,128
return
Function Pos_bugy(x#,y#,z#,yr#)
`conviniently enough the distance from the center of the car
`to each wheel axis is 35, as is the distance of each wheel
`from the center of the respective axis. ain't that nice?
`front axis (center)
fax#=x#+sin(yr#)*35
faz#=z#+cos(yr#)*35
`rear axis
rax#=x#-sin(yr#)*35
raz#=z#-cos(yr#)*35
`front wheels
`right
frwa#=wrapvalue(yr#+90)
fwrx#=fax#+sin(frwa#)*35
fwrz#=faz#+cos(frwa#)*35
`left
flwa#=wrapvalue(yr#-90)
fwlx#=fax#+sin(flwa#)*35
fwlz#=faz#+cos(flwa#)*35
`rear wheels
`right
rrwa#=wrapvalue(yr#+90)
rwrx#=rax#+sin(rrwa#)*35
rwrz#=raz#+cos(rrwa#)*35
`left
rlwa#=wrapvalue(yr#-90)
rwlx#=rax#+sin(rlwa#)*35
rwlz#=raz#+cos(rlwa#)*35
`find heights for each wheel and calculate axis angles
`this should be fun...
frwh#=get ground height(1,fwrx#,fwrz#)
flwh#=get ground height(1,fwlx#,fwlz#)
rrwh#=get ground height(1,rwrx#,rwrz#)
rlwh#=get ground height(1,rwlx#,rwlz#)
`what a magnificent mess:)
xd#=70 `this is not the real x distance but without the angle i cannot find it.
yd#=frwh#-flwh#
faza#=wrapvalue(90-atanfull(xd#,yd#))
set object rotation zyx 1
rotate object 1,0,yr#,faza#
Endfunction
New site!