I was sitting around last night on my computer and wrote a 2.5D vector map viewer... it has a 2d edit mode and a 2.5d view mode. This is just an early step towards a larger goal... Next I have to work on applying textures, creating floors (I'm thinking polygons), then height differances.
Well, here's what I wrote last night:
controls:
LMB=draw wall (connects to last vector)
RMB=start new vector (not connecting to last vector)
"1"= wall scribble
hold "SPACE" to enter 2.5D mode.
(arrow keys control movement... think "doom")
There's no collision code yet... I think I'll probably use box - > line collision detection.
Oh, and I know it might seem that there'd be a massive slow down with the extra features I'm planning, but I'm just using the blitz2d code as a test and to figure out the maths... I'm hoping to port this over to SDL using DevC++ later on.
Any advice on adding textures or any hints on anything else would be nice.
Well, here's what I wrote last night:
;An early attempt at a 2.5D vector map viewer. ;coded by Kevin Laherty (kalisme) ;written 17/3/08 ; -2d and 2.5d modes. ; -currently unable to do textures. ; -no collision detection yet. ; -still buggy, but nicer than the one I ; wrote yesterday! :) Graphics 320,240,32 SetBuffer BackBuffer() Dim zbuff(320) Const fps = 30 Type vect Field x#,y#,id End Type Type wall Field id1,id2,norm#,fl_p End Type Function add_vector(x#,y#,id#) a.vect = New vect a\x# = x# a\y# = y# a\id = id End Function Function make_wall(id1,id2,norm#,fl_p) a.wall = New wall a\id1 = id1 a\id2 = id2 a\norm# = norm# End Function Function draw_map(cx#,cy#,ca#) For a.wall = Each wall For b.vect = Each vect If a\id1 = b\id Then x1# = b\x#: y1# = b\y# If a\id2 = b\id Then x2# = b\x#: y2# = b\y# Next Color 150,50,150 Line x1,y1,x2,y2 Next Color 0,200,0 Oval cx#-5,cy#-5,10,10 Line cx#,cy#,cx# + Cos(ca#)*10, cy# + Sin(ca#)*10 End Function Function draw_vectors() For a.vect = Each vect Color 0,50,150 Line a\x-2,a\y-2,a\x+2,a\y+2 Line a\x-2,a\y+2,a\x+2,a\y-2 Next End Function Function render_map_test(cx#,cy#,ca#,zoom#) ca#=ca#+90 For a.wall = Each wall For b.vect = Each vect If a\id1 = b\id Then x1# = b\x#: y1# = b\y# If a\id2 = b\id Then x2# = b\x#: y2# = b\y# Next x1# = x1#-cx# x2# = x2#-cx# y1# = y1#-cy# y2# = y2#-cy# tx1# = (Cos(ca#) * x1#) + (Sin(ca#) * y1#) ty1# = (-Sin(ca#) * x1#) + (Cos(ca#) * y1#) tx2# = (Cos(ca#) * x2#) + (Sin(ca#) * y2#) ty2# = (-Sin(ca#) * x2#) + (Cos(ca#) * y2#) x1#=tx1# y1#=ty1# x2#=tx2# y2#=ty2# cull = 0 If y1# > 0 And y2# > 0 Then cull = 1 If cull = 0 tx1# = x1# tx2# = x2# ty1# = y1# ty2# = y2# If ty1# > -1 grad# = Float(x2#-x1#) / Float (y2#-y1#) tx1# = x1# + grad#*(1-y1) ty1# = -1 EndIf dx1# = tx1# * zoom# * (1/Abs(ty1#)) + 160 sc1#=Abs(600/(0-ty1#)) If ty2# > -1 grad# = Float(x2#-x1#) / Float (y2#-y1#) tx2# = x1# + grad#*(1-y1) ty2# = -1 EndIf dx2# = tx2# * zoom# * (1/Abs(ty2#)) + 160 sc2#=Abs(600/(0-ty2#)) Line tx1#+160,ty1#+140,tx2#+160,ty2#+140 Color 255,255,255 Line dx1#,120-sc1#,dx1#,120+sc1# Line dx2#,120-sc2#,dx2#,120+sc2# Line dx1#,120-sc1#,dx2#,120-sc2# Line dx1#,120+sc1#,dx2#,120+sc2# EndIf Next End Function Function render_map(cx#,cy#,ca#,zoom#) ca#=ca#+90 For clear = 0 To 320 zbuff(clear)=0 Next For a.wall = Each wall For b.vect = Each vect If a\id1 = b\id Then x1# = b\x#: y1# = b\y# If a\id2 = b\id Then x2# = b\x#: y2# = b\y# Next x1# = x1#-cx# x2# = x2#-cx# y1# = y1#-cy# y2# = y2#-cy# tx1# = (Cos(ca#) * x1#) + (Sin(ca#) * y1#) ty1# = (-Sin(ca#) * x1#) + (Cos(ca#) * y1#) tx2# = (Cos(ca#) * x2#) + (Sin(ca#) * y2#) ty2# = (-Sin(ca#) * x2#) + (Cos(ca#) * y2#) x1#=tx1# y1#=ty1# x2#=tx2# y2#=ty2# cull = 0 If y1# > 0 And y2# > 0 Then cull = 1 If cull = 0 tx1# = x1# tx2# = x2# ty1# = y1# ty2# = y2# If ty1# > -1 grad# = Float(x2#-x1#) / Float (y2#-y1#) tx1# = x1# + grad#*(1-y1) ty1# = -1 EndIf dx1# = tx1# * zoom# * (1/Abs(ty1#)) + 160 sc1#=Abs(600/(0-ty1#)) If ty2# > -1 grad# = Float(x2#-x1#) / Float (y2#-y1#) tx2# = x1# + grad#*(1-y1) ty2# = -1 EndIf dx2# = tx2# * zoom# * (1/Abs(ty2#)) + 160 sc2#=Abs(600/(0-ty2#)) hx#=dx1# hy#=sc1# lx#=dx2# ly#=sc2# If hx#>lx# tempx#=hx# tempy#=hy# hx=lx# hy=ly# lx#=tempx# ly#=tempy# EndIf grad# = Float(ly#-hy#)/Float(lx#-hx#) For d = hx# To lx# oy# = (hy#+grad# * Float(d-hx# )) If d > 0 Then If d < 320 If zbuff(d) < oy# zbuff(d)=oy# For e = 120-oy# To 120+oy# If e > 0 Then If e < 240 tb= 360/(((120+oy#)-(120-oy#))/((120+oy#)-(120-oy#)-(e-(120-oy#)))) coy#=oy#+(Sin(tb*5)*12)+20 If coy# > 255 Then coy#=255 If coy# < 20 Then coy# = 20 WritePixelFast d, e, (coy# Shl 16) Or (coy# Shl 8) Or coy#, BackBuffer() EndIf Next EndIf EndIf Next EndIf Next End Function add_vector(40,40,1) add_vector(210,50,2) make_wall(1,2,1,0) cam_X#=160 cam_y#=140 cam_ang#=30 nid=2 period = 1000/fps time = MilliSecs()-period While KeyHit(1) = 0 Cls Repeat elapsed=MilliSecs()-time Until elapsed ticks=elapsed/period tween#=Float(elapsed Mod period)/Float(period) For k=1 To ticks time=time+period If KeyDown(200) Then cam_x# = cam_x# + Cos(cam_ang#)*2:cam_y# = cam_y# + Sin(cam_ang#)*2 If KeyDown(208) Then cam_x# = cam_x# + Cos(cam_ang#)*-2:cam_y# = cam_y# + Sin(cam_ang#)*-2 If KeyDown(203) Then cam_ang# = cam_ang#-5 If KeyDown(205) Then cam_ang# = cam_ang#+5 Next If KeyDown(57) Color 0,170,180 Rect 1,1,319,120 Color 50,80,50 Rect 1,120,319,120 LockBuffer BackBuffer() render_map(cam_x#,cam_y#,cam_ang#,90) UnlockBuffer BackBuffer() Color 255,100,120 Text 10,10,"2.5D map viewer" Else draw_map(cam_x#,cam_y#,cam_ang#) draw_vectors() Color 255,255,255 Text 10,10,"2D map editor" Text 10,190,"LMB = draw wall, Text 10,200,"RMB = start with New vector" Text 10,210,"1 = scribble walls, hold SPACE for" Text 10,220,"2.5D view" Plot MouseX(),MouseY() If KeyDown(2) Then nid=nid+1:add_vector(MouseX(),MouseY(),nid):make_wall(nid,nid-1,0,0) If MouseHit(1) Then nid=nid+1:add_vector(MouseX(),MouseY(),nid):make_wall(nid,nid-1,0,0) If MouseHit(2) Then nid=nid+1:add_vector(MouseX(),MouseY(),nid) EndIf Flip Wend
controls:
LMB=draw wall (connects to last vector)
RMB=start new vector (not connecting to last vector)
"1"= wall scribble
hold "SPACE" to enter 2.5D mode.
(arrow keys control movement... think "doom")
There's no collision code yet... I think I'll probably use box - > line collision detection.
Oh, and I know it might seem that there'd be a massive slow down with the extra features I'm planning, but I'm just using the blitz2d code as a test and to figure out the maths... I'm hoping to port this over to SDL using DevC++ later on.
Any advice on adding textures or any hints on anything else would be nice.
