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

TigerClaw25

unregistriert

1

04.05.2013, 13:41

kollision von Gegnern

hallo,

habe mehrere Gegnertypen, die vom Basisgegner erben.derzeit ueberpruefe ich jedes schifftyp auf kollisionen. gibt es eine allgemiene foprm?

KeksX

Community-Fossil

Beiträge: 2 107

Beruf: Game Designer

  • Private Nachricht senden

2

04.05.2013, 13:42

Was soll denn alles womit kollidieren? Eine nähere Beschreibung des Problems ist hilfreich!
WIP Website: kevinheese.de

TigerClaw25

unregistriert

3

04.05.2013, 15:58

Derzeit pruefe ich die kollision zwischen Asteroid und schuss, zwischen gegnerschus und Player und zwischen playerschuss und Gegner. Wenn ich jetzt 20 andere Gegner einer anderen Klasse habe, muss ich ja jedesmal das entsprechn rect holen und jedes mal auf kollision pruefen. Haette dann 20 for schleifen mit if abFragen, wenn ich wie bisher vorgehe.

KeksX

Community-Fossil

Beiträge: 2 107

Beruf: Game Designer

  • Private Nachricht senden

4

04.05.2013, 16:04

Also, eigentlich musst du ja nur 2 Sachen überprüfen:
1. Wurde der Spieler getroffen?
und
2. Wurde ein Gegner getroffen?

Das heißt du musst eigentlich nur für das jeweilige Spielobject überprüfen, ob sich ein Gegner- bzw Spielerschuss in ihm befindet. Du musst keine 20 Schleifen schreiben, sondern lediglich für beide Objekte eine angemessene Kollisionsabfrage, die dir sagt, ob eine Kollision stattfindet. Diese musst du dann natürlich für jedes kollidierbare Objekt aufrufen, das ist aber nicht sonderlich schlimm.
WIP Website: kevinheese.de

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

5

04.05.2013, 16:43

Wenn du eine Basisklasse für Gegner schreibst kannst du mit dieser natürlich schon die Kollisionsabfrage lösen. So ist die Kollisionsabfrage dann für jeden Gegner gegeben, welchen du von dieser Klasse ableitest. Abfragen musst du natürlich für alle Gegner. Durch Polymorphie kannst du aber einfach eine Liste (oder Array oder Vector oder was auch immer) von der Basisklasse deiner Gegner erstellen. Da kommen dann alle Gegner rein und so kannst du dann einfach damit arbeiten. Natürlich nur solange dieser Basistyp ausreichend ist.
„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.“

TigerClaw25

unregistriert

6

04.05.2013, 18:20

Genau das meinte ich gerade. Derzeit habe ich mehrere Schleifen da ich auch Kollisionene zwischen Asteroiden und spieler sowei Asteroiden und Schuss pruefe.

Deswegen waere es auch am sinnvollsten eine Basisklasse zu erstellen. Die abgeleiteten Gegner erhalten dann lediglich andere bewegungsmuster und andere Attribute. mit meinem jetzigen wissen wuesste ich jedoch nicht, wie ich das machen soll. wenn ich den gegner bzw die basisklasse auf kollisionen ueberpruefe, erstelle ich in der main doch trotzdem andere Gegner, die von dieser klasse erben. aber wenn ich nur die basisklasse auf kolliosionen hin ueberpruefe, woher weiss dann mein programm, dass das auch fuer gegner, die dieeigenschaften erben, auch gilt?

d

patrick246

Treue Seele

Beiträge: 328

Wohnort: nahe Heilbronn/BW

Beruf: TG Profil Informatik-Schüler

  • Private Nachricht senden

7

04.05.2013, 18:55

Weil sie das Verhalten von der Basisklasse erben.

TigerClaw25

unregistriert

8

04.05.2013, 19:13

Das ist mir klar, aber die Kollision findet in der GameRun Funktion statt und dort pruefe ich das anhand des Rects der Basisklasse. Das Erben bezieht sich ja auf Methoden und Membervariabln er Klase, aBer nicht auf das, was ich damit in meiner Game Klasse tue.

patrick246

Treue Seele

Beiträge: 328

Wohnort: nahe Heilbronn/BW

Beruf: TG Profil Informatik-Schüler

  • Private Nachricht senden

9

04.05.2013, 19:23

