コード例 #1
0
ファイル: TetrisGame.cpp プロジェクト: lfeng1420/BrickGame
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);
}
コード例 #2
0
ファイル: TetrisGame.cpp プロジェクト: lfeng1420/BrickGame
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();
}
コード例 #3
0
	//! 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);
			}
		}
	}
コード例 #4
0
ファイル: TetrisGame.cpp プロジェクト: lfeng1420/BrickGame
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);
	}
}