Autor Beitrag
galagher
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2562
Erhaltene Danke: 46

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: So 24.07.05 21:37 
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!

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
uall@ogc
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1826
Erhaltene Danke: 11

Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
BeitragVerfasst: So 24.07.05 22:00 
ausblenden Delphi-Quelltext
1:
2:
3:
if (abs(shape1.left - shape2.left) <= 18and
   (abs(shape1.top  - shape2.top) <= 18then
  //kollision;

_________________
wer andern eine grube gräbt hat ein grubengrabgerät
- oder einfach zu viel zeit
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2562
Erhaltene Danke: 46

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: 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?

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
uall@ogc
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1826
Erhaltene Danke: 11

Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
BeitragVerfasst: 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

ausblenden Delphi-Quelltext
1:
2:
3:
Trechteck  = record
                x,y,breite,hoehe: integer;
             end;

und da gehts dann geanu so

_________________
wer andern eine grube gräbt hat ein grubengrabgerät
- oder einfach zu viel zeit
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2562
Erhaltene Danke: 46

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Mo 25.07.05 17:50 
Ich möchte das aber mit Pixels machen und habe auch schon den Fehler gefunden:
ausblenden 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!

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2562
Erhaltene Danke: 46

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: 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!

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!