gomoblie flappy 源码分析:游戏逻辑

本文主要讨论游戏规则逻辑,具体绘制技术请参看相关文章:

gomoblie flappy 源码分析:图片素材和大小的处理
http://www.cnblogs.com/ghj1976/p/5222289.html

绘制时间间隔控制

绘制是按照 60 FPS 的节奏绘制的(即每秒钟 60 帧),  FPS : frames per second(帧率)

代码中的控制注意是通过 golang.org/x/mobile/exp/sprite/clock 下的 Time 控制的。 

Time实际是 int32 的别名 
type Time int32
 
应用程序初始化好,可以开始绘图时 这个值初始化成 FPS 的时间间隔。

这里 now 计算的是到现在为止, 有多少个 1/60 秒(time for 60 FPS)。

然后在 game.update 中传入

只有满足 FPS 时才重新计算, 否则不重新计算。

g.lastCale 也是 clock.Time 类型。

至于 paint.Event 事件被调起的频率,请参考这篇文字: http://www.cnblogs.com/ghj1976/p/5230576.html 

简单来说,屏幕分辨率为60Hz, 那每秒钟 scan 60 次, 每次轮到时,就是下面的逻辑。

 

场景绘制

整个场景是绘制在 19*16 个地砖的区域,  地鼠是 2*2 地砖大小, 每个地砖是 16pt*16pt。 这样绘图区域就是 304pt*256pt 。

要能在手机上显示下完整高度, 屏幕的高度需要是  305pt/72*2.54  = 10.76 cm ,  宽度由于不足,可以显示部分,但是美观期间,不应该大于 256pt/72*2.54 = 9.03 cm ,否则会屏幕里有部分没有绘图。

注意, Android 设备的 pt 值,并不是精准的  1/72 英寸, 有关原因请看: http://www.cnblogs.com/ghj1976/p/5238193.html

 

整个绘制的逻辑如下图:

从上到下是逻辑顺序:

 

整个场景以 初始化速度为每 1/60 秒 1pt,每次增加 0.001 的速度在不断加速移动。

 

 

如下图, 每次 reset 游戏时, 卷轴速度为 1pt;

游戏没结束前, 每次加速 0.001,这样游戏卷轴越来越快, 难度越来越难。

每当卷轴距离超过一个瓷砖的长度, 触发产生新瓷砖的逻辑。

 

注意, g.scroll.x 这个值最大是一个瓷砖的长度, 再长就自动减去,见如下代码:

 

精灵的位置绘制

flappy 这个游戏有三类元素需要绘制,他们绘制的位置逻辑信息如下:

 

gopher 精灵的初始位置

gopher 的大小是 32pt*32pt ,  它的位置代码是在下面函数中定义的:

