Code Probleme - Pong - Winkel COS,SIN, FOR TO

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

pinochino

Betreff: Code Probleme - Pong - Winkel COS,SIN, FOR TO

BeitragFr, Jun 17, 2011 7:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Heyo Community

Ich Programmiere jetzt seit ca. 3 Tagen und habe gestern das Pong Tutorial von der "http://de.wikibooks.org/wiki/B....28Pong.29" studiert.

Ich meine auch größtenteils alles verstanden zu haben, also rangesetzt und mit gelegentlichen "Sichergehen",
Pong nachgebaut.

Gesamter Code
BlitzBasic: [AUSKLAPPEN]
; Mein Pong - Mal sehen was dabei wohl Rauskommt!

Graphics 800,600,0,2
SetBuffer BackBuffer()
ftimer =CreateTimer(60)


Const KEY_ESC=1, KEY_W=17, KEY_A=30, KEY_S=31, KEY_D=32, KEY_SPACE=57, KEY_LEFT=203 ,KEY_RIGHT=205

Global kugel=LoadImage("Kugel.png")
MidHandle kugel
Global spieler1=LoadImage("pongspieler1.png")
MaskImage spieler1, 255,255,255
MidHandle spieler1

Global spieler2=LoadImage("pongspieler2.png")
MaskImage spieler2, 255,255,255
MidHandle spieler2


Global seitenwand=LoadImage("seitenwand.png")
MaskImage seitenwand, 255,255,255

Global xmax=800, ymax=600

Global kugelx#
Global kugely#
Global speed = 5

Global st1x = xmax/2
Global st2x = xmax/2

Global winkel



ClsColor 0,100,100


kugel_reset()


Repeat
WaitTimer(ftimer)



For i = 0 To 1
If i= 1 Then x=xmax-50 ElseIf i=0 Then x=0 ; x= 750 (rechts) and x=0 (links)
For i2= 0 To ymax/50
DrawImage seitenwand, x,i2*50
Next
Next

If KeyDown(KEY_SPACE) Then kugel_reset()

;spieler 1 and 2 anzeigen
DrawImage spieler1, st1x,ymax-50
DrawImage spieler2, st2x,ymax-550
;steuerung spieler 1 ( unten )

If KeyDown(KEY_A) Then st1x=st1x-speed
If KeyDown(KEY_D) Then st1x=st1x+speed

;steuerung spieler 2 ( oben )

If KeyDown(KEY_LEFT) Then st2x=st2x-speed
If KeyDown(KEY_RIGHT) Then st2x=st2x+speed
; spieler bleiben im Bild

If st1x=745 Then st1x=st1x-speed ElseIf st1x=55 Then st1x=st1x+speed
If st2x=745 Then st2x=st2x-speed ElseIf st2x=55 Then st2x=st2x+speed

;kollision spieler

If ImagesCollide(spieler1,st1x,ymax-50,0,kugel,kugelx,kugely,0) Then
winkel=360-winkel
abweichung=2*(st1x-kugelx)
winkel=winkel+abweichung
EndIf

If ImagesCollide(spieler2,st2x,50,0,kugel,kugelx,kugely,0) Then
winkel=360-winkel
abweichung=2*(st2x-kugelx)
winkel=winkel-abweichung
EndIf

;kollision wände

If kugelx<60 Then
winkel=180-winkel
EndIf

If kugelx>xmax-60 Then
winkel=180-winkel
EndIf

;winkel nicht über 0-360

If winkel>360 Then winkel=winkel-360
If winkel<0 Then winkel=winkel+360

;das Berechnen der Kugelkoordinaten
kugelx=kugelx+Cos(winkel)*speed
kugely=kugely-Sin(winkel)*speed



;Kugel aus bild dann kugelreset

If kugely<10 Then kugel_reset()
If kugely>590 Then kugel_reset()


; kugel anzeigen
DrawImage kugel, kugelx,kugely
Flip
Cls
Until KeyHit(KEY_ESC)
End

Function kugel_reset()

