Here's my wip as it stands so far. The theory works fine as the heightmap actually does "scroll" properly (as best I can tell), but for some reason the terrain changes after each "zone". The heightmap is displayed off to the left of the screen with a red dot indicating the player's position. If you watch this carefully, you can see the terrain scroll appropriately with the player, which is why the changing terrain has got me stumped. I'm probably not lining up my levels of detail properly or something along those lines.
"Zones" are my second problem, but only cause a slight delay on my pc.
Sync On:Sync Rate 60:Autocam Off
Set Camera Range .01,100
Make Object Triangle 200,0,0,0,0,.01,0,0,0,0
Global GSize as Integer
GSize=100
Dim GlobalHeights(GSize,GSize)
Global Part as Integer
Print "Drawing Grass..."
Grass()
Print "Global Heights..."
Establish_Globals()
Update_Terrain(1,1)
Update_Terrain(1,1)
Print "Terrain Done..."
Sync
Position Camera 1000,0,1000
Hide Object 200
Turn Object Right 200,45
lx=1:ly=1
Do
Sprite 2,0,50,2
Set Sprite Alpha 2,100
Control Camera Using Arrowkeys 0,.05,.8
x#=Camera Position X()
z#=Camera Position Z()
y#=Get Terrain Ground Height(1,x#,z#)+.08
Position Camera x#,y#,z#
Position Object 200, Camera Position X(),0,Camera Position Z()
Move Object 200,-128
nx=Object Position X(200)/64
ny=Object Position Z(200)/64
if nx<>lx or ny<>ly or Part>0
Update_Terrain(nx,ny)
lx=nx:ly=ny
Endif
Set Cursor 0,0
rx#=Camera Position X()-Object Position X(1)
rz#=Camera Position Z()-Object Position Z(1)
Print rx#
Print rz#
ink Rgb(255,0,0),0
box rx#/2,rz#/2+50,rx#/2+2,rz#/2+52
Sync
Loop
End
Function Update_Terrain(x,y)
if Part=0
Print "Heightmap..."
Create_Heightmap(x,y)
Part=1
Else
Print "Make Terrain..."
Sync
If Object Exist(1) then Delete Object 1
Make Object Terrain 1
Set Terrain Heightmap 1,"Heightmap.bmp"
Set Terrain Texture 1,3,4
Set Terrain Tiling 1,2
Set Terrain Scale 1,2,.25,2
Set Terrain Split 1,20
Build Terrain 1
Set Object Collision Off 1
Position Object 1,(x)*64,0,(y)*64
Part=0
Endif
Endfunction
Function Establish_Globals()
GlobalHeights(1,1)=Rnd(50)+100
For i=2 to GSize
GlobalHeights(i,1)=rnd(50)+100
adj=GlobalHeights(i-1,1)+rnd(13)-7
GlobalHeights(i,1)=adj
Next i
For i=2 to GSize
GlobalHeights(1,i)=rnd(50)+100
adj=GlobalHeights(1,i-1)+rnd(13)-7
GlobalHeights(1,i)=adj
Next i
For i = 2 to GSize
For j= 2 to GSize
adj=GlobalHeights(i-1,j-1)
adj=adj+GlobalHeights(i,j-1)
adj=adj+GlobalHeights(i-1,j)
adj=adj/3
nh=rnd(13)-7
gh=adj+nh
if gh<0 then gh=0
if gh>200 then gh=200
GlobalHeights(i,j)=gh
Next j
Next i
Sleep 1000
Endfunction
Function Global_Position(n)
Do
if n>0 and n<GSize then Exit
if n<1 then n=n+GSize
if n>GSize then n=n-GSize
Loop
Endfunction n
Function Splotch(h,s)
Lock Pixels
Ink 0,0
Box 200,200,230+s,230+s
c=rnd(7)+h-3
Ink Rgb(c,c,c),0
r=rnd(s/2)+s/4
For i# = 0.0 to 360.0 step 2
x=sin(i#)*r+215+s/2
y=cos(i#)*r+215+s/2
line 207+s/2,207+s/2,x,y
r=r+(rnd(2)-1)
if r>s+15 then r=s+15
m=s-15:If m<2 then m=2
if r<m then r=m
Next i#
Unlock Pixels
Get Image 1,200,200,230+s,230+s
Endfunction
Function Create_Heightmap(x,y)
If Bitmap Exist(1) Then Delete Bitmap 1
Create Bitmap 1,512,512
Set Current Bitmap 1
Ink rgb(128,128,128),0
Box 0,0,199,199
For ny=0 to 5
For nx=0 to 5
xr=x+nx:yr=y+ny
gx=Global_Position(xr)
gy=Global_Position(yr)
TileHeight=GlobalHeights(gx,gy)
Seed=abs(xr*yr)
Randomize Seed
ox=x+(nx*32):oy=y+(ny*32)
mx=x+((nx+1)*32):my=y+((ny+1)*32)
Splotch(TileHeight,32)
Sprite 1,200,200,1
Set Sprite 1,0,1
Set Sprite Alpha 1,200
Paste Sprite 1,ox+rnd(32)-16,oy+rnd(32)-16
Box ox,oy,mx,my
Next nx
Next ny
For ny=0 to 5
For nx=0 to 5
xr=x+nx:yr=y+ny
Seed=abs(xr*yr)
Randomize Seed
ox=x+(nx*32):oy=y+(ny*32)
For i = 1 to rnd(3)+2
sx=ox+rnd(32)-16:sy=oy+rnd(32)-16
h=point(sx,sy)+Rnd(5)-Rnd(5)
Splotch(h,15)
Sprite 1,200,200,1
Set Sprite 1,0,1
Set Sprite Alpha 1,128
Paste Sprite 1,sx,sy
Next i
xr=x+nx:yr=y+ny
Seed=abs(xr*yr)
Randomize Seed
ox=x+(nx*32):oy=y+(ny*32)
for noise=1 to rnd(50)+rnd(50)+rnd(50)+50
noisex=rnd(32)+ox
noisey=rnd(32)+oy
c=point(noisex,noisey)
c=rgbr(c)+(rnd(5)-2)
if c<0 then c=0
if c>255 then c=255
ink rgb(c,c,c),0
dot noisex,noisey
Next noise
Next nx
Next ny
if file exist("Heightmap.bmp") Then Delete File "Heightmap.bmp"
Get Image 2,32,32,159,159,0
Save Image "Heightmap.bmp",2
If Sprite Exist(1) Then Delete Sprite 1
Set Current Bitmap 0
Delete Bitmap 1
Set Current Bitmap 0
Ink Rgb(255,255,255),0
Print "Heightmap Done"
Sync
Endfunction
Function Grass()
If Bitmap Exist(1) Then Delete Bitmap 1
Create Bitmap 1,512,512
Set Current Bitmap 1
Ink Rgb(0,90,0),0
Box 0,0,511,511
g=0
Do
Splotch(180,15)
Sprite 1,200,200,1
Size Sprite 1,rnd(3)+1,Rnd(3)+1
Set Sprite Alpha 1,128
Set Sprite Diffuse 1,0,255,0
Paste Sprite 1,rnd(67)-2,rnd(67)-2
g=g+1
If rnd(500)+500<g Then Exit
Loop
Get Image 3,1,1,64,64,0
Ink Rgb(0,90,0),0
Box 0,0,511,511
g=0
Do
Splotch(rnd(80)+130,30)
Sprite 1,200,200,1
Size Sprite 1,rnd(10)+10,Rnd(10)+10
Set Sprite Alpha 1,64
Set Sprite Diffuse 1,0,255,0
Paste Sprite 1,rnd(75)-10,rnd(75)-10
g=g+1
If rnd(1000)+200<g Then Exit
Loop
Get Image 4,1,1,64,64,0
Set Current Bitmap 0
Delete Bitmap 1
Delete Sprite 1
Endfunction
Open MMORPG: It's your game!