Buchempfehlung
Visual Basic 6 Kochbuch
Visual Basic 6 Kochbuch
Viele praktische Tipps zum Programmieren mit Visual Basic 6, die sich oft auch auf FB übertragen lassen. [Mehr Infos...]
FreeBASIC-Chat
Es sind Benutzer im FreeBASIC-Chat online.
(Stand:  )
FreeBASIC bei Twitter
Twitter FreeBASIC-Nachrichten jetzt auch über Twitter erhalten. Follow us!

fb:porticula NoPaste

Info
Info / Hilfe
Liste
Übersicht / Liste
Neu
Datei hochladen
Suche
Quellcode suchen
Download
Dateidownload

noch ne kollisionsengine die nich geht, diesmal mit MOVE zusammen

Uploader:Mitgliedflo
Datum/Zeit:24.03.2008 13:52:41

sub move (byref object as TPhysics,d_T as double)
    dim as double dx,dy,laufabstand,wandabstand,j,xtemp,ytemp,wandx,wandy
    dim as byte bx1,by1,bx2,by2,i,bumm
    with object
            .vx=.vx+.ax*d_T
            .vy=.vy+.ay*d_T
            if .vx<0 then .direction=0':.nowmove=-.move
            if .vx>0 then .direction=1':.nowmove=.move
            if .vx=0 and .energy <>0 then .walkstatus=1 else if timer-.walktime>.walkspeed then .walktime=timer:.walkstatus+=1: if .walkstatus>.maxwalkstatus then .walkstatus=1
            .xalt=.x
            .yalt=.y
            dx=.vx*d_T
            dy=.vy*d_T

            if dx<>0 or dy <>0 then
                laufabstand=sqr(dx^2+dy^2)

                if abs(dx)>abs(dy) then 'in genauen schritten exakt in bewegungsrichtung gehen,
                    j=0                 'und sobald er auf einen block (wand) stößt, diese koordinaten merken
                    do
                        xtemp=fix(.x+j)
                        ytemp=fix(.y+(j/dx*dy))

                        bx1=fix((xtemp)/xlen)+1
                        by1=fix((ytemp)/ylen)+1
                        bx2=fix((xtemp+.width)/xlen)+1
                        by2=fix((ytemp-.height)/ylen)+1

                        for i=bx1 to bx2
                            if blocksolid(i,by1) then exit do
                            if blocksolid(i,by2) then exit do
                        next
                        for i=by2 to by1
                            if blocksolid(bx1,i) then exit do
                            if blocksolid(bx2,i) then exit do
                        next
                        j=j+sgn(dx)
                    loop
                    wandx=xtemp:wandy=ytemp
                else
                    j=0
                    do
                        ytemp=fix(.y+j)
                        xtemp=fix(.x+(j/dy*dx))

                        bx1=fix((xtemp)/xlen)+1
                        by1=fix((ytemp)/ylen)+1
                        bx2=fix((xtemp+.width)/xlen)+1
                        by2=fix((ytemp-.height)/ylen)+1

                        for i=bx1 to bx2
                            if blocksolid(i,by1) then exit do
                            if blocksolid(i,by2) then exit do
                        next
                        for i=by2 to by1
                            if blocksolid(bx1,i) then exit do
                            if blocksolid(bx2,i) then exit do
                        next
                        j=j+sgn(dy)
                    loop
                    wandx=xtemp:wandy=ytemp
                end if      'fertig... unten wird der abstand zur wand errechnet
                wandabstand=sqr((.x-wandx)^2+(.y-wandy)^2)
                locate 2,2:?(wandabstand);"|  ";(laufabstand);"|  "
                locate 3,1:?wandx,.x,wandx-.x
                if laufabstand>wandabstand then  'wenn der spieler nu weiter gehen will als er kann:
                    dx=dx*laufabstand/wandabstand'deltaX und deltaY so verkleinern, dass er vor der wand stehen blebt
                    dy=dy*laufabstand/wandabstand
                    bumm=true
                else
                    bumm=false
                end if

                .x=.x+dx
                .y=.y+dy

                if bumm then                    'das ist dazu da, die geschwindigkeiten zu nullen...
                    bx1=fix((.x+1)/xlen)+1      'wenn 1px rechts von den koordinaten die wand war, und vx>0, dann vx=0
                    by1=fix((.y)/ylen)+1        'usw...
                    bx2=fix((.x+1+.width)/xlen)+1
                    by2=fix((.y-.height)/ylen)+1
                    bummtest()
                    if bumm then
                        if .vx>0 then .vx=0
                        if .ax>0 then .ax=0
                        '.x=.x-1
                    end if

                    bx1=fix((.x-1)/xlen)+1
                    'by1=fix((.y)/ylen)+1
                    bx2=fix((.x-1+.width)/xlen)+1
                    'by2=fix((.y-.height)/ylen)+1
                    bummtest()
                    if bumm then
                        if .vx<0 then .vx=0
                        if .ax<0 then .ax=0
                        '.x=.x+1
                    end if

                    bx1=fix((.x)/xlen)+1
                    by1=fix((.y+1)/ylen)+1
                    bx2=fix((.x+.width)/xlen)+1
                    by2=fix((.y+1-.height)/ylen)+1
                    bummtest()
                    if bumm then
                        if .vy>0 then .vy=0
                        if .ay>0 then .ay=0
                        '.y=.y-1
                    end if

                    'bx1=fix((.x)/xlen)+1
                    by1=fix((.y-1)/ylen)+1
                    'bx2=fix((.x+.width)/xlen)+1
                    by2=fix((.y-1-.height)/ylen)+1
                    bummtest()
                    if bumm then
                        if .vy<0 then .vy=0
                        if .ay<0 then .ay=0
                        '.y=.y
                    end if
                end if
            end if

            '.vxalt=.vx
            '.vyalt=.vy
            if .unverwundbarende<>0 then if timer > .unverwundbarende then .unverwundbarende=0
    end with
end sub