Changeset 276


Ignore:
Timestamp:
Jan 24, 2011, 2:45:58 AM (10 years ago)
Author:
sam
Message:

Implement vertical blocking of falling pieces.

Location:
trunk/monsterz
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/monsterz/board.cpp

    r275 r276  
    166166                if (data->dst_cell != Int2(-1))
    167167                    data->pieces[data->dst_cell.i]
    168                                 [data->dst_cell.j]->Goto(data->dst_cell * 48,
    169                                                          0.3f);
     168                                [data->dst_cell.j]->Ungrab(data->dst_cell * 48);
    170169                if (cur_cell != Int2(-1))
    171170                    data->pieces[cur_cell.i]
    172                                 [cur_cell.j]->Goto(data->src_cell * 48, 0.3f);
     171                                [cur_cell.j]->Ungrab(data->src_cell * 48);
    173172                data->dst_cell = cur_cell;
    174173            }
     
    179178        {
    180179            /* Mouse released, or exited window, or dragged too far. */
    181             data->grabbed->Ungrab();
     180            data->grabbed->Ungrab(data->grabbed->GetCell() * 48);
    182181            if (data->dst_cell != Int2(-1))
    183182                Switch(data->src_cell, data->dst_cell);
     
    225224        data->pieces[cell_a.i][cell_a.j] = a;
    226225        data->pieces[cell_b.i][cell_b.j] = b;
    227         a->Goto(cell_a * 48, 0.3f);
    228         b->Goto(cell_b * 48, 0.3f);
     226        a->Ungrab(cell_a * 48);
     227        b->Ungrab(cell_b * 48);
    229228        return;
    230229    }
     
    232231    /* Perform the swap */
    233232    a->SetCell(cell_b);
    234     a->Goto(cell_b * 48, 0.3f);
     233    a->Ungrab(cell_b * 48);
    235234    b->SetCell(cell_a);
    236     b->Goto(cell_a * 48, 0.3f);
     235    b->Ungrab(cell_a * 48);
     236
     237    /* Swap above and below cells */
     238    if (cell_a.i == cell_b.i)
     239    {
     240        Piece *tmpa = a->GetAbove();
     241        Piece *tmpb = b->GetAbove();
     242        if (tmpb == a)
     243        {
     244            tmpb = b->GetBelow();
     245            b->SetAbove(tmpa);
     246            b->SetBelow(a);
     247            a->SetBelow(tmpb);
     248        }
     249        else /* tmpa == b */
     250        {
     251            tmpa = a->GetBelow();
     252            a->SetAbove(tmpb);
     253            a->SetBelow(b);
     254            b->SetBelow(tmpa);
     255        }
     256    }
     257    else
     258    {
     259        Piece *tmpa = a->GetAbove();
     260        Piece *tmpb = b->GetAbove();
     261        a->SetAbove(tmpb);
     262        b->SetAbove(tmpa);
     263        tmpa = a->GetBelow();
     264        tmpb = b->GetBelow();
     265        a->SetBelow(tmpb);
     266        b->SetBelow(tmpa);
     267    }
    237268
    238269    /* Remove matching pieces and store them in Mash objects */
     
    252283            Piece *below = data->pieces[i][7];
    253284
    254             /* Change coordinates for the whole colume above */
     285            /* Change coordinates for the whole column above */
    255286            for (int j2 = j + 1; j2 < 8; j2++)
    256287            {
    257288                data->pieces[i][j2 - 1] = data->pieces[i][j2];
    258289                data->pieces[i][j2 - 1]->SetCell(Int2(i, j2 - 1));
    259                 data->pieces[i][j2 - 1]->Goto(Int2(i, j2 - 1) * 48, 0.1f);
     290                data->pieces[i][j2 - 1]->Move(Int2(i, j2 - 1) * 48);
    260291                list[i][j2 - 1] = list[i][j2];
    261292            }
     
    268299            data->pieces[i][7]->SetBelow(below);
    269300            data->pieces[i][7]->SetPos(newpos);
    270             data->pieces[i][7]->Goto(Int2(i, 7) * 48, 0.1f);
     301            data->pieces[i][7]->Move(Int2(i, 7) * 48);
    271302            Ticker::Ref(data->pieces[i][7]);
    272303            list[i][7] = 0;
  • trunk/monsterz/piece.cpp

    r274 r276  
    197197}
    198198
    199 int Piece::Ungrab()
    200 {
    201     switch (data->state)
    202     {
    203     case PieceData::GRAB:
     199int Piece::Ungrab(Int2 pos)
     200{
     201    switch (data->state)
     202    {
     203    case PieceData::IDLE:
     204    case PieceData::BLINK:
     205    case PieceData::GRAB:
     206    case PieceData::UNGRAB:
     207    case PieceData::MOVE:
    204208        data->state = PieceData::UNGRAB;
     209        data->speed = 0.4f;
     210        data->timer = 0.0f;
     211        data->src = data->pos;
     212        data->dst = pos;
     213        return 1;
     214    default:
     215        return 0;
     216    }
     217}
     218
     219int Piece::Move(Int2 pos)
     220{
     221    switch (data->state)
     222    {
     223    case PieceData::IDLE:
     224    case PieceData::BLINK:
     225    case PieceData::UNGRAB:
     226    case PieceData::MOVE:
     227        data->state = PieceData::MOVE;
    205228        data->speed = 0.3f;
    206229        data->timer = 0.0f;
    207230        data->src = data->pos;
    208         data->dst = data->cell * 48;
    209         return 1;
    210     default:
    211         return 0;
    212     }
    213 }
    214 
    215 int Piece::Goto(Int2 pos, float speed)
    216 {
    217     switch (data->state)
    218     {
    219     case PieceData::IDLE:
    220     case PieceData::BLINK:
    221     case PieceData::UNGRAB:
    222     case PieceData::MOVE:
    223         data->state = PieceData::MOVE;
    224         data->timer = 0.0f;
    225         data->src = data->pos;
    226231        data->dst = pos;
    227         data->speed = speed;
    228232        return 1;
    229233    case PieceData::GRAB:
     
    255259        if (t >= 1.0f)
    256260            t = 1.0f;
     261        data->pos = data->src + (t * trip + 0.5f);
     262        /* If the piece below is blocking us, clamp our position and
     263         * start falling again. */
     264        if (data->state == PieceData::MOVE && data->below
     265             && data->pos.y < data->below->data->pos.y + 48)
     266        {
     267            data->pos.y = data->below->data->pos.y + 48;
     268            data->src = data->pos;
     269            data->timer = 0.0f;
     270        }
    257271        if (data->timer > moving_time + 200.0f)
    258272            data->state = PieceData::IDLE;
    259         data->pos = data->src + (t * trip + 0.5f);
    260273        break;
    261274    }
  • trunk/monsterz/piece.h

    r274 r276  
    3939    int Pop();
    4040    int Grab(Int2 dir);
    41     int Ungrab();
    42     int Goto(Int2 dir, float speed);
     41    int Ungrab(Int2 pos);
     42    int Move(Int2 pos);
    4343
    4444protected:
Note: See TracChangeset for help on using the changeset viewer.