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

Aktuelle Zeit: Fr Jul 18, 2025 11:19

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



Ein neues Thema erstellen Auf das Thema antworten  [ 11 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Breakout Klon
BeitragVerfasst: Fr Aug 20, 2004 15:40 
Offline
DGL Member

Registriert: Sa Feb 28, 2004 15:36
Beiträge: 40
Hallo,

ich bin grad' dabei einen Breakout-Klon zu programmieren.
An OpenGL Befehlen haperts immoment nicht, aber ich habe etwas Schwierigkeiten mit der Kollisionserkennung.


Zu allererst mal ein kleines Beispiel (im Attachment):

Wie man (hoffentlich) sehen kann, sind zwei Szenenarien dargestellt, die so aus dem Spiel stammen könnten.
In beiden Situationen kommt der Ball im gleichen Vektor auf den Stein zugeflogen, prallt aber anders ab!

Also meine Frage:

1. Wie kann ich herausfinden, dass der Stein berührt wurde.
----> klar, dass das mittels "if (ball.x < brick.x + brick.width) and (ball.x > brick.x) and (ball.y < brick.y + brick.height) and (ball.y > brick.y) geht! weiterlesen!!!

2. ---> Wie kann ich herausfinden, wo er berührt wurde? Wobei: "if (ball.x = brick.x + brick.width)" nicht gilt, da der ball sich auch mal mit 5px/frame bewegen kann!

Wenn hier irgendwer meine Frage versteht oder vielleicht sogar eine Lösung hat: Danke!

PS: Ist das hier das richtige Forum? Ich war mir nicht ganz sicher.


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Aug 20, 2004 20:18 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Feb 24, 2003 18:19
Beiträge: 165
Wohnort: Cologne
naja, da gibts verschiedene möglichkeiten... am einfachsten wäre es wohl wenn du erst z.b. die x-position veränderst und guckst ob es dann eine kollision gibt (und wenn ja dann die x-geschwindigkeit negativ setzt) und danach die y-position veränderst und das selbe machst. das sollte kein problem sein wenn du das ganze mit time based movement machst...

_________________
www.omfg.biz - aktuelles projekt


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: mmmh...
BeitragVerfasst: Sa Aug 21, 2004 12:14 
Offline
DGL Member

Registriert: Sa Feb 28, 2004 15:36
Beiträge: 40
mmmh... eigentlich hast du ja völlig recht....
sollte kein problem sein, wenn man alle Schritte durchgeht.

Ich kriege hier aber trotzdem bald ne Kriese. Ich habe folgenden Code geschrieben...

Code:
  1.  
  2.   for i := 1 to 14 do
  3.   begin
  4.     for ii := 1 to 6 do
  5.     begin
  6.       if not(level[i,ii] = 0) then
  7.       begin
  8.         if (ball[2] = level_pos[i,ii,4]) and (ball[1] > level_pos[i,ii,1]) and (ball[1] < level_pos[i,ii,3]) then
  9.         begin
  10.           ball[4] := abs(ball[4]);
  11.           level[i,ii] := 0;
  12.         end;
  13.  
  14.         if (ball[2]+ball_width = level_pos[i,ii,2]) and (ball[1] > level_pos[i,ii,1]) and (ball[1] < level_pos[i,ii,3]) then
  15.         begin
  16.           ball[4] := -abs(ball[4]);
  17.           level[i,ii] := 0;
  18.         end;
  19.  
  20.         if (ball[1]-ball_width = level_pos[i,ii,1]) and (ball[2] > level_pos[i,ii,2]) and (ball[2] < level_pos[i,ii,4]) then
  21.         begin
  22.           ball[3] := -abs(ball[3]);
  23.           level[i,ii] := 0;
  24.         end;
  25.  
  26.         if (ball[1] = level_pos[i,ii,3]) and (ball[2] > level_pos[i,ii,2]) and (ball[2] < level_pos[i,ii,4]) then
  27.         begin
  28.           ball[3] := abs(ball[3]);
  29.           level[i,ii] := 0;
  30.         end;
  31.       end;
  32.       sieg := sieg + level[i,ii];
  33.     end;
  34.   end;
  35.  


Erklärungen:
i und ii: Zähler. (Wie viele Bricks in jeder Zeile soll er berechnen)
level: da steht drin WAS für ein stein es ist. (0 = kein Stein)
ball[1..2]: x,y Achse sowie ball[3..4] x,y Achsen-geschwindigkeit
level_pos[i,ii,1..4] Positionen der Bricks. (jeweils von links oben (1..2) bis rechts unten (3..4))

Meine Frage: Warum löscht er IMMER alle Bricks die unter ihm liegen???
Also: ball kommt z.B. von links oben und trifft auf einen stein. Dann löscht er alle Steine die unter ihm liegen.


Zuletzt geändert von Accessor am Sa Aug 21, 2004 18:00, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Aug 21, 2004 15:34 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jun 19, 2003 10:44
Beiträge: 991
Wohnort: Karlsfeld (nahe München)
Ein Breack-Out Klone war auch mal einer meiner ersten Programmierungen.
So weit ich mich erinnere, habe ich geprüft von welcher Seite aus der Ball den Block im nächsten Zug berühren würde.

Bevor ich mir aber deinen Code genauer anschaue, würde ich dich bitten den Ball statt durch einen Array durch das hier zu repräsentieren.
Code:
  1.  
  2. type
  3.  TBall=record
  4.   Speed:TPoint;
  5.   Position:TPoint;
  6. end;
  7.  
  8. var
  9. Ball:TBall;
  10.  

Denn
Ball.Position.X ist wesentlich verständlicher als Ball[2], was man ja mit dem Ball Nr 3 verwechseln kann.

_________________
Danke an alle, die mir (und anderen) geholfen haben.
So weit... ...so gut


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Alles klar...
BeitragVerfasst: Sa Aug 21, 2004 18:02 
Offline
DGL Member

Registriert: Sa Feb 28, 2004 15:36
Beiträge: 40
Alles klar...

hier der gewünschte und geänderte Code:

Code:
  1.  
  2.   for i := 1 to 14 do
  3.   begin
  4.     for ii := 1 to 6 do
  5.     begin
  6.       if not(level[i,ii] = 0) then
  7.       begin
  8.         if (ball.Position.Y = level_pos[i,ii,4]) and (ball.Position.X > level_pos[i,ii,1]) and (ball.Position.X < level_pos[i,ii,3]) then
  9.         begin
  10.           ball.Speed.Y := abs(ball.Speed.Y);
  11.           level[i,ii] := 0;
  12.           break;
  13.         end;
  14.  
  15.         if (ball.Position.Y+ball_width = level_pos[i,ii,2]) and (ball.Position.X > level_pos[i,ii,1]) and (ball.Position.X < level_pos[i,ii,3]) then
  16.         begin
  17.           ball.Speed.Y := -abs(ball.Speed.Y);
  18.           level[i,ii] := 0;
  19.           break;
  20.         end;
  21.  
  22.         if (ball.Position.X-ball_width = level_pos[i,ii,1]) and (ball.Position.Y > level_pos[i,ii,2]) and (ball.Position.Y < level_pos[i,ii,4]) then
  23.         begin
  24.           ball.Speed.X := -abs(ball.Speed.X);
  25.           level[i,ii] := 0;
  26.           break;
  27.         end;
  28.  
  29.         if (ball.Position.X = level_pos[i,ii,3]) and (ball.Position.Y > level_pos[i,ii,2]) and (ball.Position.Y < level_pos[i,ii,4]) then
  30.         begin
  31.           ball.Speed.X := abs(ball.Speed.X);
  32.           level[i,ii] := 0;
  33.           break;
  34.         end;
  35.       end;
  36.       sieg := sieg + level[i,ii];
  37.     end;
  38.   end;
  39.  


Ich hoffe es kann mir jetzt jemand helfen!? :cry:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Aug 23, 2004 12:43 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jun 19, 2003 10:44
Beiträge: 991
Wohnort: Karlsfeld (nahe München)
Erstmal danke für die Änderung welche das ganze schon besser lesbar macht.

Könntest du das was du mit Level deklariert hast nochmal posten?
Könntest du nochmal detailiert beschreiben was level[i,ii] oder level[i,ii,4] ist?

Oder nehme am besten auch dafür einen aussagekräftigen Record oder eine Klasse her.


Code:
  1.  
  2. if (ball.Position.Y = level_pos[i,ii].bottom) and (ball.Position.X > level_pos[i,ii,1]) and (ball.Position.X < level_pos[i,ii,3]) then
  3.  

Was frägst du hier zum Beispiel ab?
Vermutung:
Wenn der sich genau Ball unterhalb des Steines befindet.(->Speed darf maximal 1 Sein damit der Ball auch an diese Position kommt.)
Und sich die linke Seite des Balles sich innerhalb des Steines befindet(->Bal nimmt keinen Platz weg) dann:

1)Speed.X soll abs von Speed.X betragen.(Wieso nicht einfach "-")
2)???(Du setzt einen Array auf 0?)
3)Verlasse die Schleife.

