Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- -- title: Ray-casting test
- -- desc: Simple 3D test
- -- script: lua
- -- input: gamepad
- screenWidth=240;screenHeight=136
- mapWidth=30;mapHeight=17
- player={x=0,y=0,angle=0,walkSpeed=1,angleSpeed=0.1}
- found=false
- for x=0,mapWidth-1 do
- for y=0,mapHeight-1 do
- if(mget(x,y)==5)then
- player.x=x*8
- player.y=y*8
- found=true;break
- end
- end
- if(found)then break end
- end
- function sget(x,y)
- x=math.floor(x);y=math.floor(y)
- local addr=0x4000+(x//8+y//8*16)*16
- return peek4(addr*2+x%8+y%8*8)
- end
- function TIC()
- --Player movement
- if btn(2)then player.angle=player.angle-player.angleSpeed end
- if btn(3)then player.angle=player.angle+player.angleSpeed end
- if btn(0)then --Forwards
- player.x=player.x+(math.cos(player.angle)*player.walkSpeed)
- player.y=player.y+(math.sin(player.angle)*player.walkSpeed)
- elseif btn(1)then --Backwards
- player.x=player.x-(math.cos(player.angle)*player.walkSpeed)
- player.y=player.y-(math.sin(player.angle)*player.walkSpeed)
- end
- --Drawing
- cls()
- maxRange=300
- for x=0,screenWidth-1 do
- rayX=player.x+(math.cos(player.angle+(math.pi/2))*5*((x/screenWidth)-.5))
- rayY=player.y+(math.sin(player.angle+(math.pi/2))*5*((x/screenWidth)-.5))
- rayAngle=player.angle+(((x/screenWidth)-.5)*2)
- rayDistance=0
- hit=false
- for i=0,maxRange do
- stepSize=0.1+((i/maxRange)*2)
- rayX=rayX+(math.cos(rayAngle)*stepSize)
- rayY=rayY+(math.sin(rayAngle)*stepSize)
- rayDistance=rayDistance+stepSize
- tile=mget(rayX/8,rayY/8)
- if(tile==2 or tile==3)then
- side=math.floor((((math.atan(((rayY/8)%1)-.5,((rayX/8)%1)-.5)/(math.pi*2))-0.125)%1)*4)
- hit=true
- break
- end
- end
- for y=0,screenHeight-1 do
- wallHeight=((screenHeight/2)/rayDistance)*8
- if(hit and math.abs(y-(screenHeight/2))<wallHeight)then
- if(side==0)then
- xTexture=rayX
- elseif(side==1)then
- xTexture=rayY
- elseif(side==2)then
- xTexture=-rayX
- elseif(side==3)then
- xTexture=-rayY
- end
- pix(x,y,sget((tile*16)+(xTexture%8),(((y-((screenHeight/2)-wallHeight))/(wallHeight*2))*8)))
- end
- end
- end
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement