Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi ArtellerieSpiel-Kollision mit Landschaft (https://www.delphipraxis.net/165784-artelleriespiel-kollision-mit-landschaft.html)

Toni77 16. Jan 2012 11:46

ArtellerieSpiel-Kollision mit Landschaft
 
Hallo zusammen,
ich bin gerade dabei ein Artelleriespiel zu programmieren.
(d.h. eine Kugel auf einer Wurfparabelfunktion entlang laufen zu lassen um ein Ziel zu Treffen - durch Eingabe von Abschusswinkel und Geschwindigkeit zu regulieren)

meine Kugel fliegt auch schon ordnungsgemäß auf einer Bahn und auch bei der Kollision mit dem Ziel gibt es keine Probleme.
Jedoch weiß ich nicht wie es schaffe, dass das Programm, wenn die Kugel mit der Langschaft( sprich Felsen,Bäume,etz.) kollidiert, abbricht. Die Landschaft ist ein Image dass ich bei selbst gezeichnet und ausgeschnitten habe, sodass es sich hierbei um ein krummliniges Image handelt.
Falls jemand eine Idee hat wie ich das hinbekommen könnte wäre mir sehr geholfen!

Danke (;

Cylence 16. Jan 2012 12:12

AW: ArtellerieSpiel-Kollision mit Landschaft
 
Hi,

ich hab naja etwas ähnliches mal gemacht, mit Kolissionen usw, ich habe ein Panel in dem alles ist, einmal das XHandle, ist das Panel was bei dir sozusagen die kugel ist, und dann check ich alle componenten in dem Panel, ob diese mit der "Kugel" kollidieren, evtl bringt dir das was:

Delphi-Quellcode:
   
var
collision : Boolean;
XCol : Integer;
begin
 for i := 0 to Panel1.ControlCount -1 do begin
        IF RectInRegion(CreateRectRgn(XHandle.Left, XHandle.Top, XHandle.Width+Xhandle.Left, XHandle.Height + XHandle.Top), Panel1.Controls[i].BoundsRect) and (Panel1.Controls[i].Name <> XHandle.Name) then begin
           XCol := Panel1.Controls[i]; //componentnumber von panel das kollidiert
           Collision := True;
           Break;
        end;
    end;  
    //Collision detected
    if Collision then begin


    end;
end;

himitsu 16. Jan 2012 12:46

AW: ArtellerieSpiel-Kollision mit Landschaft
 
Dafür muß er aber erstmal seinen Hintergrund (die Landschaft) in mehrere solche Komponenten/Kollisionsgegner aufteilen, um darauf testen zu können.

- entweder manuell voher diese nicht sichtbaren "Panels" erstellen und über dem Hintergrund positionieren
- das Bild untersuchen, also die Grenzen via Code suchen und solche "Panels" erstellen
- oder das Bild wärend des Wurfs untersuchen (die Pixel auswerten) und entsprechend eine Kollision erkennen

Mavarik 17. Jan 2012 10:01

AW: ArtellerieSpiel-Kollision mit Landschaft
 
Leg dir ein Array an:


Delphi-Quellcode:
Var
  Hoehen : Array[0..MaxImagewidth] of Integer;
Fülle das Array an der X-Üosition Deines Landschaftsbildes mit der maximalen Höhe an dieser Stelle.
(Von unten suchen bis Du "Himmel" findest...

Dann brauchst Du nur für den Schuss an X,Y im Array nach zu sehen, ob für X der Y Wert kleiner ist...

Fertig! (und viel viel schneller als zu laufzeit das Bild zu untersuchen)

Mavarik

Sir Rufo 17. Jan 2012 10:21

AW: ArtellerieSpiel-Kollision mit Landschaft
 
IMHO sollte man sich entsprechende Regions für die einzelnen Teile anlegen (Landschaft, Geschoß) und dann prüfen, ob sich diese Regions überlappen

blackfin 17. Jan 2012 12:25

AW: ArtellerieSpiel-Kollision mit Landschaft
 
Für ein 2D Spiel kann ich dir die hervorragende und freie Physik-Engine Box2D von Erin Catto empfehlen, die relativ bekannt ist.
(z.B. ist sie der Unterbau von "Angry Birds", für ein 2D-Artillerie-Spiel bietet sie sich somit geradezu an.).
Zudem ist sie ziemlich leicht zu erlernen, einfach das Handbuch lesen: http://box2d.org/manual.pdf

Für Box2D gibt es einen Delphi Port: http://code.google.com/p/box2d-delphi/

Um deine Bilder in Collision-Shapes umzuwandeln, gibt es auch ein hervorragendes Programm, den Physics Editor von code'n'web.
Dieser scannt deine Bilder-Outlines und erstellt daraus konvexe Collision Shapes, die du in ein lesbares Format exportieren und dann in Box2D verwenden kannst.
Der Scanner davon ist wirklich gut, ziemlich akkurat und erzeugt Shapes ohne viel Overhead.

Ich verwende beides (Box2D + PhysicsEditor) derzeit für meine in der Entwicklung befindliche HTML5 Game Engine (dafür natürlich die JavaScript-Version von Box2D) und bin hellauf begeistert, was man damit alles machen kann.

(Demo der HTML5-Engine / Box2D: http://cahira.moongine.com/demos/cahira-physics-test/)

Toni77 22. Jan 2012 23:08

AW: ArtellerieSpiel-Kollision mit Landschaft
 
Ich danke euch allen für eure Ideen! Ich werd mich jetz ma dran setzen und versuchen was am besten funktioniert (:


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:05 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz