Changeset 238


Ignore:
Timestamp:
Jan 19, 2011, 9:33:25 PM (10 years ago)
Author:
sam
Message:

Pieces can now be grabbed around.

Location:
trunk
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/monsterz/board.cpp

    r234 r238  
    3434    int screen, board, tiles;
    3535    Piece *pieces[8][8];
     36    Piece *grabbed;
     37
     38    Int2 mouse;
     39    Int3 buttons;
    3640    float nextblink;
     41
     42    enum
     43    {
     44        IDLE,
     45        BADCLICK,
     46        GRAB,
     47    }
     48    state;
    3749};
    3850
     
    5466        {
    5567            int id = (35 + i + (i ^ (j + 13)) * (2 * j + 711)) % 9;
    56             data->pieces[j][i] = new Piece(game, i, j, 25 + 5 * id);
    57             Ticker::Ref(data->pieces[j][i]);
     68            data->pieces[i][j] = new Piece(game, i, j, 25 + 5 * id);
     69            Ticker::Ref(data->pieces[i][j]);
    5870        }
    5971
    6072    data->nextblink = 0.0f;
     73    data->state = BoardData::IDLE;
    6174}
    6275
    6376void Board::TickGame(float deltams)
    6477{
     78    Entity::TickGame(deltams);
     79
     80    Int2 mouse = Input::GetMousePos();
     81    Int3 buttons = Input::GetMouseButtons();
     82
     83    /* If possible, make a random monster blink */
    6584    if ((data->nextblink -= deltams) < 0.0f)
    6685    {
     
    6887        data->nextblink = (float)(200 + rand() % 500);
    6988    }
    70     Entity::TickGame(deltams);
     89
     90    /* Should we start dragging something? */
     91    switch (data->state)
     92    {
     93    case BoardData::IDLE:
     94        if (buttons[0] && !data->buttons[0])
     95        {
     96            int x = mouse.x - 24;
     97            int y = mouse.y - 72;
     98            if (x >= 0 && x < 8 * 48 && y >= 0 && y < 8 * 48)
     99            {
     100                if (data->pieces[x / 48][y / 48]->Grab(Int2(0, 0)))
     101                {
     102                    data->grabbed = data->pieces[x / 48][y / 48];
     103                    data->state = BoardData::GRAB;
     104                }
     105                else
     106                    data->state = BoardData::BADCLICK;
     107            }
     108            else
     109                data->state = BoardData::BADCLICK;
     110        }
     111        break;
     112    case BoardData::GRAB:
     113        if (mouse.x >= 0 && mouse.y >= 0)
     114            data->grabbed->Grab(mouse - data->mouse);
     115        if (!buttons[0] || mouse.x < 0 || mouse.y < 0)
     116        {
     117            data->grabbed->Ungrab();
     118            data->state = BoardData::IDLE;
     119        }
     120        break;
     121    case BoardData::BADCLICK:
     122        if (!buttons[0])
     123            data->state = BoardData::IDLE;
     124        break;
     125    }
     126
     127    data->mouse = mouse;
     128    data->buttons = buttons;
    71129}
    72130
     
    78136    data->game->GetScene()->AddTile((data->board << 16) | 0, 24, 912, 1, 0);
    79137
    80     Int2 tmp = Input::GetMousePos();
    81     if (tmp.x >= 0 && tmp.y >= 0)
    82         data->game->GetScene()->AddTile((data->tiles << 16) | 4, tmp.x, 536 - tmp.y, 10, 0);
     138    if (data->mouse.x >= 0 && data->mouse.y >= 0)
     139    {
     140        int x = data->mouse.x - 2;
     141        int y = data->mouse.y + 59;
     142        data->game->GetScene()->AddTile((data->tiles << 16) | 9, x, y, 10, 0);
     143    }
    83144}
    84145
     
    88149    for (int j = 0; j < 8; j++)
    89150        for (int i = 0; i < 8; i++)
    90             Ticker::Unref(data->pieces[j][i]);
     151            Ticker::Unref(data->pieces[i][j]);
    91152    Tiler::Deregister(data->board);
    92153    Tiler::Deregister(data->screen);
  • trunk/monsterz/piece.cpp

    r230 r238  
    3131    Game *game;
    3232    int tiler;
    33     int i, j, id;
     33    int i, j, id, x, y;
    3434    float timer;
    3535
     
    3838        IDLE,
    3939        BLINK,
     40        GRAB,
     41        UNGRAB,
    4042    }
    4143    state;
     
    5456    data->i = i;
    5557    data->j = j;
     58    data->x = i * 48;
     59    data->y = j * 48;
    5660    data->id = id;
    5761    data->state = PieceData::IDLE;
    5862}
    5963
    60 void Piece::Blink()
     64int Piece::Blink()
    6165{
    62     if (data->state == PieceData::IDLE)
     66    switch (data->state)
    6367    {
     68    case PieceData::IDLE:
    6469        data->state = PieceData::BLINK;
    6570        data->timer = 400.0f;
     71        return 1;
     72    default:
     73        return 0;
     74    }
     75}
     76
     77int Piece::Grab(Int2 dir)
     78{
     79    switch (data->state)
     80    {
     81    case PieceData::IDLE:
     82    case PieceData::BLINK:
     83    case PieceData::GRAB:
     84        data->state = PieceData::GRAB;
     85        data->x += dir.x;
     86        data->y += dir.y;
     87        return 1;
     88    default:
     89        return 0;
     90    }
     91}
     92
     93int Piece::Ungrab()
     94{
     95    switch (data->state)
     96    {
     97    case PieceData::GRAB:
     98        data->state = PieceData::UNGRAB;
     99        return 1;
     100    default:
     101        return 0;
    66102    }
    67103}
     
    78114            data->state = PieceData::IDLE;
    79115        break;
     116    case PieceData::GRAB:
     117        break;
     118    case PieceData::UNGRAB:
     119        int dx = data->i * 48 - data->x;
     120        int dy = data->j * 48 - data->y;
     121        dx = dx + 2 / 3;
     122        dy = dy + 2 / 3;
     123        data->x += dx;
     124        data->y += dy;
     125        if (dx == 0 && dy == 0)
     126            data->state = PieceData::IDLE;
     127        break;
    80128    }
    81129    Entity::TickGame(deltams);
     
    87135
    88136    int id = data->id;
    89     int i = data->i;
    90     int j = data->j;
     137    int x = data->x + 24;
     138    int y = data->y + 177;
     139    int z = 2;
    91140    if (data->state == PieceData::BLINK)
    92         id++;
    93     data->game->GetScene()->AddTile((data->tiler << 16) | id,
    94                                     i * 48 + 24, j * 48 + 177, 2, 0);
     141        id = data->id + 1;
     142    if (data->state == PieceData::GRAB)
     143    {
     144        id = data->id + 1;
     145        z = 4;
     146    }
     147    data->game->GetScene()->AddTile((data->tiler << 16) | id, x, y, z, 0);
    95148}
    96149
  • trunk/monsterz/piece.h

    r230 r238  
    2323    virtual ~Piece();
    2424
    25     void Blink();
     25    int Blink();
     26    int Grab(Int2 dir);
     27    int Ungrab();
    2628
    2729protected:
  • trunk/src/sdlinput.cpp

    r236 r238  
    5151    Int2 mouse;
    5252    if (SDL_GetAppState() & SDL_APPMOUSEFOCUS)
     53    {
    5354        SDL_GetMouseState(&mouse.x, &mouse.y);
     55        mouse.y = Video::GetHeight() - 1 - mouse.y;
     56    }
    5457    else
    5558        mouse.x = mouse.y = -1;
Note: See TracChangeset for help on using the changeset viewer.