Autor |
Beitrag |
Stadtfuchs
      
Beiträge: 17
DOS 6.22, Win 95, Win 98(SE), Win ME, Win 2000, Win XP Home, Win XP Professional, diverse SuSE Linux Systeme
D5 Ent, D7 Pro, D2005 Ent, C/C++5
|
Verfasst: Do 08.09.05 10:59
guten morgen
ein arbeitskollege und ich haben zur übung ein ganz billiges ping pong programmiert. es ist etwas umständlich und über 100k ecken programmiert (siehe angehängtes projekt) aber soweit funktioniert es schon recht gut. der ball startet in der mitte und eine zufällige startrichtung wird ermittelt (links oder rechts). eine kollisionsabfrage ist auch schon drin. dazu kommt noch jede menge unsinniger kleinkram wie punktezähler und ähnlicher schwachsinn. der ball ist ein image. so nun zur eigentlichen frage: wenn ein winkel ausgerechnet ist muss man dem ball sagen dass er auch gefälligst in diese richtung zu wandern hat, richtig? wie realisiert man das (evtl. formel, oder hinweise)? achja, zum testen haben wir derzeit nur die möglichkeit dass der ball nach links oder rechts geht. das kommt natürlich raus da wir ja winkel haben möchten. dieses links-rechts getue haben wir nur drin damit wir überhaubt irgendeine form von bewegung testen können.
mfg
stadtfuchs
ps: da eine doku fehlt kommt hier die steuerung. spieler1 w=hoch, s=runter. spieler2 pfeil_hoch=hoch, pfeil_runter=runter.
Einloggen, um Attachments anzusehen!
_________________ Nicht wundern, bin Anfänger ^_^
|
|
Marauder
      