Ich hoffe dieses Kommentar hilft dir weiter.
Ach ja wo wir bei Kommentaren sind du kannst sie ruhig auch in deinem Quelltext verwenden.
MfG
IFlo

_________________
Danke an alle, die mir (und anderen) geholfen haben.
So weit... ...so gut


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Aug 23, 2004 16:33 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
IFlo hat hier durchaus recht mit seinen Styletipps. Es kann zwar jeder programmieren wie er will, aber hin und wieder bringt schon die Verwendung von Aussagekräftigen namen und Kommentare im Code das Problem zum Vorschein.

Am besten du formatiertst in Zukunft nicht nur fürs Form sondern auch für dich deinen Code. :wink:

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Aug 23, 2004 16:50 
Offline
DGL Member

Registriert: Mi Okt 16, 2002 15:06
Beiträge: 1012
Bin kein experte auf dem gebiet aber so würde ichs machen:

Code:
  1.  
  2. type
  3.   TBall = record
  4.     Position : TVector3;
  5.     Direction : TVector3;
  6.     Radius : Single;
  7.   end;
  8.  


Ball.Position ist die aktuelle Position, Direction ist der Normal/Richtungs Vector welcher der Ball grad schaut/fliegt.
Wenn du nur normale Linien hast, z.b. nen Brick = 4 Linien, (Oben, Unten, Links, Rechts) ist das denk ich einfach.

