Entwickler-Ecke
Multimedia / Grafik - Kollisionsabfrage bei Rechtecken
galagher - So 24.07.05 21:37
Titel: Kollisionsabfrage bei Rechtecken
Hallo Leute!
Ich weiss, zum Thema Kollisionsabfrage gibt's eine Menge Threads, aber ich kann es nicht umsetzen, obwohl die Gegebenheiten ja denkbar einfach sind: Ich benutze ein 18x18 Pixel grosses Image, das die Spielfigur enthält. Die Hindernisse sind ebenfalls 18x18 Pixel gross (momentan einfach Shapes, werde sie aber später dann auf die Canvas zeichnen).
Das Spielfigur-Image und die Hindernisse befinden sich waagrecht und senkrecht jeweils auf der selben Höhe. Per Cursortasten wird die Spielfigur bewegt und es soll nun festgestellt werden, ob sie ein Hindernis (Rand) berührt. Ich dachte, ich könnte das mit Canvas.Pixels abfragen, aber ich komme nicht weiter. Es klappt nur, wenn Top und Left des Hindernisses gleich sind. Das muss doch auch anders gehen, oder?
Wäre für Hilfe dankbar!
uall@ogc - So 24.07.05 22:00
Delphi-Quelltext
1: 2: 3:
| if (abs(shape1.left - shape2.left) <= 18) and (abs(shape1.top - shape2.top) <= 18) then |
galagher - So 24.07.05 22:04
uall@ogc hat folgendes geschrieben: |
[delphi]
if (abs(shape1.left-shape2.left) <= 18 and abs(shape1.top-shape2.top) <= 18) then
//kollision;
[delphi] |
Danke, aber ich will ja vermeiden, dass Shapes abgefragt werden, weil ich den Hintergrund zeichnen möchte! Es genügt, zu prüfen, ob zB. die Farbe 1 Pixel links vom "Figuren"-Image anders als die Hintergrundfarbe ist. Das Problem ist, dass ich nicht nur ein Pixel, sondern alle Pixel von 0-Image1.Height abfragen muss. Wie bekomme ich das hin?
uall@ogc - So 24.07.05 22:12
nein du machst das nicht mit pixels, sondern wenn du das später anders vrewaltest prüfste die records die du dann ja angelegt haen solltest
also sowas wie
Delphi-Quelltext
1: 2: 3:
| Trechteck = record x,y,breite,hoehe: integer; end; |
und da gehts dann geanu so
galagher - Mo 25.07.05 17:50
Ich möchte das aber mit Pixels machen und habe auch schon den Fehler gefunden:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26:
| function HKollision(X: Integer; Key: Word): Boolean; var I: Byte; begin for I := 0 to Image1.Width-1 do begin if Result then break; Result := (PaintBox1.Canvas.Pixels[X, Image1.Top+I] = clRed); end; end;
function VKollision(Y: Integer; Key: Word): Boolean; var I: Byte; begin for I := 0 to Image1.Height-1 do begin if Result then break; Result := (PaintBox1.Canvas.Pixels[Image1.Left+I, Y] = clRed); end; end; |
Danke euch! Wenn man Canvas.Pixels mit vertauschten XY-Werten benutzt, kann's nicht funktionieren!
galagher - Do 18.08.05 20:14
Für alle, die auch mal mit Canvas.Pixels arbeiten wollen:
Um korrekte Farbwerte zu ermitteln, muss man True Color 32-Bit Farbtiefe einstellen, sonst klappt das nie...
Auf meinem Rechner lief das Programm korrekt, auf dem anderen mit High Color 16 Bit nicht!
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!