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

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

11

01.09.2011, 11:17

Naja TGGC hat ja genau die Kollision beschrieben. Ich glaube dein Problem ist es viel mehr, dass du nicht viel mit dieser Struktur da anfangen kannst. Warum du die Struktur dafür im Spieler anlegst, ist mir auch nicht ganz klar. Mach doch ruhig deine Klassen für Spieler wenn es für dich so logischer ist. Für die Kollision kannst du dir dann einfach eine Funktion anlegen. Zum Beispiel könnte der Ball eine Funktion bool KollidiertMitSpieler(CSpieler spieler) bekommen. Dort prüfst du die Kollision und kann theoretisch direkt darauf reagieren. Es gibt hierfür aber viele Möglichkeiten. Mach es so wie es für dich am logischsten ist. Du sollst deinen Code ja verstehen und für sowas gibts selten Patentlösungen.
„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.“

12

01.09.2011, 11:38

Ich glaube sein problem besteht darin, das ganze in formeln umzusetzen.
Gewinnen ist, wenn man einmal mehr aufsteht, als man zu Boden geht.

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

13

01.09.2011, 15:29

Naja kannst es ja für den Anfang simpel halten. Mal am Beispiel vom linken Pedal. Das Pedal ist einfach nur eine Linie an der Position px und py. Dies ist der oberste Punkt des Pedals. Die länge ist pl. Der Ball hat den Mittelpunkt bei den Koordinaten bx und by, sowie den Radius br. Jetzt haste quasi schon mal ein paar wichtige Werte die du kennen solltest. Jetzt überprüfst du ob bx links neben px liegt. Das heisst, dass der Mittelpunkt des Balls hinter dem Pedal liegt. Das ist also noch nicht ganz so schön, da der Ball ja nicht nur ein Punkt, sondern ein Körper mit Radius ist. Also rechnen wir den Radius mit ein. Anstatt zu prüfen ob der Mittelpunkt links neben px liegt, guckst du ob bx-br links neben px liegt. bx-br Ist die x-Koordinate ganz links vom Ball. Wenn dieser Punkt also links vom Pedal ist, ist eine Kollision möglich. Jetzt müssen aber erst noch die y-Koordinaten geprüft werden. Für den Anfang kannst du es dir einfacher machen, und so tun, als wenn der Ball eine Kiste wäre. Dann kannst du einfach gucken, ob der unterste Punkt des Balls unterhalb des höchsten Punktes des Pedals liegt. Wenn jetzt zusätzlich noch der höchste Punkt des Balls oberhalb des tiefsten Punkt des Pedals liegt, hast du eine Kollision. Beides prüfst du analog zu der oberen Berechnung. Das ganze jetzt in Code zu übersetzen schaffst du denke ich. Denk einfach noch mal genau darüber nach, was das alles bedeutet und mal es dir zur Not auf ein Blatt Papier. Dann solltest du es locker schaffen. Viel Erfolg dabei.
„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.“

14

01.09.2011, 15:39

Falls du weiterhin Probleme hast können wir auch mal chatten um das ganze besser zu klären.
Gewinnen ist, wenn man einmal mehr aufsteht, als man zu Boden geht.

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

15

01.09.2011, 16:00

Mit Pedal meinte ich natürlich Paddle;)
„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.“

TGGC

1x Rätselkönig

Beiträge: 1 799

Beruf: Software Entwickler

  • Private Nachricht senden

16

01.09.2011, 16:17

Man kann den Radius auch einfach ignorieren und stattdessen die Grafik des Pedals in der Hoehe um den Durchmesser verringern und um den Radius zur Seite ruecken. Der Ball fliegt so schnell, das man da kaum was merkt.

Fireball

Alter Hase

Beiträge: 415

Wohnort: Werne

Beruf: Dipl. Inf.

  • Private Nachricht senden

17

01.09.2011, 16:39

Hi Raidenkk,

also ich an deiner Stelle würde das etwas anders machen. Jetzt wo ich deinen Code sehe, kapiere ich auch erstmal was du genau vor hast. ;-)

Um zu prüfen ob der Spieler X oder Y nen Punkt gemacht hat würde ich ganz einfach die X Achse des Ball betrachten. Wenn X < 0 dann Punkt für Spieler 1. Wenn X>255 dann Punkt für Spieler 2. Danach beginnt eine neue Runde.

