Seite 3 von 4

Verfasst: 20.03.2008 03:38
von Kaeru Gaman
ja, hast du wohl richtig erkannt....

nur mal fix ausgeführt, nicht den neuen code gesichtet:
du gehst 1pix zu weit vor der prüfung.

wenn er AUF der aktuellen tile STEHT, prüfst du alle seiten.
...und dann eben mit der richtigen zuordnung.

wenn du bei prüf(x-1) zu früh reagierst, ist die koordinate vielleicht schon vor der prüfung decrementiert worden....
prüfen is richtig, die tile nach links....
aber berechnen der prüftile vor dem nächsten decrement....

Verfasst: 20.03.2008 04:04
von obar
Muss jetzt ins Bett, ich seh nichts mehr. Es wäre aber schön, wenn du Morgen(bzw. Heute) mal den Code kurz Überfliegen könntest. :cry:

Verfasst: 20.03.2008 05:01
von Kaeru Gaman
lies dir ersma morgen/heute mein kommentar nochmal genau durch...

ich bin so gut wie sicher, das problem liegt darin, dass du in einem durchlauf variablen updatest und erst später prüfst.

...ist eines der ältesten EDV-probleme, die feine abfolge...

Verfasst: 20.03.2008 11:16
von obar
Kaeru Gaman hat geschrieben:>

ja klar, aber warum übergibst du in jedem frame die pixelkoordinaten, anstatt nur alle soundsoviel frames die mapkoordinaten zu übergeben und nur dann zu prüfen.
auf erfolgten punktefraß, auf kollision mit nem gegner, auf möglichkeit zum richtungswechsel...

alles das kann ja nur dann erfolgen, wenn sich der pac genau auf einer tile befindet.

erst wenn die bewegungsabfolge vorbei ist, brauchst du prüfen,
ob ein punkt gefressen wurde, ob pac in ein gespenst gerannt ist,
ob der User ne taste gedrückt hat um die richtung zu wechseln,
und eben auch ob der gegner seinen weg ändern soll.

klar, du kannst den ganzen krempel auch soundso oft unnütz prüfen,
aber das brauchst du nicht.
Mit meinem neuen Code wird immer noch bei jedem Frame(alle 2 Pixel) alles geprüft. Mir ist nicht ganz klar wie
ich die gesammte Prüfung ausgrenzen kann und er erst auf dem nächsten Tile wieder prüft.



Edit:

:cry: Verzweifelt Beispielcode gesucht.

Verfasst: 20.03.2008 20:26
von obar
Hat den keiner mehr Lust mir da weiterzuhelfen??

Verfasst: 20.03.2008 20:38
von Kaeru Gaman
habbisch jo ganz vergesse.... sorry

is auch schon wieder bald achte.... mal sehen, ob ich in den werbepausen was zusammenschuster.

grundsätzlich nochma auf die schnelle:
was is so schwierig dran, sich vorzustellen,
dass ein teil der hauptschleife nur bei einer bestimmten bedingung ausgeführt wird?
das machst du doch ständig, nur diesmal ist der teil ein bissel größer.

nehmen wir mal an, du erschaffst eine Var namens Schritte,
und führst den abfrage und steuer teil nur dann aus, wenn schritte <= 0 ist.
im steuerteil setzt du schritte wieder auf tilebreite,
und wenn das ne float ist und dein speed auch,
dann kannst du auch ganz einfach das tempo steuern.....

klar, das ist ne frame-sync lösung, aber ich glaube nicht, dass du dir ne superdolle timerbased auch noch antun willst...

Verfasst: 20.03.2008 22:23
von obar
Kaeru Gaman hat geschrieben: mal sehen, ob ich in den werbepausen was zusammenschuster.

Ja,Bitte Bitte schuster mal was nettes zusammen...

Verfasst: 20.03.2008 22:34
von Kaeru Gaman
ist der absatz oben denn wirklich so wenig nachvollziehbar?
eigentlich will ich dich lieber zum lernen animieren, anstatt dir den haferbrei vorzukaun....

Verfasst: 20.03.2008 23:00
von obar
Ich geb dir grundsätzlich absolut Recht. Aber ich wär nun schon mal froh, wenn man mir einen Happen Code zuwerfen könnte.

Deine Erklärungen haben mir bisher auch immer sehr weit geholfen. Dafür bin ich dir auch sehr dankbar. Mittlerweile macht sich aber etwas Frust breit.

Verfasst: 21.03.2008 03:25
von obar
Ich habs trotzdem nochmals versucht. Es gibt hier aber noch eine Überschneidung. Mit der Abfolge sollte es jetzt so sein, dass Koll und
Richtungswechsel nur noch auf dem vollen Teil geprüft wird. Kann sich dieser Code mal jemand anschauen??

Code: Alles auswählen

InitSprite()
InitKeyboard()
OpenScreen(1024,768,32,"")

Global mapHeight.l  = 29
Global mapWidth.l   = 35
Global MapX.l       = 24 
Global MapY.l       = 24 
Global posX.l       = 48
Global posY.l       = 48
Global i
Global k
Global speed        =  2
Global points       = -5

#TileSize     = 24
#playerWidth  = 24
#playerHeight = 24

