Autor Beitrag
Pansenen
Hält's aus hier
Beiträge: 15


D 7
BeitragVerfasst: Do 24.11.05 15:58 
Was geht,

ich arbeite gerade an einem kleinen space shooter, bei dem sowohl der player, die feinde und die schüsse timages sind. die images sind natürlich rechteckig, die raumschiffe natürlich nicht (die haben transparent color clwhite).

Ist es möglich eine genauere Kollision hinzubekommen, als dass sich nur die timages überschneiden? Wie rechtecke kollidieren weiß ich selbst. Aber ist es zum beispiel möglich zu schauen, ob die sich überschneidenden teile der images beide nicht (!) weiß, also nicht transparent sind?

Oder habt ihr andere ideen, wie man das Problem regeln könnte? Ich nutze Delphi 7, ohne DelphiX...

Thx in Advance
ansenen

Moderiert von user profile iconTino: Beitrag formatiert da sehr schlecht zu lesen.
Lossy eX
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1048
Erhaltene Danke: 4



BeitragVerfasst: Do 24.11.05 16:16 
Hi. Das Erste was du tun solltest sind die Images wegschmeißen! Die eignen sich allerhöchstens zum Anzeigen von festen Bildern. Aber auf keinen Fall für so etwas was du vor hast. Da würde ich entweder etwas Hardwarebeschleunigtes (OpenGL) empfehlen oder du Lädst deine Bilder in TBitmaps und zeichnest diese dann X Mal für X Schiffe oder Schüsse. Das geht besser, schneller und ist Resourcenschonender. Du müsstest da ein Temporäres TBitmap erstellen und erst einmal alle deine Objekte hineinmalen. In folgendem Artikel findest du ein Stück Quellcode in dem das mit dem temporären Bitmap gemacht wurde. www.luckie-online.de...wsFunktioniert.shtml

Aber zu der Kollision. Du weißt ja wann sich die Rechtecke der Objekte überschneiden. Wenn dies der Fall ist kommt eine zusätzliche Prüfungs ins Spiel. Diese überprüft die überlappenden Bereiche Pixel für Pixel. Wenn die Pixel in beiden Bildern nicht Transparent sind, dann liegt eine Kollision vor. Wichtig ist dabei, dass du nur die überlappenden Bereiche überprüfst.
Zum Abfragen der Pixel würde der ein oder andere bestimmt die Eigenschaft Pixels einer Canvas empfehlen. Diese ist aber für so etwas zu langsam. Deswegen müsstest du direkt den Speicher der Bilder überprüfen. Das geht mit der Eigenschaft Scanlines. Zum Pixelzugriff mit Scanlines habe ich hier im Forum schon ein paar mal was geschrieben. Einfach mal danach suchen.

PS: Sollten deine Objekte größere Löcher besitzen funktioniet diese Möglichkeit nicht unbedingt einwandfei.

_________________
Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.
Pansenen Threadstarter
Hält's aus hier
Beiträge: 15


D 7
BeitragVerfasst: Fr 25.11.05 17:16 
Titel: noch nicht alles klar;)
Also, erst mal thx für die Antwort....
Wenn ich TBitmaps verwende haben die kein Left oder Top Koordinaten, d.h. ich kann sie auch nicht verschieben...
Meinst du ich soll mit Canvas zeichnen, wenn ja wie genau mach ich das?
Und wieso soll ich in EIN temporäres Bitmap ALLE Objekte hinein malen? Wozu?

Und was genau macht der scanlines befehl, liest der die pixel einer ganzen zeile eines Bitmaps aus oder wie?

Trotzdem schon mal Thx für die erste Hilfe....
Pansenen
Lossy eX
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1048
Erhaltene Danke: 4



BeitragVerfasst: Fr 25.11.05 20:34 
Irgendwie fällt mir gerade auf, dass wenn ich etwas sage scheine ich viele zu verwirren. Dann kommen nur noch mehr Fragen. :twisted:

Aber dann will ich dich mal ins Licht führen.

TBitmap: Ja dann hast du keine Koordinaten. Das siehst du richtig. An der Stelle solltest du ein Objekte erstellen welches ein Bitmap benutzt. Das hat dann auch wieder Koordinaten. Da würde ich sogar ein bisschen mehr vorschlagen.

Wenn du eine Ahnung vvon Object Orientierter Programmierung (OOP) hast ist dies genau die Stelle an der eine Pause machen solltest und erst einmal ein Tutorial durch zulesen. Du darfst auch seiten zurück falls es notwendig ist.

Hier mal das Beispiel wie ich es aufmachen würde.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
type
  TBaseObject = class
  public
    X: Integer;
    Y: Integer;
    Bitmap: TBitmap;
    procedure Draw (Canvas: TCanvas); virtual;
  end;

  TShip = class (TBaseObject);
  TShoot = class (TBaseObject);

So in etwa würde ich das machen. Also das ist nur kurz angerissen. Alle Objekte stammen von einer Basis ab und können positioniert und gezeichnet werden. Bei einem Schiff könntest du noch spezial sachen einbauen. genau so wie du unterschiedliche Schiffsklassen ableiten kannst.

Ein Temporäres Bild: Der Sinn darin liegt in der Tatsache, dass du alles zeichnest und kontrolliert alles aufdeckst. Sprich du könntest dir fürs zeichnen Zeit lassen und das komplett fertige Bild wäre dann auf einmal da. Bei vielen TImages flackerte alles immer so. Oder?

