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

15.04.2013, 09:29

KI der Gegner

Guten Morgen,

würde das SDL Spiel aus dem Buch gerne um Gegner erweitern, die nach einer bestimmten Zeit auftauchen. Die Zeit bekomme ich ja über die Timerget-Funktion. Aber wie realisiere ich die Gegner KI?

Die Gegner KI muss meine Position kennen. Dass bedeutet doch, dass ich meine Koordinaten angeben muss und der Gegner mit einer gewissen Verzögerung drauf reagieren muss. Sobald der Gegner in einem bestimmten Abstand zu meinem Raumschiff ist, erfolgt der Schuss.

Was gibt es dabei noch zu beachten? Ich werde sicherlich nicht gleich zu beginn die absolute top-Lösung programmieren können, aber es soll zumindest funktionieren ...

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

2

15.04.2013, 09:32

Du hast was dagegen Sachen selbst auszuprobieren, oder?
Manchmal muss man einfach mal probieren und auf die Nase fallen. ;) Also probiere einfach aus.
Und ansonsten wäre ein gutes Buch ratsam. Für KI denke ich speziell an: http://www.amazon.de/Programming-Game-Ex…ame+programming
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

3

15.04.2013, 11:41

Super Buch, wobei das nichts für jemanden ist dessen einzige Erfahrung Heikos Buch ist. Da sollte man schon ein wenig mehr gemacht haben;) Ansonsten ist bei solchen Spielen einfaches Patternverhalten gar nicht schlecht. Guck dir doch mal alte Spiele an(auch einige neue) und achte auf die Gegner. Oft bewegen sie sich nach einem bestimmten Schema. Ein sehr einfaches Bewegungsmuster wäre eine Sinuskurve die abgeflogen wird. Beobachte einfach andere Spiele und überlege was da passiert. Wenn du weißt was die Gegner machen kannst du gucken ob du es selbst umsetzen kannst.
„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

4

15.04.2013, 14:57

Dasgegnerische Raumschiff will sich einfach nicht nach links und rechts bewegen:

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
void CGegner::Update()
{

    // Prüfen, ob geschossen wurde
    ProcessShooting ();

    // Gegner bewegen
    if(m_fRLBewegung == 1)
    {
        m_fXPos += 20.0f * g_pTimer->GetElapsed();
        if(m_fXPos > 730.0f)
        {
            m_fXPos = 730.0f;
            m_fRLBewegung = 0;
        }
    }

    if(m_fRLBewegung == 0)
    {
        m_fXPos -= 20.0f * g_pTimer->GetElapsed();
            if(m_fXPos < 0.0f)
            {
                m_fXPos = 0.0f;
                m_fRLBewegung = 1;
            }
    }
}// Update

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »TigerClaw25« (15.04.2013, 17:23)


FSA

Community-Fossil

  • Private Nachricht senden

5

15.04.2013, 17:17

Meinst du nicht es reicht langsam mal? Denkst du eigentlich darüber nach was du schreibst? Also wenn die Zahl in deinem Namen dein Alter ist (25), sollte man selbst mit einem Sonderschulabschluss wissen, dass X + 10 - 10 = X ist...

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

TigerClaw25

unregistriert

6

15.04.2013, 17:24

Hab mal ein Codebeispiel aus einem anderen Beitrag aufgegriffen, bei dem ähnlich vorgegangen wird (siehe editierte Beitrag). Sorry, wenn mir das nicht so liegt, wie anderen hier.

Soll mich das trotzdem daran hindern es zu versuchen? Über die Updatefunktion sollte man doch etwas bewegen können. Aber bei mir gewegt sich absolut nichts ...

Ok, dann versuche ich zu überlegen: Der Spieler wird hin und her bewegt, indem eine taste gedrückt wird. Das bedeutet, man könnte sich eine bool-variable erzeugen, die true oder false ist. Wird das Schiff mit true initialisiert, dann kann ich in der Update-Funktion meine Bewegung vornehmen, bis das Schiff am Bildschirmrand "prallt" ... ?


