Re: SpritePixelCollision?
Verfasst: 09.01.2013 23:28
So, hab den Code nochmal überflogen (und selbst in meinem Beispielcode Fehler gefunden
)
statt so:
muss es so aussehen:
Nun zu deinem Code. Du willst zwar einen 2D-Körper im Level umherscheuchen, aber berechnest alles nur mit einem Punkt (px,py).
Du hast in keinster Weise die Ausdehnungen berücksichtigt. Zusätzlich pinnst du das Sprite(0) direkt an (px,py). D.h. das Bild wird so dargestellt, dass die linke obere Ecke auf (px,py) liegt. Aus diesem Grund kommt es dir auch so vor, als würdest du beim nach links Bewegen alle Kollisionen richtig sehen und beim nach rechts Laufen in der Wand verschwinden. (Vllt war dir das aber schon bewusst)
Und nun zum Fallen: Du erhöhst beim Fallen ohne Kollision dein fg immer um 1. Besonders große Höhen würden also fg`s erzeugen, die deutlich über einer Blockhöhe liegen. Beim Überprüfen gehst du aber immer nur vom ganzen "Schritt" aus und lässt dabei unter Umständen Blöcke unbeachtet, die zwischen dir und dem Ziel liegen. (Schleife von py -> py+fg ; Schritt=Blockhöhe)
Als Tipp: Lass die Ausdehnung deiner Figur erstmal weg, da gibt es noch ein paar schöne Fallen. Schieb dein Sprite mal nach px-10|py-10 und guck nur, ob der Mittelpunkt deines Kreises richtig kollidiert.

statt so:
Code: Alles auswählen
;für links:
if px=>20 ;ganz wichtig, da du sonst das Array überfordern könntest ;)
spieler_raster_x = Round(px/20,1)-1 ;geht auch, wenn du das Round weg lässt. Wollte es nur sauber schreiben.
spieler_raster_y = (py)/20
If Block(spieler_raster_x, spieler_raster_y)\id = 0
...
;für rechts:
if px< "___Anzahl_Boxen____"-20
spieler_raster_x = Round(px/20,1)+1
spieler_raster_y = (py)/20
If Block(spieler_raster_x, spieler_raster_y)\id = 0
Code: Alles auswählen
;für links:
if px=>20 ;ganz wichtig, da du sonst das Array überfordern könntest ;)
spieler_raster_x = Round((px-Schrittweite)/20,1) <<--
spieler_raster_y = (py)/20
If Block(spieler_raster_x, spieler_raster_y)\id = 0
...
;für rechts:
if px< "___Anzahl_Boxen____"-20
spieler_raster_x = Round((px+Schrittweite)/20,1) <<--
spieler_raster_y = (py)/20
If Block(spieler_raster_x, spieler_raster_y)\id = 0
Nun zu deinem Code. Du willst zwar einen 2D-Körper im Level umherscheuchen, aber berechnest alles nur mit einem Punkt (px,py).
Du hast in keinster Weise die Ausdehnungen berücksichtigt. Zusätzlich pinnst du das Sprite(0) direkt an (px,py). D.h. das Bild wird so dargestellt, dass die linke obere Ecke auf (px,py) liegt. Aus diesem Grund kommt es dir auch so vor, als würdest du beim nach links Bewegen alle Kollisionen richtig sehen und beim nach rechts Laufen in der Wand verschwinden. (Vllt war dir das aber schon bewusst)
Und nun zum Fallen: Du erhöhst beim Fallen ohne Kollision dein fg immer um 1. Besonders große Höhen würden also fg`s erzeugen, die deutlich über einer Blockhöhe liegen. Beim Überprüfen gehst du aber immer nur vom ganzen "Schritt" aus und lässt dabei unter Umständen Blöcke unbeachtet, die zwischen dir und dem Ziel liegen. (Schleife von py -> py+fg ; Schritt=Blockhöhe)
Als Tipp: Lass die Ausdehnung deiner Figur erstmal weg, da gibt es noch ein paar schöne Fallen. Schieb dein Sprite mal nach px-10|py-10 und guck nur, ob der Mittelpunkt deines Kreises richtig kollidiert.
