Changeset 322


Ignore:
Timestamp:
Jan 31, 2011, 6:20:10 PM (10 years ago)
Author:
sam
Message:

Implement title screen animations.

Location:
trunk/monsterz
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/monsterz/monsterz.h

    r321 r322  
    1414static char const * const PNG_BACKGROUND = "monsterz/gfx/background.png";
    1515static char const * const PNG_BOARD = "monsterz/gfx/board.png";
     16static char const * const PNG_LOGO = "monsterz/gfx/logo.png";
    1617static char const * const PNG_TILES = "monsterz/gfx/tiles.png";
    1718static char const * const PNG_ICONS = "monsterz/gfx/icons.png";
  • trunk/monsterz/title.cpp

    r321 r322  
    3131
    3232private:
    33     int screen, title;
     33    int screen, title, logo;
    3434    int anim[6];
    3535    int event[7];
     
    5252    period, nextperiod;
    5353
    54     float timer;
     54    float timer, length;
     55    int nframes, animid;
    5556};
    5657
     
    6263  : data(new TitleData())
    6364{
     65    srand(rand() ^ time(NULL));
     66
    6467    data->screen = Tiler::Register(PNG_BACKGROUND, 640, 480, 1.0f);
     68    data->logo = Tiler::Register(PNG_LOGO, 380, 181, 1.0f);
    6569    data->title = Tiler::Register(PNG_TITLE, 384, 384, 1.0f);
    6670    for (int n = 0; n < 6; n++)
     
    7175    data->period = TitleData::DAY;
    7276    data->nextperiod = TitleData::DAY;
    73     data->timer = 0.0f;
     77    data->timer = RandF(2000.0f, 3000.0f);
    7478}
    7579
     
    7882    Entity::TickGame(deltams);
    7983
     84    data->timer -= deltams;
     85
     86    /* Probability of playing an animation given the current period */
     87    static float const p1[] = { 0.6f, 0.3f, 0.0f, 0.2f };
     88    /* Probability of a period change given the current period */
     89    static float const p2[] = { 0.1f, 0.2f, 0.5f, 0.5f };
     90    /* Number of frames in transition anims and events */
     91    static int const t1[] = { 31, 26, 7, 7, 32, 6, 31 };
     92    static int const t2[] = { 2, 4, 11, 4, 6, 2 };
     93
    8094    switch (data->state)
    8195    {
    8296    case TitleData::IDLE:
     97        if (data->timer > 0.0f)
     98            break;
     99        if (RandF() < p1[data->period])
     100        {
     101            switch (data->period)
     102            {
     103            case TitleData::DAY:
     104                data->animid = rand() % 4;
     105                break;
     106            case TitleData::NIGHT:
     107                data->animid = (rand() % 2) ? 4 : 6;
     108                break;
     109            case TitleData::STEALTH:
     110                /* XXX: we should not be here! */
     111                break;
     112            case TitleData::RADIO:
     113                data->animid = 5;
     114                break;
     115            }
     116            data->state = TitleData::EVENT;
     117            data->nframes = t1[data->animid];
     118            data->timer = data->length = data->nframes * 100.0f;
     119        }
     120        else if (RandF() < p2[data->period])
     121        {
     122            switch (data->period)
     123            {
     124            case TitleData::DAY:
     125                data->nextperiod = TitleData::NIGHT;
     126                data->animid = 0;
     127                break;
     128            case TitleData::NIGHT:
     129                if (RandF() < 0.6f)
     130                {
     131                    data->nextperiod = TitleData::DAY;
     132                    data->animid = 5;
     133                }
     134                else
     135                {
     136                    data->nextperiod = TitleData::STEALTH;
     137                    data->animid = 1;
     138                }
     139                break;
     140            case TitleData::STEALTH:
     141                if (RandF() < 0.3f)
     142                {
     143                    data->nextperiod = TitleData::RADIO;
     144                    data->animid = 2;
     145                }
     146                else
     147                {
     148                    data->nextperiod = TitleData::NIGHT;
     149                    data->animid = 4;
     150                }
     151                break;
     152            case TitleData::RADIO:
     153                data->nextperiod = TitleData::STEALTH;
     154                data->animid = 3;
     155                break;
     156            }
     157            data->state = TitleData::ANIM;
     158            data->nframes = t2[data->animid];
     159            data->timer = data->length = data->nframes * 100.0f;
     160        }
     161        else
     162        {
     163            data->timer = RandF(500.0f, 1000.0f);
     164        }
     165        break;
    83166    case TitleData::ANIM:
     167        if (data->timer < 0.0f)
     168            data->period = data->nextperiod;
     169            /* Fall through */
    84170    case TitleData::EVENT:
     171        if (data->timer < 0.0f)
     172        {
     173            data->state = TitleData::IDLE;
     174            data->timer = RandF(500.0f, 1000.0f);
     175        }
    85176        break;
    86177    }
     
    100191        break;
    101192    case TitleData::ANIM:
     193        tiler = data->anim[data->animid];
     194        id = data->nframes - 1 - (data->nframes * data->timer / data->length);
     195        if (id < 0) id = 0;
     196        if (id > data->nframes - 1) id = data->nframes - 1;
     197        break;
    102198    case TitleData::EVENT:
     199        tiler = data->event[data->animid];
     200        id = data->nframes - 1 - (data->nframes * data->timer / data->length);
     201        if (id < 0) id = 0;
     202        if (id > data->nframes - 1) id = data->nframes - 1;
    103203        break;
    104204    }
     
    106206    Scene::GetDefault()->AddTile((data->screen << 16) | 0, 0, 0, 0, 0);
    107207    Scene::GetDefault()->AddTile((tiler << 16) | id, 24, 72, 1, 0);
     208    Scene::GetDefault()->AddTile((data->logo << 16) | 0, 26, 250, 2, 0);
    108209}
    109210
     
    111212{
    112213    Tiler::Deregister(data->screen);
     214    Tiler::Deregister(data->logo);
    113215    Tiler::Deregister(data->title);
    114216    for (int n = 0; n < 6; n++)
Note: See TracChangeset for help on using the changeset viewer.