Scanlines: Mit Scanlines kannst du direkt auf den Speicher eines Bildes zugreifen. Da bekommst du einen Pointer in der auf die Pixeldaten zeigt. Zeilenweise. Für ein andere Zeile müsstest du ein anderes Scanline aufrufen. Also Scanline[0], Scanline[1] .. scanline[320] für Zeile 0, 1 und 320. Ich weiß. Normal beginnt eine Koordinate bei 1. Musste halt berücksichtigen.

_________________
Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.
F34r0fTh3D4rk
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5285
Erhaltene Danke: 29

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: Fr 25.11.05 21:44 
genau, am besten ist, du machst alle berechnungen intern und grafisch möglichst unabhängig, dann ist es später besser zwischen opengl, directx oder software zu wechseln, sonst müsstest du das ganze spiel neuschreiben, für solche 2d sachen kann man gut undelphix nehmen, für den einstieg ist es einfach, hat ne schnelle pixelkollision (genau das was du brauchst) uvw. für den advancederen gebrauch, solltest du dich mit opengl auf 2d basis beschäftigen, zwar etwas komplexer, aber mit oop sollte man das schnell vereinfachen können ;)
Pansenen Threadstarter
Hält's aus hier
Beiträge: 15


D 7
BeitragVerfasst: Sa 26.11.05 11:35 
Hi...
hehe, ja deine Erklärungen rufen immer neue Fragen hervor.... (p_-)
Also, das mit den Klassen erstellen um besser zu strukturieren ist soweit klar...

Aber die Scanlines.... kannst du mir mal ein Beispiel geben, wie man jetzt im Konkreten aus einem Bitmap mittels scanline auf die canvas von form1 zeichnet? Die anderen Beiträge im DF beziehen sich alle auf Farbbestimmungen oder so...
Irgendwie ist mir das Prinzip mit dem Zeiger und den Prgbtriple- Array noch nicht klar, welches ja ein dynamisches Array zu sein scheint.... Aber irgendwie wird da nie auf den Array-Index zugegriffen....
Und das mit dem temporären Bild: würdest du dann einfach ein 1024 * 768 großes Bitmap (oder wie groß der Bildschirm halt ist) nehmen und dort alles reinzeichnen und dann einfach bmp.show machen oder wie?

Wär toll wenn du den ganzen Quelltext gut kommentieren könntest...
Thx in Advance
F34r0fTh3D4rk
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5285
Erhaltene Danke: 29

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: Sa 26.11.05 14:06 
user profile iconPansenen hat folgendes geschrieben:

Wär toll wenn du den ganzen Quelltext gut kommentieren könntest...
Thx in Advance


heißt das, dass er dir dein programm schreiben soll ? bemüh doch noch ein wenig die suche, da wirst du sicher genug finden, oder beschäftige dich mit undelphix und opengl :idea:
Pansenen Threadstarter
Hält's aus hier
Beiträge: 15


D 7
BeitragVerfasst: Sa 26.11.05 17:24 
Titel: ...
Mit 'ganzen Quelltext' ist einfach der Code zum Übertragen eines Bitmaps auf die form1.canvas gemeint.... ich habe schon die suche benutzt, bloß leider beziehen sich die anderen scanline beiträge immer auf farbumwandlungen innerhalb eines bitmaps oder so...
Ich verstehe bloß nicht, wie man dann die Farbe aus den mit scanline ermittelten pixeln auf die canvas kriegt...
und ich verstehe auch noch nicht, wann man den zeiger ( z. bsp. p) einfach so aufruft, und wann mit erweiterung (p^), worin da der unterschied besteht....
An die Kollision werde ich mit natürlich alleine machen;)
...
Pansenen
Lossy eX
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1048
Erhaltene Danke: 4



BeitragVerfasst: Sa 26.11.05 17:37 
Ne. Also mit Scanline würde ich nur auf die Pixeldaten zugreifen. Das zeichnen würde ich alles mit den Delphikappselungen von der GDI. Ist schneller als wie wenn man dies mit der Hand (Scanlines) machen würde. Canvas.Draw(X, Y, Bitmap) sollte da genügen.

Das Temporäres Bild würde ich immer genau so groß machen wie auch der Bereich in den du hineinzeichnest.

Noch was zu scanline. Damit bekommst du den Speicher. Das ist nicht wirklich so etwas wie ein array. Je nach format belegt ein Pixel 1, 2, 3 oder 4 Bytes. Der Pointer pRGBTriple ist eine Struktur mit 3 Bytes (24 Bit). Wenn man solch einen typisierten Pointer incrementiert, dann wird er (in diesem Fall) um 3 Bytes weiter gesetzt. Bei einem Array kannst du beliebig springen wärend du bei einem solchen Pointer nur ein nach dem anderen machen kannst.

Also die Variable p ist ein Pointer. Wenn du dort etwas hineinschreibst dann veränderst du die Adresse auf die der Pointer zeigt. Mit p^ dereferenzierst du den Pointer. Das bedeutet, dass du damit die Daten ansprichst auf die der Pointer zeigt. Klasse sache so was. :-)

_________________
Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.
Pansenen Threadstarter
Hält's aus hier
Beiträge: 15


D 7
BeitragVerfasst: Sa 26.11.05 19:25 
Danke Mann, ich denke jetzt werde ich mich irgendwie alleine durchschlagen...