kugelx=xmax/2:kugely=ymax/2
If Rand(0,1)=1 Then winkel=Rnd(105,45) Else winkel=Rnd(315,225)

End Function


Nun gibt es ein Paar abschnitte die mir völlige Rätsel sind und welche ich quasi nur durch direktes Abschreiben,
in meinen Code Implementieren konnte Embarassed

BlitzBasic: [AUSKLAPPEN]
	;das Berechnen der Kugelkoordinaten
kugelx=kugelx+Cos(winkel)*speed
kugely=kugely-Sin(winkel)*speed

Das ist mir z.B. ein Absolutes Rätsel Befehle cos, sin, hab ich mir öfter angeschaut werd aber irgendwie nicht schlau draus.

BlitzBasic: [AUSKLAPPEN]
		For i = 0 To 1
If i= 1 Then x=xmax-50 ElseIf i=0 Then x=0 ; x= 750 (rechts) and x=0 (links)
For i2= 0 To ymax/50
DrawImage seitenwand, x,i2*50
Next
Next

Diesen Teil verstehe ich Ansatzweise, allerdings kann ich trotz verschiedener tutorials und erläuterungen die zu finden waren "for" & "to" noch nicht richtig einsetzen.

BlitzBasic: [AUSKLAPPEN]
	;kollision wände

If kugelx<60 Then
winkel=180-winkel
EndIf

If kugelx>xmax-60 Then
winkel=180-winkel
EndIf

Hier versteh ich das ganze dank "Winkel" nicht was wahrscheinlich wieder irgendwo auf cos/sin basiert.

Also wenn jemand bereit ist mir mit diesen Problemen zu helfen wäre dass echt klasse.
vllt versuchen die Problem-code-abschnitte Auseinanderzunehmen und zu Erläutern so das auch ich Dummie
das ganze verstehe. Crying or Very sad Confused

mfg
pinO

Ana

BeitragFr, Jun 17, 2011 9:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Die Cos und Sin Funktionen sind halt einfach mathematische Funktionen, die jeweils die X oder Y Koordinate im Einheitskreis beschreiben. Wenn du das nicht in Mathe hattest, das genau zu erklären würde die dauer meines Kaffees übersteigen, von daher, entweder Mathebuch anschauen oder falls du das wirklich noch nicht hattest hin nehmen, das man damit eine Bewegung erhält, die die Länge Speed hat, und die Distanz dem Winkel entsprechend auf X und Y verteilt. Man also gleich schnelle Bewegungen in beliebige Richtungen erhält.

Eine For to schleife ist eine Zählschleife. Die Variable, hier das i wird nacheinander vom Wert links vom to bis zum Wert rechts vom to gesetzt. Die Schritte sind dabei standart mäßig 1 groß können aber mit einem dahinter gehängten Step beliebig gesetzt werden.

BlitzBasic: [AUSKLAPPEN]
For i = 0 To 9
Print i + " "
Next


würde also 0 1 2 3 4 5 6 7 8 9 ausgeben. For ist immer gut wenn du weißt wie oft du etwas machen willst und nicht auf eine Bedingung wartest wie bei while oder repeat. Letzt endlich kannst du sie aber alle durcheinander ersetzten und es ist mehr für den komfort des Programmierers.

Die letzten Zeilen, geben das Reflexionsverhalten wieder. Wie du vielleicht weißt hat ein Kreis 360 Grad. Die Sinus und Cosiunsfunktionen verwenden auch nur Winkel von 0 bis 360 Grad (wobei 360 auch gleichzeitig wieder 0 ist weil man dann ja einmal rum ist) wenn du nun + 180 Grad rechnest hast du also einen halben Kreis gemacht und schaust dann in die gegenüber liegende Richtung.
Beim Abprallen ist es ja so das dein Winkel beim Eintritt, gleich dem Austritts Winkel ist, oder anders gesagt wenn du was gegen eine Wand wirfst fliegt es in die andere Richtung aber genau so steil wieder weg. Das wird mit dem 180 drehen erzeugt. Die If - Abfragen schauen hier denke ich mal ob die Kugel gerade den Rand erreicht hat.
Don't only practice your art,
but force your way into its secrets,
for it and knowledge
can raise human to divine

