Löysin vnhoilta foorumeilta siitä aavesoturin tekemästä mega mageesta raycasteri topicista tälläisen koodin:
Code: Select all
map = LoadTIL("media/cdm2.til")
ObjectPickable map, ON
player = MakeObject()
ObjectRange player, 10
SetupCollision player, map, 1, 4, 2
Repeat
MoveObject player, (UpKey() - DownKey()) * 2
TurnObject player, (LeftKey() - RightKey()) * 2
DrawGame //piirretaan objektit (eli lähinnä kartta) ensin
cast(player, 400, 300, 60, 1)
Color cbred:Text 0,0,"FPS: "+FPS()
DrawScreen
Forever
Function cast(obj, w, h, fov, qlt#) //objekti josta raycasting tapahtuu, leveys, korkeus, näkökenttä, laatu (1 on paras, meinaa piirrettavan pystysuoran leveyttä)
Color 0, 0, 0
Box 0, 0, w, h //peitetään alue mustalla
oa# = ObjectAngle(obj) - fov * 0.5 //lasketaan vasemman reunimmaisen viivan kulma kamerasta(objektista) nähden
dpdist# = w * 0.5 / Tan(fov * 0.5) //dpdist aka DrawingPlaneDistance(kamerasta)
lines# = RoundUp(w / qlt#) //montako viivaa tarvitaan
For i = 0 To lines
RotateObject obj, oa# + fov * (i / lines#) //käännetään objekti oikeaan kulmaan; tasaisin välein käydään koko näkökenttä läpi
ObjectPick obj //suoritetaan poiminta
dist# = Distance(ObjectX(obj), ObjectY(obj), PickedX(), PickedY()) * Cos(fov * (i / lines#) - fov * 0.5)
//dist# = etäisyys poimittuun kohtaan * cos(poimintakulma objektista nähden)
//tuo * cos(..) poistaa sen kalansilmävääristymän biggrin.gif
If dist#>200 And dist#<455 Then
colorfact#=1.0-(dist-200)/255 //Piirretään "himmenys"
ElseIf dist#>455
colorfact#=-1 //Ei pirretä
Else
colorfact#=1 //Normaali väri
EndIf
If colorfact>-1 //Pirretään jos ollaan näkökentän "Sisällä"
If PickedAngle() = 0 Or PickedAngle() = 180 Then //xsuuntaisista seinistä tehää vähän tummempia
col=Max(Min(100*colorfact,255),0)
Color col,col,col
Else
col=Max(Min(200*colorfact,255),0)
Color col,col,col
EndIf
lheight# = 32 / dist# * dpdist# //viivan_korkeus = seinän_oikea_korkeus / etäisyys_seinästä * pelaajan_etäisyys_piirtotasosta
Box w - i * qlt#, h / 2 - lheight# / 2, qlt#, lheight# //piirretään viiva
EndIf
Next i
RotateObject obj, oa# + fov * 0.5 //käännetään objekti takaisin alkuperäiseen kulmaansa
End Function
Function LoadTIL(file$)
f=OpenToEdit(file)
SeekFile f,824
tw=ReadInt(f):th=ReadInt(f)
mw=ReadInt(f):mh=ReadInt(f)
SeekFile f,FileOffset(f)+4+(mw*mh*4)+4
mappi=MakeMap(mw,mh,tw,th)
For y=1 To mh
For x=1 To mw
EditMap mappi,2,x,y,ReadInt(f)
Next x
Next y
CloseFile f
Return mappi
End Function
Koodin tajuan muuten kohtuullisesti mutta miten ihmeessä siihen saa tekstuurit kun en mikään haka ole TileMappien muokkailussa, se Aavesoturin kartta systeemi on todella helppo käsiteltävä, siihen osaan tekstuurit laittaa
Topikki löytyy täältä
http://www.coolbasic.com/oldforums/inde ... topic=2829
P.S miten niin 3D on cb:llä mahdotonta ei minusta