一、实验要求
玩家通过移动球杆到单一的桌球处碰撞桌球运动,当桌球于一定速度通过桌面右方的同样颜色的球洞后,则该球进洞,在桌面左边重新分配新球开始游戏。要求如下:
1 游戏的初始界面如图,其中左边有一个体积较小的桌球,其x方向位置固定,y方向位置随机。右边有八个颜色不一样,体积较大的球洞,游戏的目的是使用左边的桌球以一定小的速度穿过右边同样颜色的球洞就算桌球进洞,然后重新分配新球。
2 球杆随鼠标运动而运动,单击球杆,桌球获取一个前进的速度同时往前有运动。桌球的前进方向有一段指示球运动方向的虚线。
3 右侧的球洞以移动的频率不断更换位置。球洞的x左边不变,更换的是y坐标的位置,即每一轮中每一个球洞移动到下一个球洞的位置,最下边的球洞则移动到第一个球洞位置。所以的这些动作都要在一个频率的时间里面完成。因此当游戏一某一个频率进行的时候,右侧的球洞就能实现循环变化的效果。
4 球碰撞到桌面边沿的时候以发射角的角度弹走。
5 球进洞的判断是球以一定的速度通过同样颜色的球洞时,桌球消失,表明球进洞了,此时左侧随机生成新球。球运动到球洞的速度不能太大,太大则球直接运动过球洞,速度太小,则球同样不进洞。
二、代码
LessonX.h:
/
//
//
//
//
/
#ifndef _LESSON_X_H_
#define _LESSON_X_H_
//
#include <Windows.h>
/
//
// 游戏总管类。负责处理游戏主循环、游戏初始化、结束等工作
class CGameMain
{
private:
int m_iGameState;
int m_iPlayState;// 操作状态,0 -- 可以点击鼠标打球;1 -- 球在运动中,等待下次打球机会
int m_iBallNumber; // 每局从0-7随机一个颜色图片,作为本局的球
float m_fOldRotation; // 球杆的初始朝向,用于球杆复位
CSprite* m_spBall[8]; // 8个球的精灵
CSprite* m_spBallCue; //球杆精灵
int m_iHoleNumber[8];
CSprite* m_spBallHole[8]; // 8个球洞的精灵
float m_fHoleRollTime;
float m_fRotateTime;// 球杆拍下时,做个角度旋转,持续一小段时间,模拟拍下的动作
CSprite* m_spVerSide[2]; //桌球台上下边沿精灵
CSprite* m_spHorSide[2]; //桌球台左右边沿精灵
public:
CGameMain(); //构造函数
~CGameMain(); //析构函数
// Get方法
int GetGameState() { return m_iGameState; }
// Set方法
void SetGameState( const int iState ) { m_iGameState = iState; }
// 游戏主循环等
void GameMainLoop( float fDeltaTime );
void GameInit();
void GameRun( float fDeltaTime );
void GameEnd();
void OnMouseMove( const float fMouseX, const float fMouseY );//参数即为鼠标X,Y坐标的值
void OnMouseClick( const int iMouseType, const float fMouseX, const float fMouseY );
void OnSpriteColSprite( const char szSrcName[], const char szTarName[] );
};
/
//
extern CGameMain g_GameMain;
#endif // _LESSON_X_H_
LessonX.cpp:
/
//
//
//
//
/
#ifndef _LESSON_X_H_
#define _LESSON_X_H_
//
#include <Windows.h>
/
//
// 游戏总管类。负责处理游戏主循环、游戏初始化、结束等工作
class CGameMain
{
private:
int m_iGameState;
int m_iPlayState;// 操作状态,0 -- 可以点击鼠标打球;1 -- 球在运动中,等待下次打球机会
int m_iBallNumber; // 每局从0-7随机一个颜色图片,作为本局的球
float m_fOldRotation; // 球杆的初始朝向,用于球杆复位
CSprite* m_spBall[8]; // 8个球的精灵
CSprite* m_spBallCue; //球杆精灵
int m_iHoleNumber[8];
CSprite* m_spBallHole[8]; // 8个球洞的精灵
float m_fHoleRollTime;
float m_fRotateTime;// 球杆拍下时,做个角度旋转,持续一小段时间,模拟拍下的动作
CSprite* m_spVerSide[2]; //桌球台上下边沿精灵
CSprite* m_spHorSide[2]; //桌球台左右边沿精灵
public:
CGameMain(); //构造函数
~CGameMain(); //析构函数
// Get方法
int GetGameState() { return m_iGameState; }
// Set方法
void SetGameState( const int iState ) { m_iGameState = iState; }
// 游戏主循环等
void GameMainLoop( float fDeltaTime );
void GameInit();
void GameRun( float fDeltaTime );
void GameEnd();
void OnMouseMove( const float fMouseX, const float fMouseY );//参数即为鼠标X,Y坐标的值
void OnMouseClick( const int iMouseType, const float fMouseX, const float fMouseY );
void OnSpriteColSprite( const char szSrcName[], const char szTarName[] );
};
/
//
extern CGameMain g_GameMain;
#endif // _LESSON_X_H_
Main.cpp
//-----------------------------------------------------------------------------
//
//-----------------------------------------------------------------------------
#include "CommonClass.h"
#include "LessonX.h"
///
//
// 主函数入口
//
//
int PASCAL WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
// 初始化游戏引擎
if( !CSystem::InitGameEngine( hInstance, lpCmdLine ) )
return 0;
// To do : 在此使用API更改窗口标题
CSystem::SetWindowTitle("LessonX");
// 引擎主循环,处理屏幕图像刷新等工作
while( CSystem::EngineMainLoop() )
{
// 获取两次调用之间的时间差,传递给游戏逻辑处理
float fTimeDelta = CSystem::GetTimeDelta();
// 执行游戏主循环
g_GameMain.GameMainLoop( fTimeDelta );
};
// 关闭游戏引擎
CSystem::ShutdownGameEngine();
return 0;
}
//==========================================================================
//
// 引擎捕捉鼠标移动消息后,将调用到本函数
void CSystem::OnMouseMove( const float fMouseX, const float fMouseY )
{
// 可以在此添加游戏需要的响应函数
g_GameMain.OnMouseMove(fMouseX,fMouseY);
}
//==========================================================================
//
// 引擎捕捉鼠标点击消息后,将调用到本函数
void CSystem::OnMouseClick( const int iMouseType, const float fMouseX, const float fMouseY )
{
// 可以在此添加游戏需要的响应函数
g_GameMain.OnMouseClick(iMouseType,fMouseX,fMouseY );
}
//==========================================================================
//
// 引擎捕捉鼠标弹起消息后,将调用到本函数
void CSystem::OnMouseUp( const int iMouseType, const float fMouseX, const float fMouseY )
{
// 可以在此添加游戏需要的响应函数
}
//==========================================================================
//
// 引擎捕捉键盘按下消息后,将调用到本函数
// bAltPress bShiftPress bCtrlPress 分别为判断Shift,Alt,Ctrl当前是否也处于按下状态。比如可以判断Ctrl+E组合键
void CSystem::OnKeyDown( const int iKey, const bool bAltPress, const bool bShiftPress, const bool bCtrlPress )
{
// 可以在此添加游戏需要的响应函数
}
//==========================================================================
//
// 引擎捕捉键盘弹起消息后,将调用到本函数
void CSystem::OnKeyUp( const int iKey )
{
// 可以在此添加游戏需要的响应函数
}
//===========================================================================
//
// 引擎捕捉到精灵与精灵碰撞之后,调用此函数
void CSystem::OnSpriteColSprite( const char *szSrcName, const char *szTarName )
{
g_GameMain.OnSpriteColSprite(szSrcName,szTarName);
}
//===========================================================================
//
// 引擎捕捉到精灵与世界边界碰撞之后,调用此函数.
// iColSide : 0 左边,1 右边,2 上边,3 下边
void CSystem::OnSpriteColWorldLimit( const char *szName, const int iColSide )
{
}
源文件下载地址:https://pan.xunlei.com/s/VMiuDZoaYO1UnDucR0VpLH4EA1
提取码:ba59