void CTetrisGame::RandNewShape() { //重置加速下落标记 m_bFastMoveDown = false; //设置当前方块类型,重新随机下一个方块类型 int iShape = m_iNextShape; m_iNextShape = Random(0, GetShapeCount()); //更新小方块区域显示 m_pGameScene->UpdateSmallBricks(); //检查位置是否有效 2 每个形状都是4*4 一半即是2 int iColIdx = COLUMN_NUM / 2 - 2 + TETRIS_COLOFFSET[iShape]; if (!CheckBrickPos(iShape, 0, iColIdx)) { m_enGameState = GAMESTATE_OVER; } else { m_iCurShape = iShape; m_stCurPos.m_iRowIdx = 0; m_stCurPos.m_iColIdx = iColIdx; } //特殊方块闪烁显示 m_bFlashFlag = (m_iCurShape >= 19); }
void CTetrisGame::InitData() { //初始化所有方块状态 for (int i = 0; i < ROW_NUM; ++i) { for (int j = 0; j < COLUMN_NUM; ++j) { m_arrBrick[i][j] = false; } } //初始化分数 m_iScore = 0; //加载存档 bool bRecordValidFlag = GET_BOOLVALUE("TETRIS_RECORD_VALID", false); if (bRecordValidFlag) { CGeneralManager::getInstance()->LoadTetrisData(m_arrBrick); m_iScore = GET_INTVALUE("SCORE_RECORD", 0); } //更新显示分数 m_pGameScene->UpdateScore(m_iScore, false); //随机下一个方块类型 m_iNextShape = Random(0, GetShapeCount()); //产生新的方块 RandNewShape(); //游戏状态 m_enGameState = GAMESTATE_RUNNING; //时间相关 m_fMoveDownTime = 0; m_fBtnCheckTime = 0; m_fSelfFlashTime = 0; //炸弹闪烁次数 m_iSelfFlashCount = 0; //标记 m_bLeftBtnPressed = false; m_bRightBtnPressed = false; m_bFastMoveDown = false; m_bSelfShowFlag = true; m_pGameScene->UpdateBricks(); }
//! checks collision with another component void RigidBodyComponent::CheckCollisions(CollisionComponent* pOther) { if(RigidBodyComponent* pOtherRigidBody = DYNAMIC_CAST(pOther, RigidBodyComponent)) { std::vector<CollisionShape::CollisionInfo> infos; Entity3D* pParent = static_cast<Entity3D*>(GetParent()); Entity3D* pOtherParent = static_cast<Entity3D*>(pOther->GetParent()); CollisionShapeTransform component1Transform(pParent->GetTransformationMatrix(), pParent->GetAbsoluteScale()); CollisionShapeTransform component2Transform(pOtherParent->GetTransformationMatrix(), pOtherParent->GetAbsoluteScale()); for(u32 i=0; i<GetShapeCount(); ++i) { if(CollisionShape* pShape1 = GetShape(i)) { for(u32 j=0; j<pOtherRigidBody->GetShapeCount(); ++j) { if(CollisionShape* pShape2 = pOtherRigidBody->GetShape(j)) { CollisionShape::CollisionInfo info; if(pShape1->CollidesWith(pShape2, component1Transform, component2Transform, info)) { infos.push_back(info); } } } } } if(!infos.empty()) { OnCollision(pOther, infos); pOther->OnCollision(this, infos); } } }
void CTetrisGame::OnFireBtnPressed() { PLAY_EFFECT(EFFECT_CHANGE2); //处理特殊方块 if (m_iCurShape == 19 || m_iCurShape == 20) { bool bAddFlag = (m_iCurShape == 19); //获取当前位置对应列包含的方块数量 int iRowIdx = GetNextAddOrSubRowIdx(m_stCurPos.m_iColIdx); //要操作的方块位置 iRowIdx += (bAddFlag ? -1 : 0); if (iRowIdx < m_stCurPos.m_iRowIdx + TETRIS_ROWCOUNT[m_iCurShape] || iRowIdx > ROW_NUM - 1) { return; } int iColIdx = m_stCurPos.m_iColIdx; //设置状态 m_arrBrick[iRowIdx][iColIdx] = bAddFlag; m_pGameScene->UpdateBrick(iRowIdx, iColIdx, false, bAddFlag); //如果是加方块,需要检查是否可以消除行 if (bAddFlag) { DeleteLine(false); } return; } //检查当前形状所属类型 int iAllTypeCount = sizeof(TETRIS_TYPE_START_IDX) / sizeof(int); int iStartIdx = TETRIS_TYPE_START_IDX[iAllTypeCount - 1]; int iEndIdx = GetShapeCount(); for (int i = 0; i < iAllTypeCount; ++i) { if (m_iCurShape < TETRIS_TYPE_START_IDX[i]) { iStartIdx = TETRIS_TYPE_START_IDX[i - 1]; iEndIdx = TETRIS_TYPE_START_IDX[i]; break; } } int iShape = m_iCurShape; if (++iShape >= iEndIdx) { iShape = iStartIdx; } //检查是否可以变换 if (CheckBrickPos(iShape, m_stCurPos.m_iRowIdx, m_stCurPos.m_iColIdx)) { //更新当前形状 m_iCurShape = iShape; //位置修正 if (m_stCurPos.m_iColIdx + TETRIS_COLCOUNT[m_iCurShape] > COLUMN_NUM) { m_stCurPos.m_iColIdx = COLUMN_NUM - TETRIS_COLCOUNT[m_iCurShape]; } //更新显示 m_pGameScene->UpdateBricks(m_stCurPos.m_iRowIdx, m_stCurPos.m_iColIdx, m_stCurPos.m_iRowIdx + 4, m_stCurPos.m_iColIdx + 4); } }