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

Aktuelle Zeit: Fr Jul 18, 2025 11:06

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 4 Beiträge ] 
Autor Nachricht
BeitragVerfasst: So Mai 22, 2005 15:46 
Offline
DGL Member

Registriert: So Jan 30, 2005 13:13
Beiträge: 4
Ich habe folgendes problem.
In meinem Spiel gibt es zurzeit einen Spieler und erstmal noch 2 Wände. Beides sind bloß quads.
Jetzt wird auf folgende Weise festgestellt, ob der Spieler mit einer der Wänden kollidiert. Die Methode steht in der Oberklasse TElement.
Code:
  1.  
  2. function TElement.KollisionBerechnen(Element1, Element2: TElement): boolean;
  3. begin
  4.     //Ist die rechte seite des Element1 rechts von der linken seite des Element2?
  5.     If (Element2.x <= Element1.x+Element1.breite) and
  6.     //Ist die Linke Seite des Element1 kleiner als die rechte Seite des Element2?
  7.     (Element2.x+Element2.breite >= Element1.x) and
  8.     //Ist die obere Seite des Element1 größer als die untere Seite des Element2?
  9.     (Element2.y <= Element1.y+Element1.hoehe) and
  10.     //Ist die untere Seite des Element1 kleiner als die obere Seite des Element2?
  11.     (Element2.y+Element2.hoehe >= Element1.y)
  12.     then  result:=true
  13.     else result:=false;
  14. end;
  15.  

In dem OnIdle Event speichere ich die Positionswerte des Spielers bevor er sich bewegt und mache nachdem er sich bewegt hat eine Kollisionsabfrage. Wenn diese den Wert true liefert soll der Spieler an die Position gesetzt werden, an der er sich vorher befand.

Code:
  1.  
  2. Spieler.Render;
  3. //Die Positionswerte des Spielers speichern
  4. Spieler.xvorher:=Spieler.x;
  5. Spieler.yvorher:=Spieler.y;
  6. //Den Spieler bewegen lassen
  7. Spieler.Bewegen;
  8. //Kollisionen berechnen
  9. for i := 0 to lvl1.waende.count-1 do begin
  10.   If Spieler.KollisionBerechnen(Spieler, lvl1.waende[i]) = true then begin
  11.   //Spieler an die vorherige Position setzen
  12.     Spieler.x:=Spieler.xvorher; Spieler.y:=Spieler.yvorher;
  13.     end;
  14.   end;
  15.  

funktioniert auch alles wunderbar, allerdings habe ich mit dieser Methode nurnoch 30fps. Und wenn noch mehr Wände hinzukommen, dann sinds noch weniger fps.
Meine Frage lautet also: Was mache ich falsch?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Mai 22, 2005 16:12 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Genauso wie beim Rendern wird auch die Kollisionsabfrage um einiges schneller, wenn man einen Baum wie z.B. BSP Baum oder Occtree benutzt, weil man dann ja nicht mehr alle Objekte testen muß.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Mai 22, 2005 16:32 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Nov 13, 2004 11:00
Beiträge: 229
Wohnort: Steinhude
Zitat:
function TElement.KollisionBerechnen(Element1, Element2: TElement): boolean;
begin
//Ist die rechte seite des Element1 rechts von der linken seite des Element2?
If (Element2.x <= Element1.x+Element1.breite) and
//Ist die Linke Seite des Element1 kleiner als die rechte Seite des Element2?
(Element2.x+Element2.breite >= Element1.x) and
//Ist die obere Seite des Element1 größer als die untere Seite des Element2?
(Element2.y <= Element1.y+Element1.hoehe) and
//Ist die untere Seite des Element1 kleiner als die obere Seite des Element2?
(Element2.y+Element2.hoehe >= Element1.y)
then result:=true
else result:=false;
end;

wäre auch besser so:
Code:
  1. Result :=     (Element2.x <= Element1.x+Element1.breite) and (Element2.x+Element2.breite >= Element1.x)
  2.             and (Element2.y <= Element1.y+Element1.hoehe) and (Element2.y+Element2.hoehe >= Element1.y)


aber das wird wohl kaum deutlich an der Geschwindigkeit ziehen, genausowenig wie das verzichten auf Baumstrukturen bei 2 Wänden.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mai 23, 2005 14:04 
Offline
DGL Member

Registriert: So Jan 30, 2005 13:13
Beiträge: 4
Danke für die Antworten.
Der Thread kann geschlossen werden.
Ich habe festgestellt, dass die Performancebremse garnicht an der Kollisionsberechnung lag.


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 13 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 ]