1、实验要求
玩家通过联通球杆与单个台球碰撞。 当台球以一定的速度穿过桌子右侧相同颜色的洞时,球进入洞中,新的球重新分配在桌子右侧,开始游戏。 要求如下:
1 游戏初始界面如图所示。 一侧有一个小台球,它在x方向的位置是固定的,它在y方向的位置是随机的。 左侧有八个颜色不同、体积较大的孔。 游戏的目的是用左边的台球以一定的速度穿过左边同色的洞,即使台球进入洞内,然后重新分配新的球。
2 球杆随着鼠标移动而移动,点击球杆,台球获得前进速度,同时向前移动。 台球的前进方向有一条实线表示球的移动方向。
3 两侧的孔随着通讯的频率不断改变位置。 洞的x右侧保持不变,替换y坐标的位置,即每一轮中每个洞的位置与下一个洞相连,最底下的洞与下一个洞的位置相连第一个洞。 所有这些操作必须以一种频率完成。 因此,当游戏以一定的频率进行时精灵游戏源码,两侧的洞可以达到循环变化的效果。
4 当球击中桌子边缘时,它会以发射角度的角度弹开。
5个球进洞的判断是,当球以一定的速度穿过同颜色的洞时,台球消失,说明球已入洞,左侧随机生成一个新球。 球移动到球洞的速度不宜太快。 如果速度太快,球会直接穿过洞。 如果速度太小,球就不会进洞。
二、代码
LessonX.h:
//
//
//
//
#ifndef_LESSON_X_H_
#define_LESSON_X_H_
//
#包括
//
//游戏管理器类。负责处理游戏的主循环、游戏初始化、结束等。
CGameMain 类
私人的:
intm_iGameState;
intm_iPlayState;//操作状态,0--可以点击鼠标玩球; 1--球在运动,等待最后的踢球机会
intm_iBallNumber;//每轮从0-7随机一张彩色图片,作为本轮的球
floatm_fOldRotation;//球杆的初始方向,用于球杆重置
CSprite*m_spBall[8];//8个球精灵
CSprite*m_spBallCue;//提示精灵
intm_iHoleNumber[8];
CSprite*m_spBallHole[8];//8个孔的精灵
floatm_fHoleRollTime;
floatm_fRotateTime;//球杆击球时,进行一小段时间的角度旋转,模拟击球的动作
CSprite*m_spVerSide[2];//台球桌的上下边缘精灵
CSprite*m_spHorSide[2];//台球桌左右边缘精灵
民众:
CGameMain();//构造函数
~CGameMain();//析构函数
//获取方法
intGetGameState(){returnm_iGameState;}
//设置方法
voidSetGameState(constintiState){m_iGameState=iState;}
//游戏主循环等
voidGameMainLoop(floatfDeltaTime);
voidGameInit();
voidGameRun(floatfDeltaTime);
无效游戏结束();
voidOnMouseMove(constfloatfMouseX, constfloatfMouseY);//参数为键盘X、Y坐标的值
voidOnMouseClick(consttiMouseType, constfloatfMouseX, constfloatfMouseY);
voidOnSpriteColSprite(constcharszSrcName[], constcharszTarName[]);
};
//
externCGameMaing_GameMain;
#endif//_LESSON_X_H_
LessonX.cpp:
//
//
//
//
#ifndef_LESSON_X_H_
#define_LESSON_X_H_
//
#包括
//
//游戏管理器类。负责处理游戏的主循环、游戏初始化、结束等。
CGameMain 类
私人的:
intm_iGameState;
intm_iPlayState;//操作状态,0--可以点击鼠标玩球; 1--球在运动,等待最后的踢球机会
intm_iBallNumber;//每轮从0-7随机一张彩色图片,作为本轮的球
floatm_fOldRotation;//球杆的初始方向精灵游戏源码,用于球杆重置
CSprite*m_spBall[8];//8个球精灵
CSprite*m_spBallCue;//提示精灵
intm_iHoleNumber[8];
CSprite*m_spBallHole[8];//8个孔的精灵
floatm_fHoleRollTime;
floatm_fRotateTime;//球杆击球时,进行一小段时间的角度旋转,模拟击球的动作
CSprite*m_spVerSide[2];//台球桌的上下边缘精灵
CSprite*m_spHorSide[2];//台球桌左右边缘精灵
民众:
CGameMain();//构造函数
~CGameMain();//析构函数
//获取方法
intGetGameState(){returnm_iGameState;}
//设置方法
voidSetGameState(constintiState){m_iGameState=iState;}
//游戏主循环等
voidGameMainLoop(floatfDeltaTime);
voidGameInit();
voidGameRun(floatfDeltaTime);
无效游戏结束();
voidOnMouseMove(constfloatfMouseX, constfloatfMouseY);//参数为键盘X、Y坐标的值
voidOnMouseClick(consttiMouseType, constfloatfMouseX, constfloatfMouseY);
voidOnSpriteColSprite(constcharszSrcName[], constcharszTarName[]);
};
//
externCGameMaing_GameMain;
#endif//_LESSON_X_H_
主要.cpp
//------------------------------------------------ ----------------------------
//
//------------------------------------------------ ----------------------------
#include“CommonClass.h”
#include“LessonX.h”
///
//
//主函数入口
//
//
intPASCALWinMain(HINSTANCEhInstance,
HINSTANCEhPrevInstance,
LPSTRlpCmdLine,
intnCmdShow)
//初始化游戏引擎
if(!CSystem::InitGameEngine(hInstance,lpCmdLine))
返回0;
//Todo: 此处使用API修改窗口标题
CSystem::SetWindowTitle("LessonX");
//引擎主循环,处理屏幕图像刷新等工作
while(CSystem::EngineMainLoop())
// 获取两次调用的时间差,传递给游戏逻辑处理
floatfTimeDelta=CSystem::GetTimeDelta();
// 执行游戏的主循环
g_GameMain.GameMainLoop(fTimeDelta);
};
//关闭游戏引擎
CSystem::ShutdownGameEngine();
返回0;
//================================================== ================================
//
// 引擎捕获到键盘通讯消息后,会调用该函数
voidCSystem::OnMouseMove(constfloatfMouseX, constfloatfMouseY)
//这里可以添加游戏需要的响应函数
g_GameMain.OnMouseMove(fMouseX,fMouseY);
//================================================== ================================
//
// 引擎捕获到键盘点击消息后,会调用该函数
voidCSystem::OnMouseClick(consttiMouseType, constfloatfMouseX, constfloatfMouseY)
//这里可以添加游戏需要的响应函数
g_GameMain.OnMouseClick(iMouseType, fMouseX, fMouseY);
//================================================== ================================
//
// 引擎捕获到键盘弹出消息后,会调用该函数
voidCSystem::OnMouseUp(consttiMouseType, constfloatfMouseX, constfloatfMouseY)
//这里可以添加游戏需要的响应函数
//================================================== ================================
//
// 引擎捕获到鼠标按下消息后,会调用该函数
//bAltPressbShiftPressbCtrlPress是判断当前是否按下了Shift、Alt、Ctrl。比如可以判断Ctrl+E组合键
voidCSystem::OnKeyDown(consttiKey, constboolbAltPress, constboolbShiftPress, constboolbCtrlPress)
//这里可以添加游戏需要的响应函数
//================================================== ================================
//
//引擎捕获到鼠标弹出消息后,会调用该函数
voidCSystem::OnKeyUp(constintiKey)
//这里可以添加游戏需要的响应函数
//================================================== == ===============================
//
// 引擎捕获到精灵与精灵的碰撞后,调用该函数
voidCSystem::OnSpriteColSprite(constchar*szSrcName, constchar*szTarName)
g_GameMain.OnSpriteColSprite(szSrcName,szTarName);
//================================================== == ===============================
//
// 引擎捕获到精灵与世界边界的碰撞后,调用该函数。
//iColSide: 0在右边,1在右边,2在上面,3在下面
voidCSystem::OnSpriteColWorldLimit(constchar*szName, constintiColSide)
源文件下载地址:
提取码:ba59