Midimaster

BeitragFr, Jun 17, 2011 9:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Die Kugel bewegt sich jeweils eine bestimmte Strecke (Speed) in eine bestimmte Richtung (Winkel).

Mit Sinus und Cosinus kannst Du einen solchen Richtungsverktor in eine X- und eine Y-Komponente zerlegen. Erst damit ist es Dir möglich aus Winkel und Speed die nächste Bildschirmposition der Kugel zu errechnen.

user posted image
 

PhillipK

BeitragFr, Jun 17, 2011 13:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Hierzu noch einen weiteren Link:

Wikipedia

Dort ist ein, wie ich finde, sehr brauchbares Animiertes Bild zu diesem Thema.
Es steht neben der überschrift "Definition am Einheitskreis

Auch ohen Ahnung von Sinus und Cosinus kann man sehr leicht erkennen, wie sich Sinus und Kosinus bei entsprechenden Winkeln verhalten.

BlitzBasic: [AUSKLAPPEN]
	;das Berechnen der Kugelkoordinaten
kugelx=kugelx+Cos(winkel)*speed
kugely=kugely-Sin(winkel)*speed


Speed kannst du dir wie einen Faktor vorstellen.

Cos(Winkel) gibt einen wert zurück, welcher zwischen -1.0 und 1.0 liegt. Dieser wird mit Speed multipliziert und
gibt so eine gewisse verschiebung zurück, welche auf KugelX draufaddiert wird.

Sin(Winkel) macht das selbe, nur das es sich auf die Y achse bezieht.

------------------------------

BlitzBasic: [AUSKLAPPEN]
		For i = 0 To 1
If i= 1 Then x=xmax-50 ElseIf i=0 Then x=0 ; x= 750 (rechts) and x=0 (links)
For i2= 0 To ymax/50
DrawImage seitenwand, x,i2*50
Next
Next


For ist eine schleife.

i ist eine variable, die in dieser schleife hochgezählt wird. i = 0 initialisert diese mit 0.
Das heißt, zu Schleifen beginn ist i = 0.

To gibt die bedingung an. to 1 heißt, sobald i > 1 ist, findet kein weiterer schleifendurchlauf statt.
Zumindest ist das so in Blitzmax :>

-----------------

Und zu nummer 3:

BlitzBasic: [AUSKLAPPEN]
	;kollision wände

If kugelx<60 Then
winkel=180-winkel
EndIf

If kugelx>xmax-60 Then
winkel=180-winkel
EndIf


Es wird überprüft, ob die Kugel im Linken oder Rechten bildschirmbereich liegt, rate ich jetzt einfach mal.
xmax dürfte die Rechte ecke sein, 0 die linke.

Sollte einer dieser Fälle eintreten, wird der winkel einmal umgedreht.
Merke: Ein Kreis hat einen Winkel von 360°.
Da X und Y positionen per Winkel berechnet werden, wird dieser einfach komplett umgedreht.

Schlägt er Links auf, so gehts nach rechts weiter, schlägt er rechts auf, so gehts links weiter.

Ich hoffe ich konnte helfen. Hatte leider nichtmehr genug Zeit um alles zu lesen, aber habe dennoch grade einen Schreibe wahn.
Muss dann mal los, schaue später nochmal nach, ob meine Geistigen ergüsse was gebracht haben Smile

Viel spass noch ^-^
 

pinochino

BeitragFr, Jun 17, 2011 18:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Vielen Danke für die Hilfreichen Antworten.

Trotzdem möchte ich nochmal zeigen was in meinem kopf passiert wenn ich folgendes sehe :

BlitzBasic: [AUSKLAPPEN]

If kugelx<60 Then
winkel=180-winkel
EndIf

Das ist mir klar:
BlitzBasic: [AUSKLAPPEN]
If kugelx<60 Then

Das Nicht:
BlitzBasic: [AUSKLAPPEN]
winkel=180-winkel


