//方块向下移动 bool CBlock::MoveDown() { if (GetBlockBound(DOWN) <= 0) { for (int i=0; i!=m_block.size(); ++i) { g_pFrm->SetFilled(m_block[i].x, m_block[i].y); } return false; } //先判断是否会撞击 if (IsCrashed(DOWN)) { for (int i=0; i!=m_block.size(); ++i) { g_pFrm->SetFilled(m_block[i].x, m_block[i].y); } cout << "Crashed!" << endl; return false; } else { for (int i=0; i!=m_block.size(); ++i) { --m_block[i].y; } --m_ptRotate.y; cout << "CBlock::MoveDown" << endl; return true; } }
//方块向右移动 void CBlock::MoveRight() { if (GetBlockBound(RIGHT) >= g_pFrm->GetWidth() - 1) { return; } //先判断是否会撞击 if (IsCrashed(RIGHT)) { cout << "Crashed!" << endl; return; } else { for (int i=0; i!=m_block.size(); ++i) { ++m_block[i].x; } ++m_ptRotate.x; cout << "CBlock::MoveRight" << endl; } }
//方块向左移动 void CBlock::MoveLeft() { if (GetBlockBound(LEFT) <= 0) { return; } //先判断是否会撞击 if (IsCrashed(LEFT)) { cout << "Crashed!" << endl; return; } else { for (int i=0; i!=m_block.size(); ++i) { --m_block[i].x; } --m_ptRotate.x; cout << "CBlock::MoveLeft" << endl; } }
//重写长条方块的旋转方法 void CBar::Rotate() { Square_vec tmpvec; tmpvec.reserve(m_block.size()); //如果是竖的则变成横的,反之亦然 if (m_block[0].y - m_block[1].y != 0) { tmpvec.push_back(m_ptRotate); tmpvec.push_back(Square(m_ptRotate.x-2, m_ptRotate.y)); tmpvec.push_back(Square(m_ptRotate.x-1, m_ptRotate.y)); tmpvec.push_back(Square(m_ptRotate.x+1, m_ptRotate.y)); } else { tmpvec.push_back(m_ptRotate); tmpvec.push_back(Square(m_ptRotate.x, m_ptRotate.y+2)); tmpvec.push_back(Square(m_ptRotate.x, m_ptRotate.y+1)); tmpvec.push_back(Square(m_ptRotate.x, m_ptRotate.y-1)); } m_block.swap(tmpvec); //判断旋转后的方块是否会发生越界 if (GetBlockBound(LEFT) < 0 || GetBlockBound(RIGHT) > g_pFrm->GetWidth()-1 || GetBlockBound(DOWN) < 0) { m_block.swap(tmpvec); return; } //判断旋转后的方块是否会和frame内的方块发生重叠 if (IsCrashed(NO)) { m_block.swap(tmpvec); return; } }
/* 正反L型方块,正反Z型方块和T型方块都调用基类的Rotate来旋转, 思路即是将其放入一个3X3的矩阵中,然后旋转矩阵就行了,各方块在旋转时旋转点不动 */ void CBlock::Rotate() { //在最顶上的时候不能旋转,因为可能会超出界限 if (GetBlockBound(UP) >= g_pFrm->GetHeight()-1) { return; } int rect[3][3] = {}; for (int i=0; i!=m_block.size(); ++i) { int x = m_block[i].x - m_ptRotate.x + 1; int y = m_block[i].y - m_ptRotate.y + 1; rect[y][x] = 1; } //旋转3x3数组 int tmp[3][3] = {}; for (int i=0; i<3; i++) { for (int j=0; j<3; j++) { tmp[i][j] = rect[j][2-i]; } } Square_vec tmpvec; tmpvec.reserve(m_block.size()); for (int i=0;i<3;i++) { for (int j=0;j<3;j++) { if (tmp[i][j] == 1) { //Square newsqr(j + m_ptRotate.x-1, i + m_ptRotate.y-1); tmpvec.push_back(Square(j+m_ptRotate.x-1, i+m_ptRotate.y-1)); } } } //判断旋转后的方块是否会发生越界 /* for (int i=0; i!=tmpvec.size(); ++i) { if (tmpvec[i].x <= 0 || tmpvec[i].x >= g_pFrm->GetWidth() || tmpvec[i].y <= 0 || tmpvec[i].y >= g_pFrm->GetHeight()) return; } */ m_block.swap(tmpvec); //判断旋转后的方块是否会发生越界 if (GetBlockBound(LEFT) < 0 || GetBlockBound(RIGHT) > g_pFrm->GetWidth()-1 || GetBlockBound(DOWN) < 0) { m_block.swap(tmpvec); return; } //判断旋转后的方块是否会和frame内的方块发生重叠 if (IsCrashed(NO)) { m_block.swap(tmpvec); return; } cout << "CBlock::Rotate" << endl; }
bool IsCrashed(CharaObj &c1, CharaObj &c2, float cs1, float cs2){ return IsCrashed(c1.p.x(), c1.p.y(), c2.p.x(), c2.p.y(), c1.size.x(), c1.size.y(), cs1, cs2); }
bool IsCrashed(CharaObj &c1, CharaObj &c2){ return IsCrashed(c1.p.x(), c1.p.y(), c2.p.x(), c2.p.y(), c1.size.x(), c1.size.y(), c2.size.x(), c2.size.y()); }