/////////////////////////////////////////////////////////////////////////////////
//
//
//
//
/////////////////////////////////////////////////////////////////////////////////
#include <Stdio.h>
#include "CommonClass.h"
#include "LessonX.h"
#include "math.h"
////////////////////////////////////////////////////////////////////////////////
//
//
CGameMain g_GameMain;
//==============================================================================
//
// 大体的程序流程为:GameMainLoop函数为主循环函数,在引擎每帧刷新屏幕图像之后,都会被调用一次。
//==============================================================================
//
// 构造函数
CGameMain::CGameMain()
{
m_iGameState = 1;
m_iPlayState = 0;
m_iBallNumber = 0;
m_fOldRotation = 0.f;
m_fHoleRollTime = 0.f;
m_fRotateTime = 0.f;
//初始化球杆精灵
m_spBallCue = new CSprite("BallCue");
//初始化球和球洞精灵
int iLoop = 0;
char* tmpName="";
for( iLoop = 0; iLoop < 8; iLoop++ )
{
//初始化8个球精灵
tmpName=CSystem::MakeSpriteName("Ball",iLoop);
m_spBall[iLoop]=new CSprite(tmpName);
//初始化8个球洞精灵
m_iHoleNumber[iLoop] = iLoop;
tmpName=CSystem::MakeSpriteName( "BallHole", iLoop );
m_spBallHole[iLoop]=new CSprite(tmpName);
}
for(iLoop=0;iLoop<2;iLoop++)
{
//上下边沿精灵初始化
tmpName=CSystem::MakeSpriteName("VerSide",iLoop);
m_spVerSide[iLoop]=new CSprite(tmpName);
//左右边沿精灵的初始化
tmpName=CSystem::MakeSpriteName("HorSide",iLoop);
m_spHorSide[iLoop]=new CSprite(tmpName);
}
}
//==============================================================================
//
// 析构函数
CGameMain::~CGameMain()
{
}
//==============================================================================
//
// 游戏主循环,此函数将被不停的调用,引擎每刷新一次屏幕,此函数即被调用一次
// 用以处理游戏的开始、进行中、结束等各种状态.
// 函数参数fDeltaTime : 上次调用本函数到此次调用本函数的时间间隔,单位:秒
void CGameMain::GameMainLoop( float fDeltaTime )
{
switch( GetGameState() )
{
// 初始化游戏,清空上一局相关数据
case 1:
{
GameInit();
SetGameState(2); // 初始化之后,将游戏状态设置为进行中
}
break;
// 游戏进行中,处理各种游戏逻辑
case 2:
{
// TODO 修改此处游戏循环条件,完成正确游戏逻辑
if( true )
{
GameRun( fDeltaTime );
}
else // 游戏结束。调用游戏结算函数,并把游戏状态修改为结束状态
{
SetGameState(0);
GameEnd();
}
}
break;
// 游戏结束/等待按空格键开始
case 0:
default:
break;
};
}
//=============================================================================
//
// 每局开始前进行初始化,清空上一局相关数据
void CGameMain::GameInit()
{
//随机本局的球数字,如果和上一局的不一致,则将上局的球拉到屏幕外,将本局的球拉到屏幕内。
int iNewBallNumber = CSystem::RandomRange( 0, 7 );
if( iNewBallNumber != m_iBallNumber )
{
m_spBall[m_iBallNumber]->SetSpritePositionY(50.f);
// 新球,移动到屏幕中
m_iBallNumber = iNewBallNumber;
m_spBall[m_iBallNumber]->SetSpritePositionX(-30.f);
}
//在Y向上随机摆放球的初始位置,只随机Y方向坐标,不动X方向
int iPosY = CSystem::RandomRange( -25, 25 );
m_spBall[m_iBallNumber]->SetSpritePositionY((float)iPosY);
//获取球拍的初始朝向,只做一次
static int iInited = 0;
if( !iInited )
{
//隐藏鼠标
CSystem::ShowCursor(false);
iInited = 1;
m_fOldRotation = m_spBallCue->GetSpriteRotation();
}
//设置精灵碰撞模式。
for(int i=0; i<8;i++)
{
//设置球为发送碰撞模式
m_spBall[i]->SetSpriteCollisionSend(1);
}
//设置桌球台边沿精灵为接收碰撞
for(int j=0;j<2;j++)
{
m_spVerSide[j]->SetSpriteCollisionReceive(1);
m_spHorSide[j]->SetSpriteCollisionReceive(1);
}
}
//=============================================================================
//
// 每局游戏进行中
void CGameMain::GameRun( float fDeltaTime )
{
//判断球是否在静止状态
if( 0 == m_iPlayState )
{
//画线
DrawDottedLine();
}
else
{
// 判断球是否位于球洞内。
float fVelX = m_spBall[m_iBallNumber]->GetSpriteLinearVelocityX();
float fVelY = m_spBall[m_iBallNumber]->GetSpriteLinearVelocityY();
// 计算速度向量的大小.sqrt是开平方函数
float fSpeedValue = sqrt( fVelX * fVelX + fVelY * fVelY );
// 速度判断, 球的速度必须低于某个值,速度太大将直接滚过球洞
if( fSpeedValue < 30.f )
{
float fPosX = m_spBall[m_iBallNumber]->GetSpritePositionX();
float fPosY = m_spBall[m_iBallNumber]->GetSpritePositionY();
if( m_spBallHole[m_iBallNumber]->IsPointInSprite(fPosX, fPosY ) )
{
// 重新开始下一局
m_iGameState = 1;
return;
}
// 如果速度为0,则可以重新开始打球操作
if( fSpeedValue < 0.50f )
{
m_iPlayState = 0;
}
}
}
//球洞更换
HoleChange(fDeltaTime);
if( m_fRotateTime > 0.f )
{
m_fRotateTime -= fDeltaTime;
if( m_fRotateTime <= 0.f )
{
// 球杆旋转复位
m_spBallCue->SetSpriteRotation(m_fOldRotation);
}
}
}
//=============================================================================
//
// 本局游戏结束
void CGameMain::GameEnd()
{
}
//让球杆跟随鼠标移动
void CGameMain::OnMouseMove( const float fMouseX, const float fMouseY )
{
m_spBallCue->SetSpritePosition(fMouseX, fMouseY );
}
//画线
void CGameMain::DrawDottedLine()
{
// 获取球杆和球的位置
float fBallPosX = m_spBall[m_iBallNumber]->GetSpritePositionX();
float fBallPosY = m_spBall[m_iBallNumber]->GetSpritePositionY();
float fCuePosX = m_spBallCue->GetSpritePositionX();
float fCuePosY = m_spBallCue->GetSpritePositionY();
//计算球和球杆之间的向量
float fVectorX = fBallPosX - fCuePosX;
float fVectorY = fBallPosY - fCuePosY;
// 如果只有当两点不重合的时候(向量值不为零),才需要处理
if( fVectorX > 0.001f || fVectorX < -0.001f || fVectorY > 0.001f || fVectorY < -0.001f )
{
// 计算该向量的大小,以及将该向量单位化(sqrt函数是开平方函数,回想下数学里如何求单位向量)
float fVectorSize = sqrt( fVectorX * fVectorX + fVectorY * fVectorY );
float fDirX = fVectorX / fVectorSize;
float fDirY = fVectorY / fVectorSize;
int iLoop = 0;
float fLastPosX = fBallPosX, fLastPosY = fBallPosY;
float fNewPosX = 0.f, fNewPosY = 0.f;
float fPosStep = fVectorSize / 10.f;
for( iLoop = 0; iLoop < 12; iLoop++ )
{
// 新坐标等于前一坐标加上向量方向上的一个距离值
fNewPosX = fLastPosX + fDirX * fPosStep;
fNewPosY = fLastPosY + fDirY * fPosStep;
// 偶数段就画
if( iLoop % 2 == 0 )
CSystem::DrawLine( fLastPosX, fLastPosY, fNewPosX, fNewPosY, 2.f, 0, 0, 255, 0, 255 );
// 坐标往前移动(NewPos赋值给LastPos)
fLastPosX = fNewPosX;
fLastPosY = fNewPosY;
}
}
}
//球洞更换
void CGameMain::HoleChange(const float fDeltaTime)
{
int iLoop = 0, iLastData = 0;
float fTempPosY = 0.f; //保存当前球洞的Y坐标
float fLastPosY = 0.f;//保存最后一个球洞的Y坐标
//iLoop是循环因子,iListData记录最后一个球洞的在m_iHoleNumber中的数值。
m_fHoleRollTime += fDeltaTime;//滚动频率
if( m_fHoleRollTime > 1.f )
{
m_fHoleRollTime -= 1.f;
// 取出最后一个值
iLastData = m_iHoleNumber[7];
fLastPosY = m_spBallHole[iLastData]->GetSpritePositionY();
// 从后往前遍历数组。注意只需要做6次循环(iLoop由7递减至1)
for( iLoop = 7; iLoop > 0; iLoop-- )
{
m_iHoleNumber[iLoop] = m_iHoleNumber[iLoop - 1];
int tmpNum=m_iHoleNumber[iLoop - 1];
// 先保存需要更改坐标的精灵的Y坐标作为下一个精灵的坐标,然后再给它赋值
fTempPosY = m_spBallHole[tmpNum]->GetSpritePositionY();
m_spBallHole[tmpNum]->SetSpritePositionY(fLastPosY);
fLastPosY = fTempPosY;
}
// 将取出来的最后一个值赋值给第一个
m_iHoleNumber[0] = iLastData;
m_spBallHole[iLastData]->SetSpritePositionY(fLastPosY);
}
//m_fHoleRollTime -= 1.f;保证了球洞更换速度不会太快或者太慢,同时m_fHoleRollTime的值不会一直在增加。
}
//鼠标点击事件
void CGameMain::OnMouseClick( const int iMouseType, const float fMouseX, const float fMouseY )
{
//
没有合适的资源?快使用搜索试试~ 我知道了~
funcode桌球小游戏源码
共166个文件
dso:46个
cs:39个
png:26个
需积分: 50 11 下载量 46 浏览量
2022-03-09
19:40:05
上传
评论 2
收藏 1.53MB RAR 举报
温馨提示
符合指导书要求编写完成的。
资源详情
资源评论
资源推荐
收起资源包目录
funcode桌球小游戏源码 (166个子文件)
level.t2d.bak 1KB
LessonX.cpp 9KB
Main.cpp 3KB
hbjh.cpp 0B
levelManagement.cs 14KB
options.cs 11KB
profiles.cs 10KB
keybindings.cs 10KB
align.cs 9KB
xml.cs 8KB
messageBox.cs 6KB
common.cs 5KB
chatClient.cs 5KB
projectManagement.cs 4KB
main.cs 4KB
serverConnection.cs 4KB
message.cs 4KB
clientConnection.cs 4KB
projectResources.cs 4KB
chatServer.cs 4KB
defaultPrefs.cs 4KB
screenshot.cs 3KB
datablocks.cs 3KB
metrics.cs 3KB
properties.cs 3KB
cursor.cs 3KB
audio.cs 2KB
server.cs 2KB
main.cs 2KB
help.cs 2KB
client.cs 2KB
message.cs 2KB
canvas.cs 2KB
main.cs 2KB
guiProfiles.cs 1KB
game.cs 1KB
kickban.cs 839B
scriptDoc.cs 640B
cursors.cs 598B
datablocks.cs 365B
brushes.cs 122B
persistent.cs 38B
banlist.cs 0B
MiniGolfBack.dds 256KB
Gem_5.dds 32KB
MiniGolfBlock1.dds 16KB
MiniGolfCue.dds 8KB
MiniGolfBlock2.dds 4KB
MiniGolfBlock3.dds 1KB
joinServer.gui.dso 11KB
profiles.cs.dso 9KB
levelManagement.cs.dso 9KB
options.gui.dso 9KB
align.cs.dso 9KB
level.t2d.dso 8KB
xml.cs.dso 8KB
options.cs.dso 7KB
console.gui.dso 6KB
keybindings.cs.dso 6KB
messageBox.cs.dso 5KB
chatGui.gui.dso 5KB
startServer.gui.dso 4KB
defaultPrefs.cs.dso 4KB
common.cs.dso 4KB
messageBoxOKCancelDetailsDlg.gui.dso 3KB
projectManagement.cs.dso 3KB
metrics.cs.dso 3KB
main.cs.dso 3KB
properties.cs.dso 3KB
messageBoxYesNoCancel.gui.dso 3KB
datablocks.cs.dso 3KB
helpDlg.gui.dso 2KB
help.cs.dso 2KB
NetworkMenu.gui.dso 2KB
projectResources.cs.dso 2KB
messageBoxOKCancel.gui.dso 2KB
messageBoxYesNo.gui.dso 2KB
screenshot.cs.dso 2KB
messageBoxOk.gui.dso 2KB
audio.cs.dso 2KB
guiProfiles.cs.dso 1KB
cursor.cs.dso 1KB
messagePopup.gui.dso 1KB
waitingForServer.gui.dso 1KB
remap.gui.dso 1KB
FrameOverlayGui.gui.dso 848B
mainScreen.gui.dso 847B
canvas.cs.dso 836B
game.cs.dso 732B
main.cs.dso 689B
scriptDoc.cs.dso 458B
cursors.cs.dso 405B
brushes.cs.dso 233B
persistent.cs.dso 129B
datablocks.cs.dso 33B
VCProjectVC6.dsp 4KB
snooker.dsw 560B
Game.exe 184KB
project.funProj 408B
options.gui 15KB
共 166 条
- 1
- 2
蓝兔兔
- 粉丝: 27
- 资源: 14
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0