SimpleCG小游戏开发系列(4)--见缝插针

本文介绍了如何利用旋转公式和SimpleCG库开发一款见缝插针游戏,通过计算旋转点实现针的旋转效果,包含关键逻辑算法和游戏代码示例。
摘要由CSDN通过智能技术生成

 一、前言

        网上有个很流行的手机小游戏--见缝插针,它是一个不断往旋转的圆球插针的游戏,游戏规则就是不要碰到前面已经插上的针,插的针越多分数越高。

        在前面文章中我们介绍了旋转函数,可以用来旋转绘制的所有对象。我们似乎可以利用该函数制作此游戏。不过在这里,我们通过这个小游戏的制作来介绍另外一种旋转图形的方法,利用旋转公式来计算旋转点。

二、关键逻辑算法

        想写一个见缝插针的游戏,最重要的是了解旋转公式,有了旋转公式就可以绘制旋转的图形,也就可以显示旋转的针效果了。一般来说,绕中心点旋转一个几何体,可以用以下公式表达:(x, y) = (xcosθ-ysinθ, xsinθ+ycosθ),但是我们可以直接以0度角开始简化公式为(x,y)=(r*cosθ,r*sinθ),同时加上坐标平移,以及考虑到SimpleCG沿用的windows窗口坐标系统,y轴朝下。 所以假设旋转中心坐标(C_CENTER_X,C_CENTER_Y),那么假设初始角度0度点坐标(r,0),顺时针旋转fAngle后,最终坐标为(C_CENTER_X + r * cos(fAngle),C_CENTER_Y + r * sin(fAngle))。

三、关键游戏代码


#include "Needle.h"
#include "math.h"

#define C_CENTER_X				300
#define C_CENTER_Y				250
#define C_GAMEOVER_RANK			0.015

enum ENUM_GAMESTATE
{
	  enumGS_RUNNING,
	  enumGS_GAMEOVER
};
float	g_fCurAngle = 0;					//当前角度
float	g_fNeedleAngle[1024]	= {0.0f};
int		g_nNeedle				= 0;
int		g_nameState				= enumGS_RUNNING;
int		g_nScore				= 0;
float	g_fSpeed				= 0.005;
//初始化
bool Init(  )
{
	setfillcolor(0x555555);
	settextcolor(0xFFFFFF);
	g_nNeedle				= 0;
	g_nameState				= enumGS_RUNNING;
	g_nScore				= 0;
	g_fSpeed				= 0.005;
	return true;
}
//释放
void Release()
{
}
//绘制游戏
void DrawGame()
{
	int i=0;
	float fAngle = 0.0f;
	ClearDevice();
	fillcircle( C_CENTER_X, C_CENTER_Y, 105 );
	for(i=0; i<g_nNeedle; ++i)
	{
		fAngle = g_fNeedleAngle[i] + g_fCurAngle;
		line(C_CENTER_X + 200 * cos(fAngle)+0.5,C_CENTER_Y + 200 * sin(fAngle)+0.5,C_CENTER_X + 100 * cos(fAngle)+0.5,C_CENTER_Y + 101 * sin(fAngle)+0.5);
		fillcircle( C_CENTER_X + 200 * cos(fAngle),C_CENTER_Y + 200 * sin(fAngle), 5 );
	}
	
	line(C_CENTER_X,C_CENTER_Y + 250,C_CENTER_X,C_CENTER_Y + 350);
	fillcircle( C_CENTER_X,C_CENTER_Y + 350, 5 );

	setbackmode(0);
	printfRectEx( C_CENTER_X-50, C_CENTER_Y-50,100, 100,SCG_TEXT_MIDDLE,_T("%d"), g_nNeedle);

	if(g_nameState == enumGS_GAMEOVER)
		printfRectEx( C_CENTER_X-50, C_CENTER_Y-100,100, 100,SCG_TEXT_MIDDLE,_T("GAME OVER"));
}
//更新游戏状态
void UpdateGameState( UINT nElapse )        
{  
	if(g_nameState == enumGS_GAMEOVER )
		return;
	g_fCurAngle += g_fSpeed * (g_nNeedle / 20+1);
	if(g_fCurAngle>2*C_PI)
		g_fCurAngle  -= 2*C_PI;
}
//发射
void Shoot( )
{
	if(g_nameState == enumGS_GAMEOVER )
	{
		Init();
		return;
	}
	int i=0;
	float fShootangle = 0.5*C_PI-g_fCurAngle;
	if(fShootangle<0)
		fShootangle += 2*C_PI;
	for(i=0; i<g_nNeedle; ++i)
	{
		if(g_fNeedleAngle[i] - C_GAMEOVER_RANK <= fShootangle && g_fNeedleAngle[i]+C_GAMEOVER_RANK>=fShootangle )
		{
			g_nameState	= enumGS_GAMEOVER;
			return;
		}
	}
	g_fNeedleAngle[g_nNeedle++] = fShootangle;
}

四、源码及库下载

源码下载

编译此程序需安装SimpleCG库,安装方法如下: 

SimpleCG库安装方法

  • 8
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

b2b160

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值