Code archives/Algorithms/Isometric
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
I started trying to figure out how to do an isometric tile engine a while back. but due to the lack of free time I been having, I neglected it for other interest. So far, I got the placement of tiles and movement. I sort of worked a sorting algorith but I am not shure it is the best solution. anyway here it is. if somebody finds ways to make it better, I would appreciate if improvements were posted here. as always you can download an executable and source compressed file here: http://www.filefront.com/user/ChuyP | |||||
Framework BRL.GLMax2D Import BRL.Math Import BRL.Random SuperStrict Type Tcolor Field red :Int Field green :Int Field blue :Int End Type Type Tiso Field _x :Int Field _y :Int Field xOrigin :Int Field yOrigin :Int Field posx :Float Field posy :Float Field Lcolor :Tcolor Field Lwidth :Int Field Lalpha :Float Field xs2657 :Float Field ys2657 :Float Field xScreenSize :Int Field yScreenSize :Int Field poly4 :Float[8] Method New() '2:1 ratio width to height xs2657 = Cos(26.57) ys2657 = Sin(26.57) Lcolor = New Tcolor End Method Method init() ' --- initialization -------------------------------- xScreenSize = GraphicsWidth() yScreenSize = GraphicsHeight() xOrigin = xScreenSize / 2 yOrigin = yScreenSize - 30 End Method ' transforms x,y,z coordinates into 2d x coordinate Method xFla:Float (x:Float, y:Float, z:Float) ' cartesian coordinates Local xCart:Float = (x - z) * xs2657 Return xCart+xOrigin End Method ' transforms x,y,z coordinates into 2d y coordinate Method yFla:Float (x:Float, y:Float, z:Float) ' cartesian coordinates Local yCart:Float = y + (x + z) * ys2657 Return -yCart + yOrigin End Method Method lineStyle(w:Int,c:Int,A:Float) Lwidth = w Lalpha = a Lcolor.red = (c Shr 16) & $FF Lcolor.green = (c Shr 8) & $FF Lcolor.blue = c & $FF SetLineWidth Lwidth SetAlpha Lalpha SetColor Lcolor.red,Lcolor.green,Lcolor.blue End Method ' --- lineToing methods -------------------------------- Method style(w:Int, c:Int, a:Float) ' w: line width ' c: line color ' a: line alpha lineStyle(w, c, a) End Method Method moveTo(x:Float,y:Float) posx = x posy = y Plot(posx,posy) End Method Method Plott(x:Float, y:Float, z:Float) moveTo(xFla(x, y, z), yFla(x, y, z)) End Method Method lineTo(x:Float,y:Float,z:Float) Local x2:Float = xFla(x,y,z) Local y2:Float = yFla(x,y,z) DrawLine posx, posy, x2, y2 posx = x2 posy = y2 End Method Method LineSegment(x:Float,y:Float,z:Float,x1:Float,y1:Float,z1:Float) plott(x,y,z) lineTo(x1,y1,z1) End Method Method rectangle(x:Float, y:Float, z:Float, a:Float, b:Float, c:Float, color:Int) If c = 0 style(1, color, 1) poly4[0] = xFla(x, y, z) poly4[1] = yFla(x, y, z) poly4[2] = xFla(x+a, y, z) poly4[3] = yFla(x+a, y, z) poly4[4] = xFla(x+a, y+b, z) poly4[5] = yFla(x+a, y+b, z) poly4[6] = xFla(x, y+b, z) poly4[7] = yFla(x, y+b, z) DrawPoly poly4 ElseIf b = 0 style(1, color, 1) poly4[0] = xFla(x, y+b, z) poly4[1] = yFla(x, y+b, z) poly4[2] = xFla(x+a, y+b, z) poly4[3] = yFla(x+a, y+b, z) poly4[4] = xFla(x+a, y+b, z+c) poly4[5] = yFla(x+a, y+b, z+c) poly4[6] = xFla(x, y+b, z+c) poly4[7] = yFla(x, y+b, z+c) DrawPoly poly4 Else style(1, color, 1) poly4[0] = xFla(x, y, z) poly4[1] = yFla(x, y, z) poly4[2] = xFla(x, y+b, z) poly4[3] = yFla(x, y+b, z) poly4[4] = xFla(x, y+b, z+c) poly4[5] = yFla(x, y+b, z+c) poly4[6] = xFla(x, y, z+c) poly4[7] = yFla(x, y, z+c) DrawPoly poly4 EndIf End Method Method box (x:Float, y:Float, z:Float, a:Float, b:Float, c:Float, color:Int) style(1, color, 1) Plott(x, y, z) lineTo(x+a, y, z) lineTo(x+a, y+b, z) lineTo(x, y+b, z) lineTo(x, y, z) Plott(x, y+b, z) lineTo(x+a, y+b, z) lineTo(x+a, y+b, z+c) lineTo(x, y+b, z+c) lineTo(x, y+b, z) Plott(x, y, z) lineTo(x, y+b, z) lineTo(x, y+b, z+c) lineTo(x, y, z+c) lineTo(x, y, z) End Method 'draws a box Method boxFilled(x:Float, y:Float, z:Float, a:Float, b:Float, c:Float, color:Int) style(1, color, 1) poly4[0] = xFla(x, y, z) poly4[1] = yFla(x, y, z) poly4[2] = xFla(x+a, y, z) poly4[3] = yFla(x+a, y, z) poly4[4] = xFla(x+a, y+b, z) poly4[5] = yFla(x+a, y+b, z) poly4[6] = xFla(x, y+b, z) poly4[7] = yFla(x, y+b, z) DrawPoly poly4 'facing right poly4[0] = xFla(x, y+b, z) poly4[1] = yFla(x, y+b, z) poly4[2] = xFla(x+a, y+b, z) poly4[3] = yFla(x+a, y+b, z) poly4[4] = xFla(x+a, y+b, z+c) poly4[5] = yFla(x+a, y+b, z+c) poly4[6] = xFla(x, y+b, z+c) poly4[7] = yFla(x, y+b, z+c) DrawPoly poly4 'facing up poly4[0] = xFla(x, y, z) poly4[1] = yFla(x, y, z) poly4[2] = xFla(x, y+b, z) poly4[3] = yFla(x, y+b, z) poly4[4] = xFla(x, y+b, z+c) poly4[5] = yFla(x, y+b, z+c) poly4[6] = xFla(x, y, z+c) poly4[7] = yFla(x, y, z+c) DrawPoly poly4 ' facing left box(x,y,z,a,b,c,$ff000000)'draws the box outline End Method ' --- main ------------------------------------------ End Type Type tbox Field x :Int Field y :Int Field z :Int Field dirx :Int Field diry :Int Field dirz :Int Field color :Int Field stp :Int Field box :Tiso Global boxs:Tbox[] Method New() box = New Tiso box.init() stp = 2 boxs = boxs[..boxs.length+1] boxs[boxs.length-1] = Self color = $FFFFFFFF End Method Method initcolor(c:Int) color = c End Method Method getAxis() dirx = 0 diry = 0 dirz = 0 If KeyDown(KEY_LEFT) dirx = -1 * stp ElseIf KeyDown(KEY_RIGHT) dirx = 1 * stp EndIf If KeyDown(KEY_UP) dirz = 1 * stp ElseIf KeyDown(KEY_DOWN) dirz = -1 * stp EndIf If KeyDown(KEY_D) diry = -1 * stp ElseIf KeyDown(KEY_U) diry = 1 * stp EndIf Local lt:Int = x+dirx Local rt:Int = x+dirx+32 Local tp:Int = z+dirz Local bt:Int = z+dirz+32 Local collided:Int = False If y < 32 For Local i:Int = 0 Until boxs.length If boxs[i] = Self Continue Local nlt:Int = boxs[i].x Local nrt:Int = boxs[i].x+32 Local ntp:Int = boxs[i].z Local nbt:Int = boxs[i].z+32 If lt >= nlt And lt =< nrt If tp >= ntp And tp =< nbt collided = True If bt >= ntp And bt =< nbt collided = True ElseIf rt >= nlt And rt =< nrt If tp >= ntp And tp =< nbt collided = True If bt >= ntp And tp =< nbt collided = True EndIf Next End If If collided dirx = 0; dirz = 0 x:+ dirx y:+ diry z:+ dirz If (x<0) x = 0 If (y<0) y = 0 If (z<0) z = 0 If x > 400-32 x = 400-32 If y > 400-32 y = 400-32 If z > 400-32 z = 400-32 End Method Method sort() Local temp:TBox If boxs.length < 2 Then Return For Local i:Int = 0 Until boxs.length-1 If boxs[i].y >= 32 Then temp = boxs[i] boxs[i] = boxs[i+1] boxs[i+1] = temp EndIf If boxs[i].x < boxs[i+1].x-32 Then temp = boxs[i] boxs[i] = boxs[i+1] boxs[i+1] = temp EndIf If boxs[i].z < boxs[i+1].z-32 Then temp = boxs[i] boxs[i] = boxs[i+1] boxs[i+1] = temp EndIf Next End Method Method DrawBox() box.style(1, $FF0000, 1) box.Plott(400, 0, 0) box.lineTo(0, 0, 0) box.lineTo(0, 0, 400) box.lineTo(400,0,400) box.lineto(400,0,0) For Local i:Int = 0 Until boxs.length boxs[i].box.boxfilled(boxs[i].x,boxs[i].y,boxs[i].z,32,32,32,boxs[i].Color) Next ' red line SetColor 255,255,255 DrawText "use arrows, U and D",20,10 DrawText "ESC to exit",20,25 End Method End Type Graphics 800,600 Local iso:Tiso = New Tiso iso.init() Cls ' red line iso.style(1, $FF0000, 1) 'line width, color, alpha iso.Plott(0, 0, 0) ' position start of line iso.lineTo(200, 0, 0) 'continue line to ' green line iso.style(1, $00FF00, 1) iso.Plott(0, 0, 0) iso.lineTo(0, 200, 0) ' blue line iso.style(1, $0000FF, 1) iso.Plott(0, 0, 0) iso.lineTo(0, 0, 200) Flip() WaitKey() ' --- main ------------------------------------------ Cls iso.box(0, 0, 100, 100, 50, 100, $00FF00); iso.boxFilled(100, 0, 0, 100, 50, 100, $FF0000); Flip() WaitKey() Cls ' --- House ------------------------------------------ ' Left wall iso.boxFilled(0, 0, 200, 200, 80, 0, $EE0000) ' Right wall iso.boxFilled(200, 0, 0, 0, 80, 200, $EE0000) ' Floor iso.boxFilled(0, 0, 0, 200, 0, 200, $00BB00) ' Left door iso.boxFilled(80, 0, 200, 40, 60, 0, $CCCCCC) ' Right door iso.boxFilled(200, 0, 80, 0, 60, 40, $CCCCCC) ' blue box iso.boxFilled(100, 0, 130, 30, 60, 30,$0000FF) ' grey box iso.boxFilled(80, 0, 80, 30, 30, 30, $AAAAAA) ' yellow box iso.boxFilled(60, 0, 70, 20, 20, 20, $FFFF00) ' purple box iso.boxFilled(60, 0, 20, 30, 20, 40, $FF00FF) Flip() WaitKey() Cls Local random_colors:Int[] = [$FF0000, $00FF00, $0000FF, $FFFF00, $00FFFF, $FF00FF, $FFFFFF] For Local j:Int = 6 To 0 Step -1 Local random_color:Int = random_colors[j] For Local i:Int = 6 To 0 Step -1 iso.boxFilled(j*32, 0, i*32, 32, Rand(10)*10+10, 32, random_color); Next Next Flip() WaitKey() Local box:tbox = New Tbox box.x = 100 box.z = 100 box.initcolor($FFFF0000) box:tbox = New Tbox box.x = 200 box.z = 150 box.initcolor($FF00FF00) box = New Tbox box.initcolor($FF0000FF) Repeat Cls() box.GetAxis() box.sort() box.DrawBox() Flip() Until KeyDown(key_escape) |
Comments
None.
Code Archives Forum