Du brauchst nur ne routine, welche prüft ob eine Sphere(Kugel), eine Linie (2 punkten) schneidet.

Wenn du dann geprüft hast, ob der Ball die obere linie berührt, dann berechnest du einen Neuen Normal/Richtungs vektor.
Theoretisch müsste invertieren von den Normal/Richtungs Vector schon reichen.

Nur ne idee, obs funzt keine ahnung :p


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Aug 24, 2004 20:17 
Offline
DGL Member

Registriert: Sa Feb 28, 2004 15:36
Beiträge: 40
Also erst einmal Danke für die Hilfe.

Ich habe mir jetzt noch einmal meinen ganzen Code Zeile für Zeile durchgeguckt und endlich den Fehler gefunden.
Es lag an einem Break was ich aus gründen die ich bis jetzt nicht verstehe reingeschrieben habe und mir immer fröhlich die Prozeduren abgebrochen hat... :?

Na, ja.

Was meinen Programmierstil angeht:

Jaja... Das sagen viele und ich merke es selber auch...
irgendwann wird der Code so unübersichtlich, dass ich andauernd irgendwelche Variablen nachgucken muss oder Prozedurennamen vergessen habe.
Zu Kommentaren bin ich sowieso viel zu faul...
Aber ich habe mir jetzt einen guten Vorsatz gemacht: Ich werde strukturierter. Das heißt mein Code wird strukturierter.
Wie auch immer.

Den Breakout Klon habe ich zwar noch nicht ganz fertig aber ich weiß so in etwa wie es funktioniert. Außerdem habe ich eine Menge dazu gelernt. Nicht nur was meine schlampige Programmstruktur angeht, sondern auch was z. B. level Editoren anbelangt und die damit zusammenhängende Strukturierung eines Levels (auch wenn es nur klein ist).

Verzeiht mir, dass ich mir das hier von der Seele schreibe aber das hier war mein erstes als ein Projekt anzusehendes Spiel via OpenGL.
Vielleicht bekomme ich irgendwann noch einmal Lust und ich mache den Klon ganz fertig...
wer weiß...


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Aug 24, 2004 20:45 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Um zumindest von der Formatierung her Ordnung in seinem Quelltext zu halten, kann ich nur
DelForExp http://www.dow.wau.nl/aew/DelForExp.html empfehlen. Das Programm integriert sich in die IDE und mit STRG+D ist alles schön sauber formatiert.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Aug 26, 2004 22:05 
Offline
DGL Member

Registriert: Mi Okt 16, 2002 15:06
Beiträge: 1012
Auf meiner seite www.radical3d.de findest auch nen angefangen breakout klon.
Mit Leveleditor usw. kannst ja mal checken und ideen abgucken ;)

matane,
Final


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 5 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.009s | 15 Queries | GZIP : On ]