| 12
 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
 107
 108
 109
 110
 111
 112
 113
 114
 115
 116
 117
 118
 119
 120
 121
 122
 123
 124
 125
 126
 127
 128
 129
 130
 131
 132
 133
 134
 135
 136
 137
 138
 139
 140
 141
 142
 143
 144
 145
 146
 147
 148
 149
 150
 151
 152
 153
 154
 155
 156
 157
 158
 159
 160
 161
 162
 
 |  
#include "Asteroid.h"
 
using namespace std;
 
 
Asteroid::Asteroid(Ressource *ListeRessource,
                   int niveau,
                   string typeAsteroid,
                   int positionX,
                   int positionY,
                   float directionX,
                   float directionY,
                   float vitesseDeplacement
                   )
{
    /* Toujours Fixe */
    m_indice = 0;
 
 
    /* Determiné lors de la construction */
    m_niveau = niveau;
 
    m_typeAsteroid = typeAsteroid;
 
    m_positionX = positionX;
    m_positionY = positionY;
 
    m_directionX = directionX;
    m_directionY = directionY;
 
    m_vitesseDeplacement = vitesseDeplacement;
 
 
 
    /* Determiné aleatoirement */
 
 
 
    /* La robustesse est determiné aleatoirement entre 20 et 86
       selon le niveau.
       Cependant, en fonction du type de l'Asteroid, la robustesse
       de l'Asteroid sera réevaluer. */
    switch (m_niveau)
    {
        case 1:
            /* L'asteroid le plus petit - Sa robustesse est comprise entre 20 et 33 */
            m_pointDeVie = static_cast<int> (20 + (static_cast<float>( rand()) / RAND_MAX * 14));
            break;
 
        case 2:
            /* L'Asteroid moyen - Sa robustesse est comprise entre 40 et 57 */
            m_pointDeVie = static_cast<int> (40 + (static_cast<float>( rand()) / RAND_MAX * 18));
            break;
 
        case 3:
            /* Le plus gros des asteroid - Sa robustesse est comprise entre 60 et 86 */
            m_pointDeVie = static_cast<int> (60 + (static_cast<float>( rand()) / RAND_MAX * 27));
            break;
 
        default:
            /* On met le niveau à 1 afin de ne pas faire planter le programme mais on le signal */
            m_niveau = 1;
            m_pointDeVie = 1;
            cerr << "Probleme lors de la creation d'un asteroid : niveau de l'Asteroid incorrect." << endl;
            break;
    }
 
    if (m_typeAsteroid == "Asteroid Molybdene")
        /* Resistance acrue de 10 à 15 point de vie */
        m_pointDeVie += static_cast<int> (10 + (static_cast<float>( rand()) / RAND_MAX * 6));
    else
        if (m_typeAsteroid == "Asteroid Strontium")
            /* Resistance acrue de 20 à 25 point de vie */
            m_pointDeVie += static_cast<int> (25 + (static_cast<float>( rand()) / RAND_MAX * 6));
        else
            if (m_typeAsteroid == "Asteroid Rubidium")
                /* Resistance acrue de 60 à 85 point de vie */
                m_pointDeVie += static_cast<int> (60 + (static_cast<float>( rand()) / RAND_MAX * 26));
 
 
 
    /* La vitesse absolue est comprise entre 25 et 65 Image/Seconde */
    m_vitesseRotation = static_cast<int>(25 + (static_cast<float>( rand()) / RAND_MAX * 41))/static_cast<float>(FPS);
    if (static_cast<int>(static_cast<float>( rand()) / RAND_MAX * 2))
        m_vitesseRotation = -m_vitesseRotation;
 
    /* On "pioche" au hasard une animation
       Cette pioche indique la valeur de nombreDeSprite et donc d'image */
   int ligne = 0, colonne = 0;
 
    switch (static_cast<int> (1 + static_cast<float>( rand()) / RAND_MAX *  20))
    {
        /* Animation contenant juste un sprite (10% de probabilité) */
        case 1:
        case 2:
            ligne = static_cast<int> (static_cast<float>( rand()) / RAND_MAX * 45);
            colonne = static_cast<int> (static_cast<float>( rand()) / RAND_MAX * 29);
 
            m_nombreDeSprite = 1;
            m_image.resize(m_nombreDeSprite, NULL);
 
            m_image[0] = ListeRessource->GetSprite(m_typeAsteroid, ligne + ((m_niveau-1)*45), colonne);
 
            m_vitesseRotation = 0;
            break;
 
        /* Animation plutot moche (5% de probabilité) */
        case 3:
            colonne = static_cast<int> (static_cast<float>( rand()) / RAND_MAX * 29);
 
            m_nombreDeSprite = 45;
            m_image.resize(m_nombreDeSprite, NULL);
 
            for (int i=0 ; i<m_nombreDeSprite ; i++)
                m_image[i] = ListeRessource->GetSprite(m_typeAsteroid, i+((m_niveau-1)*45), colonne);
 
            break;
 
        /* Animation plutot bien (40% de chance) */
        case 4: case 5: case 6: case 7: case 8: case 9: case 10: case 11:
 
            ligne = static_cast<int> (static_cast<float>( rand()) / RAND_MAX * 45);
 
            m_nombreDeSprite = 29;
            m_image.resize(m_nombreDeSprite, NULL);
 
            for (int i=0 ; i<m_nombreDeSprite ; i++)
                m_image[i] = ListeRessource->GetSprite(m_typeAsteroid, ligne + ((m_niveau-1)*45), i);
 
            break;
 
        default:
            int pas = static_cast<int> (1 + static_cast<float>( rand()) / RAND_MAX * 28);
 
            m_nombreDeSprite = 1305 * pas;
 
            m_image.resize(m_nombreDeSprite, NULL);
 
            int positioncourante = 0;
 
            for (int i=0 ; i<1305 ; i++)
                for (int j=0 ; j<pas ; j++)
                {
                    m_image[positioncourante] = ListeRessource->GetSprite(m_typeAsteroid, (i%45) + ((m_niveau-1)*45), positioncourante%29);
                    positioncourante++;
                }
            break;
    }
 
}
 
 
Asteroid::~Asteroid()
{
    /* En realité, le destructeur ne sert a rien car
       ON NE LIBERE PAS LES SURFACE
       La classe Ressource s'en occupe */
 
    cout << "Un asteroid vient d'etre detruit" << endl;
 
} | 
Partager