Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: So Sep 07, 2025 18:50

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags:
BeitragVerfasst: Di Apr 15, 2003 11:41 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jan 08, 2003 15:49
Beiträge: 266
Wohnort: Aachen
Ich habe meine 2D Engine schon fast fertig das einzige wo ich nicht weiter komme ist die Kollision. Also bis jetzt habe ich folgende Function
Code:
  1.  
  2. function TGLImageEngine.IsCollision(Sprite : TObject;Key: Word; Speed: integer;var CollisionsObjekt : TObject): Boolean;
  3. var
  4.   SpriteRec : TRect;   //Bewegungs Rec
  5.   CollRec : TRect;    //Kollisions Rec
  6.  
  7.   GoSprite : TGLImageSprite;   //Sprite die sich bewegt
  8.   ImageObject : TGLImageSprite;//Sprite die getestet wird
  9.   r : TRect;
  10. begin
  11.   //Kollisions mit Objekt 1
  12.   result := False;
  13.  
  14.   GoSprite := TGLImageSprite(Sprite);
  15.   with GoSprite do begin
  16.     SpriteRec.Left := Image.x+Image.CollLeft;
  17.     SpriteRec.Top := Image.y-25+Image.CollTop;
  18.     SpriteRec.Right := Image.x+Image.CollWidth;
  19.     SpriteRec.Bottom := Image.y+Image.collHeight-22;
  20.   end;
  21.  
  22.   ImageObject := TGLImageSprite(FImageSpriteList.Objects[1]);
  23.   with ImageObject do begin
  24.     CollRec.Left := Image.X+Image.CollLeft;
  25.     CollRec.Top := Image.Y -25+Image.CollTop;
  26.     CollRec.Right := Image.X+Image.CollWidth+3;
  27.     CollRec.Bottom :=Image.Y+Image.CollHeight-22;
  28.   end;
  29.  
  30.   speed:=speed*2;
  31.   case Key of
  32.     VK_Up   : SpriteRec.Top := SpriteRec.Top - Speed;
  33.     VK_Down : SpriteRec.Bottom:=SpriteRec.Bottom + Speed;
  34.     VK_RIGHT: SpriteRec.Right := SpriteRec.Right + Speed;
  35.     VK_LEFT : SpriteRec.Left := SpriteRec.Left - speed;
  36.   end;
  37.   CollisionsObjekt :=FImageSpriteList.Objects[1];
  38.   
  39.   FIsCollision := IntersectRect(FTempRect,SpriteRec, CollRec);
  40.   result :=FIsCollision;
  41. end;
  42.  

Jetzt habe ich aber keinen Plan wo und wie ich die Kollision am besten Einbau <_< . Ich müsste doch eine Abfrage vor dem zeichnen machen. Wenn keine Kollision ist dann Zeichen wenn doch eine Kollision dann Zeichen nicht die neue Position ein oder? Aber wie mache ich das am besten. Wie soll ich da vor gehen? Kann mir da einer weiterhelfen?
:)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Apr 15, 2003 12:02 
Offline
DGL Member

Registriert: Mo Jan 20, 2003 20:10
Beiträge: 424
Wohnort: nähe Starnberg
Ist schwierig zu sagen, hängt vom Aufbau der Engine ab. Normalerweise wird die Kollision vor dem Zeichen der gesamten Scene berechnet, damit es zu keine Darstellungsfehler kommt.

Was mir aufgefallen ist. Was bedeutet die Substraktion/Addition von 22 und 25? Falls das ein Rahmen oder ein Offset ist, gehört das mit in die Engine als Variablen, beim nächsten Projekt wo diese Engine verwendet wird, könnten diese Werte anders sein.

GoSprite := TGLImageSprite(Sprite);

besser ist

GoSprite := (Sprite as TGLImageSprite);

Damit wird ausgeschlossen, das ein Objekt welches nicht vom Type TGLImageSprite ist oder davon abgeleitet wurde, falsch gecastet wird. Da Du TObject als Paramtertyp fest gelegt hast, könntest Du z. B. TEdit übergeben und bekämst Du enwelche Speicherzugriffsfehler. Oder noch besser Sprite direkt als TGLImageSprite deklarieren, dann mekert der Compiler schon vorher.

Gruß
KidPaddle

_________________
http://www.seban.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Apr 15, 2003 15:19 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Ich habs bis jetzt immer so gemacht, das ich nach dem Zeichnen der Szene die Eingaben bzw. Bewegungen etwaiger Spielobjekte aktualisiere, und in dieser Schleife dann auch die Kollisionsabfrage einbaue.Dazu nutze ich ungefähr folgendes Schema :
- Zeichne Szene
Für alle Objekte :
- Wenn Objekt sich bewegt, dann prüfe ob die neue Position gültig ist (sprich keine Kollision), aber verändere die Objektposition nicht
- Wenn neue Position gültig ist, dann weise dem Objekt die neue (gültige) Position zu

Ist doch recht einfach, und wenn du mal nen Blick in mein zweites Bombermantutorial wirfst, wirst du dort nen ganz kleinen Abschnitt finden, in dem ich obiges Schema auch erkläre.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Apr 15, 2003 15:29 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jan 08, 2003 15:49
Beiträge: 266
Wohnort: Aachen
ok ich werde mal nach schauen was ich im tut finde.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Apr 15, 2003 15:31 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
TOpenGL hat geschrieben:
ok ich werde mal nach schauen was ich im tut finde.

Die Mühe kannst du dir sparen...dort steht ungefähr genau das drin was ich oben gesagt habe.Allerdings kann man zu einer recht simplen Kollisionsabfrage wie der zwischen diversen Rechtecken auch nicht mehr sagen.
Prüf also einfach vor der Bewegung ob die neue Position gültig ist, und wenn ja dann weist du deinem Objekt die neue Position zu.Einfach aber wirksam.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Apr 16, 2003 08:23 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jan 08, 2003 15:49
Beiträge: 266
Wohnort: Aachen
Ok habe es geschafft es wahr so simpel, ich habe es mir schwerer gemacht als es überhaupt ist.
thx


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 19 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.007s | 14 Queries | GZIP : On ]