winkel=180-winkel

In meinem "Kopf" ist jetzt winkel=0
Weil wenn: winkel = 180-winkel heißt für mich 180 = 180-180

Also stehe ich in dem Punkt weiterhin auf'm Schlauch.
Sagt mir bitte was ich "Übersehe".

Oder helft meiner Logik etwas auf die Sprünge.

Vielen Dank für Euer Engagement. Embarassed

mfg

pinO

Xeres

Moderator

BeitragFr, Jun 17, 2011 18:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Der Winkel wird geändert, d.h. die Flugrichtung. 180° deuten nach links, 0° nach Rechts.
Arrow Sinus, Kosinus, Atan2 Beispielcode
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Midimaster

BeitragFr, Jun 17, 2011 19:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Zunächst einmal:

"Winkel = 180 - Winkel" ist kein Ausdruck im mathematischen Sinn. Du darfst es also nicht so lesen: "180° = 180° - 180°"

Vielmehr handelt es sich um eine Zuweisung, sprich....

"Der Winkel sei ab jetzt 180° minus seinem alten Wert"

Es ist das gleiche wie bei ...

"A=B+2"

"A sei ab jetzt die Summe von B und Zwei"

Das lustige (und damit unlogische) ist, das dies bei Programmiercode auch mit dem gleichen Wert vor und hinter dem "=" erlaubt ist:

"A=A+2"

"A sei ab jetzt die Summe aus A und Zwei"



Nun zu den Winkeln, also,...

die Kugel saust ja in einem bestimmten Winkel auf die Bande zu. Sagen wir mal 45°. An der Bande soll sie abprallen und dann saust sie ja mit einem anderen Winkel wieder zurück. Kommt sie mit 45°, dann wäre grade 135° der korrekte neue Winkel, mit dem sich die Kugel wieder entfernt.

Kommt sie z.b. mit 0° auf die Bande, also senkrecht, dann soll die ja genau senkrecht wieder zurückprallen, was 180° entspräche.

Kommt Sie z.B. ganz flach an die Bande z.b. mit 85°, dann soll sie sich auch ganz flach wieder von der Bande entfernen. Richtig wären also 95°

Aus diesem Werten kannst Du nun eine Tabelle machen und nach einer Regelmäßigkeit suchen. Daraus liese sich dann eine Formel für beliebige Anprallwinkel erstellen:

Code: [AUSKLAPPEN]
Vorwinkel  Nachwinkel
  85°       95°
  45°      135°
   0°      180°
 -45°     -135°
 -85°      -95°


user posted image

eine Formel, die nun aus allen linken Werten als Ergebnis die rechten Werte liefert:

Nachwinkel= 180° - Vorwinkel

