Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Caphoras

Frischling

Beiträge: 23

Wohnort: Kaiserslautern

Beruf: Praktikant

  • Private Nachricht senden

11

13.02.2013, 10:04

Ich hatte mir das auch mal vor genommen zwar in python aber die idee sollte eig. auch funktioniern.
Ich muss dazu sagn das die Paddles bei mir einfach zwei linien waren und Ich bei tastendruck deren zwei punkte beide nach oben versetzt habe.

hier wäre meine kollisionsgeschichte:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# update ball
    ball_pos[0] += ball_vel[0]
    ball_pos[1] += ball_vel[1]
    
    '''reflect the ball from the top and the ground'''
    if ball_pos[1] not in range(BALL_RADIUS,HEIGHT - BALL_RADIUS):
        ball_vel[1] = -ball_vel[1]
       
    
    if ball_pos[0] <= PAD_WIDTH+BALL_RADIUS:
        if ball_pos[1] in range(float(paddle1_pos[1] - HALF_PAD_HEIGHT) , float(paddle1_pos[1] + HALF_PAD_HEIGHT)):
            ball_vel[0] = -ball_vel[0]
            ball_vel[0]=ball_vel[0]*1.1
            increase += 10
            
        else:
            paddle1_pos = [HALF_PAD_WIDTH,HEIGHT/2]
            paddle2_pos = [WIDTH-HALF_PAD_WIDTH,HEIGHT/2]
            score2+= 1
            ball_init(True)
            increase = 0
    if ball_pos[0] >= WIDTH-PAD_WIDTH-BALL_RADIUS:
        if ball_pos[1] in range(float(paddle2_pos[1] - HALF_PAD_HEIGHT) , float(paddle2_pos[1] + HALF_PAD_HEIGHT)):
            ball_vel[0] = -ball_vel[0]
            ball_vel[0]=ball_vel[0]*1.1
            increase += 10
        else:
            score1+= 1
            paddle1_pos = [HALF_PAD_WIDTH,HEIGHT/2]
            paddle2_pos = [WIDTH-HALF_PAD_WIDTH,HEIGHT/2]
            increase = 0
            ball_init(False)

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

12

13.02.2013, 13:29

Der Ansatz den David vorschlägt ist mit Vektoren umgesetzt. Du hast die X- und die Y-Komponente separat. Mal dir mal ein Rechtwinkliges Dreieck. An Gegenkathete und Ankathete schreibst du X und Y. Die Länge der Hypotenuse entspricht der Länge der Bewegung. Dafür kannst du das Dreieck mal an der Hypotenuse spiegeln, sodass du ein Rechteck erhälst. Dann wird das ganze vielleicht klarer. Den Winkel an der Hypotenuse kannst du natürlich berechnen. Das ist der Winkel den du in deiner Berechnung gerne gehabt hättest. Wenn du dir jetzt das Dreieck noch mal ansiehst, siehst du warum du hier einfach mit Sinus und Kosinus arbeiten könntest. Mathematikkenntnisse natürlich vorausgesetzt. Wenn du diesen Ansatz nun aber mit dem von David vergleichst, siehst du dass dieser eigentlich viel einfacher ist. Das einzige was hier etwas tricky ist, ist die Bewegung auf X und Y so auszuführen, dass du wirklich nur um eine bestimmte Länge bewegst. Stichwort hierfür sind Dreisatz und Vektor normalisieren. Vielleicht reicht dir das ja schon.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

13

13.02.2013, 17:57

Mein letztes Beispiel ist ein Vektor der sich aus Betrag und Winkel berechnet. Und das soll eben nur angewendet werden falls Einfallswinkel ungleich Ausfallswinkel ist. Wenn man es kompliziert mag, kann man natürlich auch x und y Komponenten irgendwie verändern, dann normalisieren und dann mit dem Betrag multiplizieren. Aber wieso das?

Werbeanzeige