Primitive Zielverfolgung
-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
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....
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....
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Der Weise weiß, dass er ein Narr ist.
-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
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...
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...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Der Weise weiß, dass er ein Narr ist.
Mit meinem neuen Code wird immer noch bei jedem Frame(alle 2 Pixel) alles geprüft. Mir ist nicht ganz klar wieKaeru 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.
ich die gesammte Prüfung ausgrenzen kann und er erst auf dem nächsten Tile wieder prüft.
Edit:

-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
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...
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...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Der Weise weiß, dass er ein Narr ist.
-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
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??
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