Beiträge: 72
|
Verfasst: Do 08.09.05 11:16
Hi,
im Normalfall nimmst Du zwei Variablen für die Position X und Y. X bezeichnet die
Position in horizontaler Y die Position in vertikaler Richtung.
Dann benötigst Du zwei Variablen für die Bewegung, zum Beispiel X1 und Y1.
Bei jedem Game-Loop wird X1 und Y1 zu X und Y dazugezählt.
X1 kann Werte zwischen -1, 0 und 1 annehmen (oder eben die Schrittweite, z.B. -5,0 und 5, dann ist der Ball schneller)
Y1 ebenso.
Wenn nun der Loop durchläuft, vermindern oder erhöhen sich X und Y immer entsprechend dem Impetus (X1 und Y1)
Wenn der Ball auftrifft, könnt Ihr entweder einfach prüfen welche Werte jeweils X1 und Y1 hatten und dementsprechend ändern, also etwa:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| if (X1<0) and (Y1>0) then Y1=-1 if (X1>0) and (Y1>0) then Y1=-1 if (X1=0) and (Y1<0) then Y1=1 . . . |
Und noch etwas Zufall mit reinbringen, dass es nicht so Linear bleibt.
Oder Ihr könnt es Perfekt machen und den richtigen Winkel über Winkelfunktionen und Pythagoras etc.
berechnen. Wenn du mir deine eMail mailst, schicke ich Dir ein Breakout, was ich mal vor Jahren in Java geschrieben habe, dass funktioniert genauso.
Gruß
Herby
|
|
delfiphan
      
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: Do 08.09.05 12:29
Hier kannst du dir den Code einer einfachen Kugelsimulation (ähnlich Billard) anschauen. Die Kugeln bewegen sich in alle Richtungen und können miteinander kollidieren. Vielleicht hilft's ja was.
Der eigentliche Aufprallwinkel brauchst du dir gar nicht auszurechnen (ansonsten geht's mit ArcTan2 aus der Math-Unit).
|
|
TM
      
Beiträge: 74
Win xp
D7 ET
|
Verfasst: Do 08.09.05 19:32
Hallo;
Wenn du den Winkel und die Geschwindigkeit im Spiel ändern willst, kannst du in 2 Variablen Geschwindigkeit und Winkel ablegen.
Zum Ball-verschieben verwendest du dann sin und cos um die x-/y-änderung zu berechnen.
Aber wie gesagt das brauchts eigentlich nur, wenn du Geschwindigkeit und Winkel im Spiel ändern willst, sonst gehts mit Variablen direkt für x/y-änderung schneller (wies Marauder beschreibt).
..
_________________ Dieser Beitrag enthält keine Schreibfehler.
Das sind versteckte Hinweise.
|
|
Solaris
      
Beiträge: 33
|
Verfasst: Di 13.09.05 17:26
Sooo....
Ich bin die zweite Person die bei dem Programm seine Finger mit im Spiel hatte...
Das Programm ist soweit erstmal fertig (sieht zwar nicht perfekt aus aber wir haben getan was wir konnten).
Was noch nicht 100%ig so ist wie wir es uns wünschen ist:
- Der "Ball" bewegt sich beim richtigen Einfallswinkel am Schläger entlang und wird entweder zurück aufs "Spielfeld" geworfen oder geht ins Aus
- Der Ball bewegt sich ab und zu im 90° Winkel nach oben oder unten.
- Wenn der Ball sich 90° auf der horizontalen Linie bewegt ignoriert er die beiden Schläger und geht sofort ins Aus
- Keine Winkelveränderung wenn der Ball zum Beispiel auf dem oberen viertel eines Schlägers aufprallt
Aber sonst finde ich persönlich das Programm ganz gut und hoffe auf ein bisschen mehr Kritik als bei unseren ersten Versuch 
Einloggen, um Attachments anzusehen!
|
|
NCortex
      
Beiträge: 126
WIN 2000
D7 Enterprise
|
Verfasst: Mi 14.09.05 01:19
du wolltest kritik, sollst du bekommen, ist alles nicht böse gemeint, sondern ein RAT
also, zum ersten ist dein Code sehr unübersichtlich und schwer zu lesen, versuche bei der variablenvergabe Namen mit mehr bedeutung zu geben und ein zwei kommentare dazu zu schreiben. Einrücken hilft auch oft
des weiteren, schau dir mal while-schleifen an, dann kannst du sowas vermeiden:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| x := random(10) - 5; y := random(10) - 5; if (x=0) or (y=0) then begin x := random(10) - 5; y := random(10) - 5; end |
schau dir mal boolscheterme an, in delphi gibt es noch auch ein "or" (logisches oder)
dann ist sowas hier überflüsig:
aus Delphi-Quelltext 1: 2: 3: 4: 5:
| if (x>0) and (y>0) then y := y * (-1) else if (x>0) and (y<0) then y := y * (-1); |
wird: Delphi-Quelltext 1: 2:
| if (x>0) and ((y>0)or(y<0)) then y := y * (-1); |
ähm ich seh hier grade auch was lustiges :
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23:
| if (x<0) and (y>0) then x := x * (-1) else if (x>0) and (y>0) then x := x * (-1); if (x=0) and (y>0) then x := x * (-1) else if (x=0) and (y<0) then x := x * (-1); if (x<0) and (y<0) then x := x * (-1) else if (x>0) and (y<0) then x := x * (-1); if (x<0) and (y=0) then x := x * (-1) else if (x>0) and (y=0) then x := x * (-1); |
sind das da oben nicht wirklich alle möglichen vorkommnisse? du kannst auch sofort x := x * (-1) hinschreiben
delphi hat auch die verneinung: ein "not" vor einem booleschen term, kert dessen wahrheitswert um.
wenn du zum beipsiel ausschließen willst, dass der ball zurückgeschossen wird, wenn er senkrecht auf den schläger trifft, kannm an auch: if not (y=0) then ...
schreiben..
ich mein, das spiel funktioniert bis jetzt und soll auch nur zu lernzwecken dienen. Ich finde es soweit schon gut, aber da ist programmierkenntnistechnisch noch einiges rauszuholen. schau dir mal einen record an. damit könntest du halbwegs ordnung in deine variablensammlung geben. oder, wenn du noch eine stufe höher gehen möchtest, den ball in eine eigene classe zu schreiben und einen schritt näher der OOP (objekt orientierten programmierung) zu kommen. du bist am anfang eines langen weges zum programmierer, lass dich nicht entmutigen, sooo weit bin ich auch noch nciht fortgeschritten.
ich schick mal ein projekt von mir mit, auch ein pingpong, was ich anfgefangen hab, aber nie zuende gebracht...
ich habe versucht es alles soweit wie möglich in OOP zu halten, ist mir zwar nicht ganz gelungen, aber egal...
mfg NC
Einloggen, um Attachments anzusehen!
_________________ "...by all means, do not use a hammer." (aus einer IBM Technikerdokumentation ca. 1920)
--->außer es kam von Microsoft<---
|
|
Solaris
      
Beiträge: 33
|
Verfasst: Mi 14.09.05 09:39
Ich habe mir mal dein Programm angesehen und musste feststellen das die Winkel beim humanoiden Spieler nicht wirklich gut funktionieren.
Wenn der Ball grade auf den Schläger trifft wird er in einem anderen Winkel zurückgeworfen (Trifft im 90° Winkel auf und fliegt im z.B. 23° Winkel wieder weg).
Ich lerne es ja noch und möchte auch nicht grad mit Objekten arbeiten, das geht mir zu tief in die Materie.
|
|
NCortex
      
Beiträge: 126
WIN 2000
D7 Enterprise
|
Verfasst: Mi 14.09.05 13:05
das ist aber absicht... der austrittswinkel hängt davon ab, wo der ball den schläger trifft..
es wird der winkel zwischen dem Mittelpunkt des balls und dem mittelpunkt des spielers gebildet, dann wird 50% des alten winkels übernommen und 50% in eine richtung, abhängig davon, wo man den ball trifft.
trifft der SChläger den Ball genau in der Mitte, so ist auch der austrittswinkel = eintritswinkel...
Das funktioniert, aber leider nicht immer... manchmal macht der immernoch komische sachen. aber wie gesagt, das war nur so ein 2 stunden langeweile projekt
_________________ "...by all means, do not use a hammer." (aus einer IBM Technikerdokumentation ca. 1920)
--->außer es kam von Microsoft<---
|
|
Solaris
      
Beiträge: 33
|
Verfasst: Mi 14.09.05 13:12
Muss das auch so sein das wenn der Ball in einem schrägen Winkel auf den Schläger trifft dieser Ball in dem selben Winkel wieder zurück fliegt (Nicht in die andere Richtug sondern in die selbe Richtung zurück z.b. Ball kommt von links unten, trifft auf dem Schläger auf und fliegt dann nach links unten zurück)?
|
|
NCortex
      
Beiträge: 126
WIN 2000
D7 Enterprise
|
Verfasst: Do 15.09.05 01:28
ja, das hängt davon ab, wo man den ball trifft... wenn man ihn am unteren ende vom schläger trifft, dann fliegt auch der ball mehr nach rechts unten.
_________________ "...by all means, do not use a hammer." (aus einer IBM Technikerdokumentation ca. 1920)
--->außer es kam von Microsoft<---
|
|
Stadtfuchs 
      
Beiträge: 17
DOS 6.22, Win 95, Win 98(SE), Win ME, Win 2000, Win XP Home, Win XP Professional, diverse SuSE Linux Systeme
D5 Ent, D7 Pro, D2005 Ent, C/C++5
|
Verfasst: Do 15.09.05 10:31
wir haben der übersicht / geschwindigkeit halber (und auch weil mich mein ausbilder mit einem freundlichen grinsen darauf hingewiesen hat...) die größeren berechnungen in eigentändige funktionen / prozeduren eingebaut. auch der quellcode ist nun etwas mehr kommentiert. reicht das so oder ist das noch nicht genug? die winkelberechnung habe ich noch nicht korrigiert aber das kommt auch noch. wenn ich die winkel hab, werde ich aber nicht mehr das komplette projekt, sondern nur noch den winkelcode posten. da das projekt soweit spielbar ist, lade ich die (warscheinlich.) endgültige version jetzt mal hoch. also besten dank für die tipps und hinweise. wenn wir noch mal fragen haben meldet sich einer von uns nochmal.
mfg
stadtfuchs
Einloggen, um Attachments anzusehen!
_________________ Nicht wundern, bin Anfänger ^_^
|
|
|