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

Typ

Frischling

  • »Typ« ist der Autor dieses Themas
  • Private Nachricht senden

1

07.03.2016, 15:42

Pong - Kugel tut nur was sie will

Hallo, ich programmiere ein Pong Spiel. Ist auch mein erstes, also bitte nicht über irgendwelche Anfängerfehler meckern.
Jedenfalls habe ich jetzt die Kugel programmiert. In welche Richtung sie rollen soll, habe ich in Grad gemacht, also 0° ist nach rechts. Ihre aktuelle Position wird mit Hilfe eines Einheitskreises berechnet.
Wenn sie jetzt vom Schläger abprallt wird überprüft, in welchem Quadranten die Richtung zur Zeit liegt, also 1.Quadrant von 0 - 90°, 2. von 90.1 - 180°, usw. Für jeden Quadranten habe ich eine Formel gemacht, in welche neue Richtung sie weiterfliegen soll, das funktioniert auch prima. Genauso habe ich es gemacht, wenn sie von den Wänden abprallt, nur dass es da aus irgendeinem Grund nicht funktioniert. ( Die ersten 2 mal funktioniert es meistens, und dann fliegt sie, wenn sie abprallt wieder in die gleiche Richtung, wo sie herkommt, oder so)
Ich hoffe, dass mir jemand sagen kann was ich falsch gemacht habe.

Hier der Code:

C-/C++-Quelltext

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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
// file: Player.cpp
// project: Pong
// created by: Typ
// 
//
#include "Texture.h"
#include "Game.hpp"
#include "Ball.hpp"

#include <iostream>
#include <SDL2\SDL.h>
#include <string>
#include <math.h>

#define pi 3.14

// Init
void CBall::Init(SDL_Renderer* renderer, std::string file)
{
    // save filename
    this->file = file;

    // startposition 
    xPos = 1024 / 2;    
    yPos = 512 / 2;

    // initialize ball
    ball = new Texture(renderer, file);
    ball->Draw(xPos, yPos);

    // startdirection to the right
    direction = 20.0f;

    // set the speed
    speed = 0.15f;
}

// Update
void CBall::Update(SDL_Renderer* renderer, int player1X, int player1Y, int player2X, int player2Y)
{
    // check, if ball hits a paddle
    if (checkPaddleCollision(player1X, player1Y, player2X, player2Y))
    {
        if (direction < 90.0f && direction > 0.0f)              // direction in the 1. quadrant
            direction = direction + (180.0f - 2.0f * direction);
        else if (direction < 180.0f && direction > 90.0f)       // direction in the 2. quadrant
            direction = direction - (2.0f * (direction - 90.0f));
        else if (direction < 270.0f && direction > 180.0f)      // direction in the 3. quadrant
            direction = direction + (180.0f - 2.0f * direction);
        else                                                    // direction in the 4. quadrant
            direction = direction - (2.0f * (direction - 90.0f));
    }

    // check, if ball hits the wall
    if (checkWallCollision())
    {
        if (direction < 90.0f && direction > 0.0f)              // direction in the 1. quadrant
            direction = 360.0f - (2.0f * direction);
        else if (direction < 180.0f && direction > 90.0f)       // direction in the 2. quadrant
            direction = 180.0f + 2.0f * (180.0f - direction);
        else if (direction < 270.0f && direction > 180.0f)      // direction in the 3. quadrant
            direction = 180.0f - 2.0f * (direction - 180.0f);
        else                                                    // direction in the 4. quadrant
            direction = 360.0f + 2.0f * (360.0f - direction);
    }

    // calculate new position
    xPos += (getXPos() * speed);
    yPos += (getYPos() * speed);

    // draw new position
    ball->Draw(xPos, yPos);
}

float CBall::getXPos()
{
    float radians = direction / 180 * pi;           // calculate radians
    return cos(radians);
}

float CBall::getYPos()
{
    float radians = direction / 180 * pi;           // calculate radians
    return -sin(radians);
}

bool CBall::checkPaddleCollision(int player1X, int player1Y, int player2X, int player2Y)
{
    // collision with paddle
    if (yPos > player1Y && yPos < player1Y + 30 && xPos < player1X)                 // left paddle
        return true;
    else if (yPos > player2Y && yPos < player2Y + 30 && xPos > player2X)            // right paddle
        return true;

    
    return false;
}

bool CBall::checkWallCollision()
{
    // collision with wall
    if (yPos + 10 > 512 || yPos < 0)
        return true;

    return false;
}


Für Verbesserungen am Code würde ich micht natürlich auch freuen

Mfg
Typ

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Typ« (07.03.2016, 15:47)


BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

2

07.03.2016, 15:56

Starte dein Spiel über F5. Spiele solange es korrekt funktioniert. Sobald es schief geht, klick in Zeile 42 und drück F9. Drück solange F10 und schau Dir die Variablen an, bis Du weißt, was wo verkehrt geht, dann schau Dir an warum.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