Die abgeleiteten Klassen erben auch das Rect und lassen sich somit durch den Kollisionscode genauso prüfen.

TigerClaw25

unregistriert

10

04.05.2013, 19:56

Also mag sein, dass ich wirklich zu dumm dafür bin. Aber erben nicht die Klassen die Funktionen und Variablen der Basisklasse?

Wenn ich jetzt meine Basisklasse bzw. das Rect der Basisklasse in meiner Game-FUnktion hole, dann hole ich diese von der Basisklasse. Wenn ich diese von der UNterklasse, die von der Basisklasse erbt, holen würde, dann hättest du Recht. Aber die Unterklassen erbene von der Basisklasse. Wenn ich die Basisklasse nun verwendet oder mir davon das Rect hole wie m_pEnemy->Rect z.B., was hat das dann mit RectEnemyUfo zutun? Die Kollisionsabfrage ist doch nicht in der Basisklasse implementiert .. ???


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
// CheckCollisions
//
// Aufgabe: Kollisionen zwischen Asteroiden und Schüssen prüfen
//
void CGame::CheckCollisions ()
{
    // Schussliste des Spielers holen
    list<CShot> *ShotList = m_pPlayer->GetShotList ();

    // Iteratoren für Asteroiden- und Schussliste sowie Explosionsliste
    list<CAsteroid>::iterator ItAsteroid = m_AsteroidList.begin ();
    list<CShot>::iterator ItShot;
    list<CExplosion>::iterator ItExplosion = m_ExplosionList.begin ();

    // Kollision zwischen Gegnerraumschiff, Schüsse und Spieler
    // Iteratoren für Gegner und Schuss
    list<CEnemy>::iterator ItEnemy = m_EnemyList.begin ();
    list<CShot>::iterator ItShotEnemy;

    // Rects für Asteroiden und Schüsse sowie Spieler
    SDL_Rect RectAsteroid;
    SDL_Rect RectShot;
    SDL_Rect RectPlayer;
    // Rects für Gegner und Schüsse
    SDL_Rect RectEnemy;
    SDL_Rect RectShotEnemy;

    // Alle Asteroiden durchlaufen
    while (ItAsteroid != m_AsteroidList.end () )
    {
        // Rect des Asteroiden holen
        RectAsteroid = ItAsteroid->GetRect ();

        // Rect des Spielers holen (Erweitert)
        RectPlayer = m_pPlayer->GetRect();

        // Alle Schüsse durchlaufen
        for (ItShot = ShotList->begin ();
            ItShot != ShotList->end ();
            ++ItShot)
        {
            // Rect des Schusses holen
            RectShot = ItShot->GetRect ();

            // Überschneiden sich die Rects?
            if (RectShot.y < RectAsteroid.y + RectAsteroid.h &&
                RectShot.y + RectShot.h > RectAsteroid.y &&
                RectShot.x < RectAsteroid.x + RectAsteroid.w &&
                RectShot.x + RectShot.w > RectAsteroid.x)
            {       
                // Ja, also gab es eine Kollision. Somit Schuss und
                // Asteroid deaktivieren
                ItAsteroid->SetAlive (false);
                ItShot->SetAlive (false);
                m_HitAsteroid++;
                m_pSoundAsteroid->PlaySound();  // Asteriod explodiert -> Soundeffekt   

                // Explosion erstellen
                SpawnExplosion ((RectAsteroid.x), (RectAsteroid.y));            
            }
        }
        
        //
        // Kollision zwischen Asteroid und Spieler prüfen
        //
            if (RectPlayer.y < RectAsteroid.y + RectAsteroid.h &&
                RectPlayer.y + RectPlayer.h > RectAsteroid.y &&
                RectPlayer.x < RectAsteroid.x + RectAsteroid.w &&
                RectPlayer.x + RectPlayer.w > RectAsteroid.x)
            {
                // Ja, also gab es eine Kollision. Somit Spieler und
                // Asteroid deaktivieren
                ItAsteroid->SetAlive (false);
                m_pPlayer->SetHealth();
                m_pSoundAsteroid->PlaySound();      
            }

        // Asteroid löschen, falls deaktiviert
        if (ItAsteroid->IsAlive () )
            ItAsteroid++;
        else
            ItAsteroid = m_AsteroidList.erase (ItAsteroid);

    }

Werbeanzeige