EDIT: Es funktioniert! Hatte vergessen meine Reset-Funktion anzugeben ...

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »TigerClaw25« (15.04.2013, 17:42)


FSA

Community-Fossil

  • Private Nachricht senden

7

15.04.2013, 17:46

Siehst du mit nachdenken geht es schneller, als dauernd etwas hier zu posten ;)

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

8

15.04.2013, 18:13

Jap. Weiterhin sollte man auf Helfende eingehen. Wenn man die ignoriert wollen die irgendwann sonst nicht mehr Helfen;) Selbst nachdenken sollte sowieso Pflicht sein und du musst immer daran denken, wir kennen nur die Informationen die du uns in deinem Beitrag gibst. Was dort nicht drin steht wissen wir von deinem Programm auch nicht. Da immer gut drüber nachdenken damit du uns das liefern kannst was wir für die Hilfe brauchen.
„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

9

15.04.2013, 20:01

Ok, dann hätte ich eine spezialfrage :)

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

    // Schussliste des Gegners holen
    list<CShot> *ShotListOpponent = m_pOpponent->GetShotList ();
    list<CShot>::iterator ItShotOpponent;

    // 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 ();

    // Rects für Asteroiden und Schüsse sowie Spieler
    SDL_Rect RectAsteroid;
    SDL_Rect RectShot;
    SDL_Rect RectShotOpponent;
    SDL_Rect RectPlayer;
    SDL_Rect RectOpponent;
        
    // 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_AsteroidDestroy++;            // Wieviele Asteroiden zerstört?
                m_pSoundAsteroid->PlaySound();  // Asteriod explodiert -> Soundeffekt   

                // Explosion erstellen
                SpawnExplosion ((RectAsteroid.x - RectAsteroid.w/2), (RectAsteroid.y - RectAsteroid.h/2));          
            }
        }
        // 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_pPlayer->Reset();
                // Asteriod explodiert -> Soundeffekt
                m_pSoundAsteroid->PlaySound();
            }

        // Asteroid löschen, falls deaktiviert
        if (ItAsteroid->IsAlive () )
            ItAsteroid++;
        else
            ItAsteroid = m_AsteroidList.erase (ItAsteroid);
    }
    
 
    for (ItShotOpponent = ShotListOpponent->begin();
        ItShotOpponent != ShotListOpponent->end(); ++ItShotOpponent)
    {
        // Rect des Gegner-Schusses holen
        RectShotOpponent = ItShotOpponent->GetRect ();
        // Rect des Gegners holen
        

        // Überschneiden sich die Rects?
            if (RectShotOpponent.y < RectPlayer.y + RectPlayer.h &&
                RectShotOpponent.y + RectShotOpponent.h > RectPlayer.y &&
                RectShotOpponent.x < RectPlayer.x + RectPlayer.w &&
                RectShotOpponent.x + RectShotOpponent.w > RectPlayer.x)
            {       
                // Ja, also gab es eine Kollision. Somit Schuss und
                // Asteroid deaktivieren
                ItShotOpponent ->SetAlive (false);
                m_pPlayer->Reset();
                m_pSoundAsteroid->PlaySound();  // Asteriod explodiert -> Soundeffekt       
            }
    }

} // CheckCollision


Wenn ich SDL_RectOpponent weglassen, dann stürzt das Programm ab. Ich weiß, den debugger benutzen. Aber ich nutze diese Instanzt momentan nicht, da ich keine Kollision zwischen Gegnerraumschiff und meinen Schüssen überprüfe und trotzdem stürzt das Programm ab, wenn ich die Instanz nicht deklariere ...

Hat das eine besonderen Grund? Nutze doch diese überhaupt nicht ...

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

10

15.04.2013, 20:10

Offenbar pfuschst du in irgendeiner Funktion den Stack kaputt und das zusätzliche Rect puffert diesen Fehler weg.
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]

Werbeanzeige