func (g *Game) Scene(eng sprite.Engine) *sprite.Node {

X轴坐标

gopher 的左上角点的x轴坐标是固定的:   2pt 的位置,计算公式如下:

tileWidth*(gopherTile-1) + tileWidth/8 

其中的参数说明如下:

  • gopherTile:  Gopher站在那块砖上,注意这是从0开始的索引,1代表第二块。  地鼠显示的位置,判断地鼠是否被撞死了、地鼠跳起来后在落地的位置等信息都依赖这个全局常量进行计算。
  • tileWidth : 每块地砖的宽度。

从上可知,地鼠站在第一块地砖的 1/8 处。

Y轴坐标:

绘地鼠图的y轴坐标计算公式为: g.gopher.y - tileHeight + tileHeight/4
 
  • g.gopher.y
游戏初始时,地鼠的 y 轴被定义在 0 这个位置。 func (g *Game) reset() {
g.gopher.y = 0
  • tileHeight    地砖的高度。
地鼠站的位置需要减去地砖的 3/4 的高度,这样看起来地鼠是站在草上。
注意:减去 3/4 的地砖高度,只是绘制的时候绘效果用的, 跟计算精灵的高度无关。

 

精灵跳起相关

每当有触屏事件或者空格键按下时,触发精灵跳起。

当这个动作发生时,如果精灵在地面, 则起跳加速度为 –5 ,

如果精灵在飞起状态, 则 加速度为 -1.5(这个每次蹦起只能触发一次,蹦起时用过一次后  g.gopher.flapped = true, 在落地时 g.gopher.flapped = false) 。

注意,不按时,加速度立即变成 0 。

 

而每次计算精灵信息时, 则需要根据重力减少 加速度, 重力的值为 0.1 。

按照这个逻辑, 如果只按一次的话, 最高能蹦 5+4.9+4.8+…+0.2+0.1 = 127.5 pt 高。   如果最牛操作,在蹦到顶点时再次按下,会再蹦起 1.5+1.4+1.3+…+0.2+0.1=12 pt

是否落地的判断

注意:绘制时,会在精灵高度上减去 3/4 的地砖高度,只是绘制的时候绘效果用的, 跟计算精灵的高度无关。而且绘制时,不管是不是在地面,都会减去的。

 

精灵死亡的判断

精灵是否死亡,是在背景转换时判断的,而不是精灵自身跳起、落地时判断的。

每次需要新加一块地砖时,先做地砖增加逻辑,然后判断是否死亡。

死亡后,卷轴速度逐步降低到停止。

当精灵撞到高于地砖 1/3 高度时,触发死亡。
climbGrace = tileHeight / 3

精灵死亡的动画

每次完成判断死亡后, 精灵标志死亡,然后让精灵跳起做死亡动画,跳起速度是之前正常跳起速度的 1.5 倍。

精灵的跳起 y 轴变换逻辑跟之前一样,只是加速度变大。

显示时,显示死亡图片, 同时做死亡旋转动画。

具体的旋转动画, 先按照时间逐步放大,同时移动中心点,然后旋转,然后移动回之前坐标系。

 

从死亡开始, 4秒后 游戏 reset。

时间: 2025-01-02 03:31:22

gomoblie flappy 源码分析:游戏逻辑的相关文章

UC源码分析游戏保存及CheckPoint实现

CheckPoint是非常普遍的一种游戏进度保存机制 UC中在关卡的关键点放这样一个CheckPoint就能实现游戏进制保存了. UC保存游戏的数据玩家位置,旋转.弹药,枪.关卡时间 当触发CheckPoint的Overlap事件时,就会收集玩家身上的数据,并调用保存函数 UC保存的核心API就一个,当然这种方式也只能把数据保存在内存中 -----------转载请标明出处

传奇源码分析-客户端(游戏逻辑处理源分析四)

现在假设玩家开始操作游戏:传奇的客户端源代码工程WindHorn一.CWHApp派生CWHWindow和CWHDXGraphicWindow.二.CWHDefProcess派生出CloginProcess.CcharacterProcess.CgameProcess客户端WinMain调用CWHDXGraphicWindow g_xMainWnd;创建一个窗口.客户端CWHDXGraphicWindow在自己的Create函数中调用了CWHWindow的Create来创建窗口,然后再调用自己的C

传奇源码分析-客户端(游戏逻辑处理源分析五 服务器端响应)

器执行流程:(玩家走动) GameSrv服务器ProcessUserHuman线程处理玩家消息:遍历UserInfoList列表,依次调用每个UserInfo的Operate来处理命令队列中的所有操作; pUserInfo->Operate()调用m_pxPlayerObject->Operate()调用.判断玩家if (!m_fIsDead),如果已死,则发送_MSG_FAIL消息.我们在前面看到过,该消息是被优先处理的.否则则调用WalkTo,并发送_MSG_GOOD消息给客户端.Walk

传奇源码分析-客户端(游戏逻辑处理源分析三)

6. 接收怪物,商人,其它玩家的消息:ProcessUserHuman:(其它玩家-服务器处理)CPlayerObject->SearchViewRange();CPlayerObject->Operate();遍历UserInfoList列表,依次调用每个UserInfo的Operate来处理命令队列中的所有操作; pUserInfo->Operate()调用m_pxPlayerObject->Operate()调用.根据分发消息(RM_TURN)向客户端发送SM_TURN消息.

传奇源码分析-客户端(游戏逻辑处理源分析二)

5.接受登录成功后,接收GameSrv服务器发送的消息:接收GameGate发送的消息:CClientSocket::OnSocketMessage的FD_READ事件中,PacketQ.PushQ((BYTE*)pszPacket);把接收到的消息,压入PacketQ队列中.处理PacketQ队列数据是由CGameProcess::Load()时调用OnTimer在CGameProcess::OnTimer中处理的, 处理过程为:OnMessageReceive; ProcessPacket(

东麓庄园游戏开发系统源码分析

东麓庄园游戏开发系统源码分析 袁生:151.1222.4001(微信同步)东麓庄园游戏,东麓庄园模式,东麓庄园理财,东麓庄园软件,东麓庄园app,东麓庄园源码,东麓庄园农场,东麓庄园平台,东麓庄园开发,东麓庄园返利,东麓庄园定制开发. 注册和交易注册后最低投资66元,普通领导人帮下级玩家注册激活收66元,转660个金币,其中6元是平台管理费.到达下级会员账号600个金币.会员之间交易不收手续费,果实兑换成金币平台收取10%的手续费.东麓庄园源码开发 151.1222.4001(微信同步) 东麓庄

横屏小游戏--萝莉快跑源码分析三

主角出场: 初始化主角 hero = new GameObjHero(); hero->setScale(0.5); hero->setPosition(ccp(100,160)); hero->setVisible(false); addChild(hero,1); 进入GameObjHero类ccp文件 创建主角及动作 this->setContentSize(CCSizeMake(85,90)); //接收触摸事件 CCDirector* pDirector = CCDire

【雷电】源码分析(一)-- 进入游戏攻击

效果图: 程序分析: 初始化GameLayer场景触摸,背景.音乐.UI及定时间器 bool GameLayer::init() { if (!CCLayer::init()) { return false; } // 开启触摸 this->setTouchEnabled(true); // 创建数组,需要retain一下 play_bullet = CCArray::create(); play_bullet->retain(); enemy_bullet = CCArray::create

【雷电】源码分析(一)-- 进入游戏开始界面

转载请注明出处:http://blog.csdn.net/oyangyufu/article/details/24941949 进入游戏开始界面效果图: 源码分析: StartMenu场景--进入游戏开始界面 初始化场景,包括初始Android按键,添加背景图片,添加logo图片,创建游戏菜单开始/设置/关于并添加其响应事件, 初始化飞船漂移动画,背景音乐 程序分析: bool StartMenu::init() { if ( !CCLayer::init() ) { return false;