3

07.03.2016, 15:57

Ich würde dir raten, statt mit Winkeln mit Vektoren zu arbeiten. Dann ist sowohl das Fortbewegen einfachen (speed*vektor), als auch das Abprallen (vektor.x *= -1, für das abprallen an einer Wand).

buggypixels

Treue Seele

Beiträge: 125

Wohnort: Meerbusch

Beruf: Programmierer

  • Private Nachricht senden

4

07.03.2016, 16:53

Was Dir bestimmt fehlt ist, dass du nach einer Kollision den Ball auch zunächst einmal wieder aus dem Bereich weg bewegst. Denn sonst (wie in deinem Fall) treten 2 Kollision direkt nacheinander auf und das scheint dann so, als ob gar keine stattgefunden hat. Also sprich, dein Ball trifft auf die obere Wand, dann stelle sicher, dass du den Ball soweit runter bewegst das er nicht mit dem Wand kollidiert.

cojo2015

Alter Hase

Beiträge: 516

Wohnort: bei mir zu Hause

Beruf: Schüler

  • Private Nachricht senden

5

07.03.2016, 17:11

Ich würde dir raten, statt mit Winkeln mit Vektoren zu arbeiten. Dann ist sowohl das Fortbewegen einfachen (speed*vektor), als auch das Abprallen (vektor.x *= -1, für das abprallen an einer Wand).

Ich würde es genau so machen. Außerdem kannst du dann auch leichter die Beschleunigung bzw. das Verzögern sanfter machen. Das sieht dann besser aus ;)
Zum Problem: Kennst du dich mit dem Debugger aus? Benutzte ihn, die Tasten hat dir BlueCobold ja schon vorgegeben :D

Typ

Frischling

  • »Typ« ist der Autor dieses Themas
  • Private Nachricht senden

6

07.03.2016, 20:02

Danke schonmal für die Antworten.
Das mit dem Debugger funktioniert nicht, da steht dann immer nur, dass irgendeine .dpb Datei nicht geladen werden konnte.

Die Idee von Buggypixels hab ich probiert, das ändert leider nichts.

Ich hab jetzt mal nach jeder Kollision die neue Richtung des Balls anzeigen lassen. Am Anfang stimmt noch alles so mehr oder weniger, und dann kommen nach dem 3. mal ewig lange Kommazahlen. Nach einer gewissen Zeit auch 2, dann 3, usw. auf einmal:

Zitat

220
100

340

1400
-1720

4520
-7960

17000
-32920
66920

-132760
266600
-532120

1.06532e+06
-2.12956e+06
4.2602e+06
-8.51932e+06

1.70397e+07
-3.40784e+07
6.81578e+07
-1.36315e+08


Immer die, die zusammen stehen sind auf einmal gekommen.


Das mit den Vektoren werde ich mal probieren, da muss ich aber erst schauen wie das geht.

P.s.: wenn ich den Fehler nicht finde ändere ich einfach den Namen auf "crazy Pong" und behaupte, dass sich das so gehört :P

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

7

07.03.2016, 20:46

Das mit dem Debugger funktioniert nicht, da steht dann immer nur, dass irgendeine .dpb Datei nicht geladen werden konnte.
Du benutzt was für eine IDE?
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

8

07.03.2016, 20:53

Mir ist noch was aufgefallen, mach dir mal nen Kopf was passiert wenn dein Winkel exakt 0, 90, 180 oder 270 Grad ist.
Wer aufhört besser werden zu wollen hört auf gut zu sein!

aktuelles Projekt:Rickety Racquet

Typ

Frischling

  • »Typ« ist der Autor dieses Themas
  • Private Nachricht senden

9

08.03.2016, 17:03

Ich verwende visual Studio 2015, und wenn die Winkel genau 90° usw. sind bleibt die kugel eine Sekunde lang stehen, taucht dann auf der gegenüberliegenden Seite wieder auf und rollt mit einem Winkel von ca. 175° weg.

CeDoMain

Alter Hase

Beiträge: 587

Wohnort: Ilmenau

Beruf: Student für Mechatronik

  • Private Nachricht senden

10

09.03.2016, 14:22

Das mit dem Debugger funktioniert nicht, da steht dann immer nur, dass irgendeine .dpb Datei nicht geladen werden konnte.
Kannst du bitte mal einen Screenshot von der Fehlermeldung machen oder die gesamte Meldung wortwörtlich hier reinschreiben? Denn ein nicht funktionierender Debugger ist ein No-Go! ;)
Mit freundlichem Gruß
CeDo
Discord: #6996 | Skype: cedomain

Lass solche persönlichen Angriffe lieber bleiben, meine sind härter.

Werbeanzeige