(Probiers aus! Es geht sogar mit -45°, weil...

180°- ( -45°) = 225°

...und das entspricht exakt den -135° :

360°-135° = 225°
  • Zuletzt bearbeitet von Midimaster am Fr, Jun 17, 2011 19:49, insgesamt 3-mal bearbeitet
 

pinochino

BeitragFr, Jun 17, 2011 19:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Also brechnet er damit

Abprallwinkel = 180 - Aufprallwinnkel

winkel = 180 - winkel


z.b.

Abprallwinkel =180° - Aufprallwinkel 135°

Abprallwinkel = 45°


Question Question Question Question Embarassed Embarassed

Midimaster

BeitragFr, Jun 17, 2011 19:44
Antworten mit Zitat
Benutzer-Profile anzeigen
ja, genau!

Wenn eine Kugel mit 135° rolt, dann rollt sie nach rechts unten. (siehe Zeichnung). in dieser Richtung könnte sie nur an der rechten Bande aufprallen.


Wenn eine Kugel auf der rechten seite mit 135° aufprallt, dann kommt sie also von links oben und zieht Richtung rechts unten...

Dann kommt die Bande und sie prallt ab....

Der neue Winkel ist dann 45°. d.h. kommt von rechts oben und zieht Richtung links unten. Schau Dir dazu das Bild von mir an. 45° zeigt nach links unten!

[EDIT]

Sieh nochmal in den vorherigen Beitrag von mir...ich habe da ganz oben noch eine Ergänzung eingefügt...

[EDIT II]

Was Dir dabei die Probleme bereitet, ist wahrscheinlich die Tatsache, das es sich bei den Winkeln um "Vektoren" handelt und nicht um Strahlen um ein Zentrum herum:

Schau Dir den 45° Winkel in der Zeichnung mal an. Der läuft auf den Nullpunkt zu...Und wenn die Kugel nun über diesen Nullpunkt hinauslaufen könnte, so würde sie sich immer noch mit 45° bewegen, obwohl sie sich nun vom Zentrum entfernt. Du siehtst das sehr schön im Bild am Beispiel des 110° Winkels der von oben kommt als "110°-Winkel" und aber auch unten immer noch der "110°-Winkel" ist. Es geht eben um "Richtungsangaben". So ähnlich wie Himmelsrichtung:

Richtung West = 0°
Richtung Süden = 90°
Richtung Osten = 180°

SüdWest=45°
SüdOst=135°
 

pinochino

BeitragFr, Jun 17, 2011 20:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
   If kugely<=0 Then 
   winkel=360-winkel
   EndIf
   
   If kugely>=600 Then
   winkel=360-winkel
   EndIf


für kollision mit y wir 360 verwendet anstatt 180



kommt das davon das jetzt 180° bis 360° verwendet wird

Code: [AUSKLAPPEN]
                               
                               90°
                                |
                                |
 180 ---------------------------|-------------------------------360


          225°                                        315°           
                   
                               270°


Hoffentlich strapaziere ich eure Geduld nicht zu arg. Smile

mfg
pinO

Midimaster

BeitragFr, Jun 17, 2011 20:04
Antworten mit Zitat
Benutzer-Profile anzeigen
lies mal den Nachtrag, den ich eben noch an den letzten Beitrg ergänzt habe...


Das es bei Y anders ist, hat vorallem wieder mit den Himmelsrichtungen zu tun. Erstelle eine Werte-Tabelle, damit Du es verstehst:

kommt eine Kugel Richtung Süd-Osten auf die Bande zu, so prall sie Richtung Nord-Osten wieder ab. In Zahlen bedeutet das

Süd-Ost= 135°

Nord-Ost=225°

Du brauchst mehrere Werte-Paare um die Formel zu erkenne, die dahinter steht.

Ein wichtiges Werte-Paar ist immer der senkrechte Aufprall:

kommt eine Kugel Richtung Süden auf die Bande zu, so prall sie Richtung Norden wieder ab. In Zahlen bedeutet das diesmal

Süd= 90°

Nord =270°


Nun suche nach der Forrmel, die beides korrekt berechet:

135 ----> 225

90 ------> 270

es gibt nur eine Lösung:

360 -135 = 225

360 - 90 = 270
 

pinochino

BeitragFr, Jun 17, 2011 20:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich kaue jetzt seit 6 Stunden auf diesem Thema herum.

Deine Beispiele und Erklärungen sind wirklich Klasse.
Ich würde behaupten das Thema zu 50% verstanden zu haben und hoffe das fehlende Verständnis durch
Übung und das schreiben von Testprogrammen hinzu zu gewinnen.

Mein Notizblock ist vollgekrizelt mit Winkeln, Kreisen, Codeschnipseln etc. und ich glaube jetzt mache ich eine Pause
und suche mir etwas Ablenkung. Laughing

Morgen gehts dann weiter. Very Happy

Danke für deine Hilfe & Geduld.

PS: Himmelsrichtungen find ich Großartig... damit fällts mir gleich viel leichter! Mr. Green

mfg
pinO

EDIT:
Neuer Tag, Neues Glück. bzw. Neues Denkvermögen. Very Happy

RICHTUNGSANGABEN war das Stichwort! Danke Midimaster

Auf einmal ergibt alles einen Sinn, haha.

Nochmal:
Zitat:
Danke für deine Hilfe & Geduld.

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group