CreateSprite(0,24,24)
StartDrawing(SpriteOutput(0))
DrawingMode(#PB_2DDrawing_Default)
Box(0,0,24,24,RGB(0,0,0))
StopDrawing()

CreateSprite(1,24,24)
StartDrawing(SpriteOutput(1))
DrawingMode(#PB_2DDrawing_Default)
Box(0,0,24,24,RGB(255,255,255))
StopDrawing() 

CreateSprite(2,24,24)
StartDrawing(SpriteOutput(2))
DrawingMode(#PB_2DDrawing_Default)
Circle(12,12,12,RGB(255,100,255))
StopDrawing()

CreateSprite(3,24,24)
StartDrawing(SpriteOutput(3))
DrawingMode(#PB_2DDrawing_Default)
Box(0,0,24,24,RGB(0, 0, 0))
Circle(12,12,3,RGB(254, 255, 61))
StopDrawing()


Structure _object
    TileID.l
EndStructure

Global Dim map._object(mapWidth, mapHeight)

Restore map
For t = 0 To mapHeight
    For n = 0 To mapWidth 
        Read map(n,t)\TileID
    Next 
Next 


Repeat
    ClearScreen(0)
    ExamineKeyboard()
    
    For t = 0 To mapHeight 
        For n = 0 To mapWidth
            If init = 0
                If map(n, t)\TileID = 0
                   punkte + 1 
                   map(n, t)\TileID = 3
                EndIf
            EndIf    
            DisplayTransparentSprite(map(n, t)\TileID, (mapX + #TileSize*n),(mapY + #TileSize*t) ) 
        Next 
    Next     
   
    init = 1
    
    i = ((posx-mapX)/#TileSize)
    k = ((posy-mapY)/#TileSize)
    
    
    If schritt < 1
        
        If KeyboardPushed(#PB_Key_Right)
            If map(i+1, k)\TileID  < 1 Or map(i+1, k)\TileID  > 2
                right = 1:left = 0:up = 0:down = 0
            EndIf
        EndIf
        If KeyboardPushed(#PB_Key_Left)
            If map(i-1, k)\TileID  < 1 Or map(i-1, k)\TileID  > 2
                right = 0:left = 1:up = 0:down = 0
            EndIf 
        EndIf
        If KeyboardPushed(#PB_Key_Up)
            If map(i, k-1)\TileID  < 1 Or map(i, k-1)\TileID  > 2   
                right = 0:left = 0:up = 1:down = 0
            EndIf
        EndIf
        If KeyboardPushed(#PB_Key_Down)
            If map(i, k+1)\TileID  < 1 Or map(i, k+1)\TileID  > 2   
                right = 0:left = 0:up = 0:down = 1
            EndIf
        EndIf
    
    EndIf
    
    
    If right = 1
        posx + speed 
        schritt + speed
        If schritt > 22
            
            If map(i+1, k)\TileID  < 1 Or map(i+1, k)\TileID  > 2
                schritt = 0
            Else
                right = 0
                schritt = 0
            EndIf
        EndIf         
    EndIf
    
    If left = 1
        posx - speed 
        schritt - speed
        If schritt < 1
    
            If map(i-1, k)\TileID  < 1 Or map(i-1, k)\TileID  > 2
                schritt = 23
            Else
                left = 0
                schritt = 23
            EndIf
        EndIf
    EndIf    
            
    If up = 1
        posy - speed 
        schritt - speed
        If schritt < 1
    
            If map(i, k-1)\TileID  < 1 Or map(i, k-1)\TileID  > 2
                schritt = 23
            Else
                up = 0
                schritt = 23
            EndIf
        EndIf
    EndIf            
    
    If down = 1
        posy + speed 
        schritt + speed
        If schritt > 22
    
            If map(i, k+1)\TileID  < 1 Or map(i, k+1)\TileID  > 2
                schritt = 0
            Else
                down = 0
                schritt = 0
            EndIf
        EndIf
    EndIf            
    
    
              
        
    If map(i, k)\TileID = 3
        map(i, k)\TileID = 0
        punkte - 1
        points + 5
    EndIf
   
    
    DisplayTransparentSprite(2,posX,posY)
    
       
    StartDrawing(ScreenOutput())
    DrawingMode(#PB_2DDrawing_Transparent)
    DrawText(925,50,"PUNKTE",RGB(255,255,255))
    DrawText(930, 80, RSet(Str(points), 6, "0"),RGB(255,255,255))
    DrawText(10,30,"schritte: "+Str(schritt),RGB(255,0,255))
    DrawText(10,50,"richtung: "+Str(right),RGB(255,0,255))
    DrawText(10,70,"posx: "+Str((posx)),RGB(255,0,0))
    StopDrawing()
    
    Delay(1)
    FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape)

End

DataSection
    map:
    Data.l 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
    Data.l 1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1
    Data.l 1,0,1,1,0,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,1,1,0,1
    Data.l 1,0,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,1,0,1
    Data.l 1,0,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,1
    Data.l 1,0,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,1
    Data.l 1,0,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,1
    Data.l 1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1
    Data.l 1,0,1,1,0,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,0,1,1,0,1
    Data.l 1,0,1,1,0,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,0,1,1,0,1
    Data.l 1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1
    Data.l 1,0,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,1
    Data.l 1,0,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,1
    Data.l 1,0,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,1
    Data.l 1,0,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,1,0,1
    Data.l 1,0,1,1,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,1,1,0,1
    Data.l 1,0,0,0,0,1,1,0,0,0,0,1,1,1,0,1,1,1,1,1,1,0,1,1,1,0,0,0,0,1,1,0,0,0,0,1
    Data.l 1,0,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,0,1
    Data.l 1,0,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,0,1
    Data.l 1,0,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,0,1
    Data.l 1,0,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,0,1
    Data.l 1,0,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,0,1
    Data.l 1,0,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,0,1
    Data.l 1,0,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,0,1
    Data.l 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
    Data.l 1,0,1,1,1,1,1,0,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,0,1,1,1,1,1,0,1
    Data.l 1,0,1,1,1,1,1,0,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,0,1,1,1,1,1,0,1
    Data.l 1,0,1,1,1,1,1,0,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,0,1,1,1,1,1,0,1
    Data.l 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
    Data.l 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
EndDataSection