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) <= 18and
   (abs(shape1.top  - shape2.top) <= 18then
  //kollision;


galagher - So 24.07.05 22:04

user profile iconuall@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);  //X ist der Left-Wert
  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;
   //Falsch:   Result := (PaintBox1.Canvas.Pixels[Y, Image1.Left+I] = clRed);  //Y ist der Top-Wert
    {Richtig:} 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!