Deinen Ball würde ich über einen 2 Dimensionalen Vektor (x,y) abbilden und zusätzlich einen weiteren Vektor verpassen.

Jedes mal vor dem rendern würde ich das Spielfeld auswerten, also auf Kollision prüfen und den Richtungsvektor des Balls ggf. neu berechnen. Du willst ja auch mal über die Bande oder so spielen.

Die Kollision würde ich über eine einfache Bounding Box realisieren (Tipp mach den Ball nicht rund, sondern quadratisch. Soll ja retro werden ;-) )

http://www.sfml-dev.org/wiki/en/sources/…ision_detection

NACHTRAG:

Oder wie TGGC sagt:

C-/C++-Quelltext

1
2
3
4
boolean isPointInRect(float x, float y, float rectX, float rectY,  
        float rectWidth, float rectHeight) {  
    return x > rectX && x < rectX + rectWidth && y > rectY && y < rectY + rectHeight;  
}  


Man muss nur aufpassen, dass der Ball nicht so schnell fliegt, dass er bei Prüfung schon hinter dem Paddle liegt, denn dann funktioniert die Prüfung nicht.

Gruß

Fb

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »Fireball« (01.09.2011, 17:17)


Raidenkk

Treue Seele

  • »Raidenkk« ist der Autor dieses Themas

Beiträge: 151

Wohnort: Bergkamen/Oberaden

Beruf: Multimedia Informatik

  • Private Nachricht senden

18

01.09.2011, 18:31

Also wie ich eine Kollision überprüfe weis ich jetzt nur das dingen ist ich habe keine Ahnung wie ich 2 verschiedene Klassen vergleiche.

Ich habe ne Funktion gemacht worin ach ich zeig es euch:

C-/C++-Quelltext

1
2
3
4
5
6
7
void Kollision (CBall *Ball, CSpieler *Spieler)
{
    if (Ball->m_X < Spieler->m_X)
    {

    }
}


So er sagt mir das er auf m_X und m_X nicht zugreifen kann da sie ja beide Privat in den klassen sind.
Was soll ich jetzt machen ^^?
Im buch steht ich soll sie immer Privat halten aber wie Prüft man etwas was man nicht von außen benutzen kann^^?

ridens

Frischling

Beiträge: 47

Beruf: Freiberuflicher Entwickler

  • Private Nachricht senden

19

01.09.2011, 18:38

Es ist eben die Frage, ob die Variable tatsächlich außerhalb der Klasse gebraucht wird, oder ob es sich irgendwie anders umsetzen lässt, sodass die Klasse bei sich behält, was ihr gehört. Wenn es sich nicht anders machen lässt, schreibt man eine Get-Funktion, d.h. eine public-Funktion die einfach nur den Wert der Membervariablen zurückgibt, damit man außerhalb der Klasse damit rechnen kann. Also z.B. float GetX () { return m_X; }

Raidenkk

Treue Seele

  • »Raidenkk« ist der Autor dieses Themas

Beiträge: 151

Wohnort: Bergkamen/Oberaden

Beruf: Multimedia Informatik

  • Private Nachricht senden

20

01.09.2011, 18:45

ok werde das mal ausprobieren.

EDIT:
Klasse ridens du hast mich verstanden ;).
Ich sollte nächstes mal meine Frage besser stellen mein Fehler sry^^

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
// GetX
// Aufgabe: Übergibt die Private m_X an GetX Public
float CBall::GetX ()
{
    return m_X;
}

// GetY
// Aufgabe: Übergibt die Private m_Y an GetY Public
float CBall::GetY ()
{
    return m_Y;
}

// GiveSpeedX
// Aufgabe: Übergibt Public GiveSpeedX an Private m_SpeedX;
void CBall::GiveSpeedX (float GiveSpeedX)
{
    m_SpeedX += GiveSpeedX;
}

// GiveSpeedY
// Aufgabe: Übergibt Public GiveSpeedY an Private m_SpeedX;
void CBall::GiveSpeedY (float GiveSpeedY)
{
    m_SpeedY += GiveSpeedY;
}

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Raidenkk« (01.09.2011, 19:02)


Werbeanzeige