Aily Posted December 24, 2011 Posted December 24, 2011 Long time fighting fith charachter controller don't give good result for my Last Chapter platformer. So Arbuz give me a good idea - make my own AABB collisions engine, because Last Chapter in fact have only box bodies. Hahaha!!!! Now with this i can make movable platforms, accurate to metall attachement player and much more! This is AABB collisions base, maybe someone will be make such platformer Global bodies:TList=CreateList() Type body Field x#,y# ' aa Field w#,h# ' bb Field width# Field height# End Type Function add_body:body(x#,y#,width#,height#) Local b:body=New body b.x=x-width/2 b.y=y-height/2 b.width=width b.height=height b.w=b.x+width b.h=b.y+height ListAddLast bodies,b Return b End Function Function render_bodies() For b:body=EachIn bodies SetColor 255,255,255 DrawRect b.x,b.y,b.width,b.height SetColor 50,50,50 DrawRect b.x+1,b.y+1,b.width-2,b.height-2 Next End Function Function ol(pv#,cv#,nv#) Return cv>pv And cv<nv End Function Function move_body(b:body,x#,y#) nx#=b.x+x ny#=b.y+y nw#=b.w+x nh#=b.h+y fx#=x fy#=y For bb:body=EachIn bodies If bb=b Continue If fx>0 If ol(bb.x,nw,bb.w) Or ol(b.x,bb.x,nw) If ol(bb.y,ny,bb.h) fx=bb.x-b.w If ol(bb.y,nh,bb.h) fx=bb.x-b.w If ol(ny,bb.y,nh) fx=bb.x-b.w If ol(ny,bb.h,nh) fx=bb.x-b.w If bb.y=b.y And b.h=bb.h fx=bb.x-b.w End If End If If fx<0 If ol(bb.x,nx,bb.w) Or ol(nx,bb.w,b.w) If ol(bb.y,ny,bb.h) fx=bb.w-b.x If ol(bb.y,nh,bb.h) fx=bb.w-b.x If ol(ny,bb.y,nh) fx=bb.w-b.x If ol(ny,bb.h,nh) fx=bb.w-b.x If bb.y=b.y And b.h=bb.h fx=bb.w-b.x End If End If If fy>0 If ol(bb.y,nh,bb.h) Or ol(b.y,bb.y,nh) If ol(bb.x,nx,bb.w) fy=bb.y-b.h If ol(bb.x,nw,bb.w) fy=bb.y-b.h If ol(nx,bb.x,nw) fy=bb.y-b.h If ol(nx,bb.w,nw) fy=bb.y-b.h If bb.x=b.x And b.w=bb.w fy=bb.y-b.h End If End If If fy<0 If ol(bb.y,ny,bb.h) Or ol(ny,bb.h,b.h) If ol(bb.x,nx,bb.w) fy=bb.h-b.y If ol(bb.x,nw,bb.w) fy=bb.h-b.y If ol(nx,bb.x,nw) fy=bb.h-b.y If ol(nx,bb.w,nw) fy=bb.h-b.y If bb.x=b.x And b.w=bb.w fy=bb.h-b.y End If End If Next b.x=b.x+fx b.y=b.y+fy b.w=b.w+fx b.h=b.h+fy End Function Graphics 800,600 add_body(410,160,20,240) add_body(50,70,20,140) add_body(50,210,20,140) add_body(230,290,340,20) add_body(130,150,20,100) add_body(280,170,120,20) player=add_body(310,260,20,40) Repeat If KeyHit(KEY_escape) Or AppTerminate() End shift=KeyDown(key_lshift)*200 If KeyDown(key_left) move_body player,-2-shift,0 If KeyDown(key_right) move_body player,2+shift,0 If KeyDown(key_up) move_body player,0,-2-shift If KeyDown(key_down) move_body player,0,2+shift Cls render_bodies Flip 1 Forever Here's compiled EXE, arrows-for move, shift - some speedup movable body (check swept collisions) aabb_collisions.rar Quote "Better" is big enemy of "good"
Pixel Perfect Posted December 24, 2011 Posted December 24, 2011 I like it ... really nice work as usual Aily Quote Intel Core i5 2.66 GHz, Asus P7P55D, 8Gb DDR3 RAM, GTX460 1Gb DDR5, Windows 7 (x64), LE Editor, GMax, 3DWS, UU3D Pro, Texture Maker Pro, Shader Map Pro. Development language: C/C++
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.