文档章节

使用SpriteBuilder制作Cocos2D游戏完全中文教程(九)

wealpan
 wealpan
发布于 2014/03/04 11:08
字数 1216
阅读 1381
收藏 1

打磨我们的游戏(Polish Gameplay)

目前玩家只能发射一次,摄像头会跟着企鹅飞,但不会回滚到弹射器,接下来我们尝试完成这些功能。该规则将执行以下操作:如果一个企鹅从Level的左侧或右侧离开,或者如果它以非常慢的速度移动,我们将触发下一个(企鹅)尝试启动。

实现更新方法

在我们实际执行的更新方法之前我们在Gameplay.m添加一个常数定义,我们将用它来 检查是否有企鹅以很慢的最低速度来结束(移动):

static const float MIN_SPEED = 5.f;

该值为'5'能在我们的物理环境中良好的工作。如果您更改了对象的物理属性,你可能想试验一下这个值。现在我们可以实现update方法。此方法由cocos2d的每一帧自动调用:

- (void)update:(CCTime)delta
{
    // if speed is below minimum speed, assume this attempt is over
    if (ccpLength(_currentPenguin.physicsBody.velocity) < MIN_SPEED){
        [self nextAttempt];
        return;
    }
    int xMin = _currentPenguin.boundingBox.origin.x;
    if (xMin < self.boundingBox.origin.x) {
        [self nextAttempt];
        return;
    }
    int xMax = xMin + _currentPenguin.boundingBox.size.width;
    if (xMax > (self.boundingBox.origin.x + self.boundingBox.size.width)) {
        [self nextAttempt];
        return;
    }
}

首先当这可能看起来有点复杂的时候,这其实只是数学的一点点。我们将检查速度是否低于我们定义的限制。因此,我们使用ccpLength函数计算平方长度我们的点(基本上在x和速度相结合的y分量)。再者,我们检查企鹅是否已经出了Level的左或右边界,如果出界,则立即调用nextAttempt方法并立即返回(以避免nextAttempt被多次调用)。

实现nextAttempt方法

我们需要做的最重要的事情是在nextAttempt方法中滚动回弹射器。然而,因为我们已经在运行一个动作跟随企鹅,我们需要在启动另一个滚动的动作之前停止这个动作(否则cocos2d会混淆这两个相互矛盾的指示)。

Cocos2D中提供了一个可被任何的CCNode调用的名为stopAction方法。然而,我们需要一个引用(变量)来停止动作。所以,第一步应该创建一个新的成员变量:

@implementation Gameplay {
    ...
    CCAction *_followPenguin;
}

然后修改releaseCatapult的代码将滚动动作分配给这个新创建的变量:

// follow the flying penguin
_followPenguin = [CCActionFollow actionWithTarget:_currentPenguin worldBoundary:self.boundingBox];
[_contentNode runAction:_followPenguin];

现在,我们已经准备好实现nextAttempt方法!将此方法添加到Gameplay.m

- (void)nextAttempt 
{
    _currentPenguin = nil;
    [_contentNode stopAction:_followPenguin];
    CCActionMoveTo *actionMoveTo = [CCActionMoveTo actionWithDuration:1.f position:ccp(0, 0)];
    [_contentNode runAction:actionMoveTo];
}

首先,我们重置_currentPenguin引用,因为一旦尝试完成后,我们认为当前没有企鹅。然后我们停止滚动动作。最后,我们创建一个新的动作往回滚动到弹射器。

现在我们几乎已经完成了,你应该已经能够使用测试功能了。运行你的游戏,并确认一切都如预期。

更多的只是一个优化

你可能已经意识到,当前存在一个需要解决的潜在问题:假设玩家拉回弹射器非常慢,那么下一个尝试可以会在当前企鹅发射之前被触发。

为了避免这种情况发生,我们将为企鹅添加一个标志来存储它是否已经被发射。打开Penguin.h并添加这个属性:

@property (nonatomic, assign) BOOL launched;

要在Gameplay.m访问这个新的属性我们需要加入这一行到文件的顶部来导入企鹅头:

#import "Penguin.h"

并改变成员变量_currentPenguin企鹅类型代替CCNode

Penguin *_currentPenguin;

现在,您还必须更改在touchBegan方法那里的企鹅的加载,因为CCBReader只返回CCNodes,所以这里需要进行类型转换:

_currentPenguin = (Penguin*)[CCBReader load:@"Penguin"];

现在我们已经接收了发射企鹅的属性,我们可以添加一个检查到更新方法中,使得在企鹅已经发射的情况下才执行:

- (void)update:(CCTime)delta
{
    if (_currentPenguin.launched) {
    ... // <- all previous content of this method belongs inside of this if-statement
    }
}

现在,所有的检查只会在企鹅发射后进行。

作为最后一步,我们需要在企鹅被发射后设置launched标志为TRUE。因此,在releaseCatapult方法中添加以下代码:

_currentPenguin.launched = TRUE;

这样我们的优化就完成了!!

原文:

https://www.makegameswith.us/tutorials/getting-started-with-spritebuilder/improve-gameplay/

此致,我们的教程也全部讲完了。希望大家在学习的时候多多交流与分享!转载请说明出处,wealpan将和您一起学习Spritebuilder,一起学习cocos2D!谢谢大家!


© 著作权归作者所有

wealpan
粉丝 22
博文 11
码字总数 16085
作品 0
广州
程序员
私信 提问
Level加载机制的问题

@wealpan 你好,想跟你请教个问题: 在“使用SpriteBuilder制作Cocos2D游戏完全中文教程(五)”中, CCScene *level = [CCBReader loadAsScene:@"Levels/Level1"]; [_levelNode addChild:le......

大漠苍狼_xj
2014/11/18
227
0
使用SpriteBuilder制作Cocos2D游戏完全中文教程(一)

简介与入门教程 SpriteBuilder的前身是大名鼎鼎的cocosBuilder,是cocos2d下进行精灵,层,场景布局的简单快速的可视化的开发工具。SpriteBuilder在继承了cocosBuilder后,提供了更多的新特性...

wealpan
2014/03/02
0
3
使用SpriteBuilder制作Cocos2D游戏完全中文教程(八)

使用SpriteBuilder创建精灵动画(Create sprite animations with SpriteBuilder) 在前面的章节中你已经学习了如何使用SpriteBuilder的时间轴功能创建动画了。接下来,你将学习如何为一个精灵(...

wealpan
2014/03/04
0
0
使用SpriteBuilder制作Cocos2D游戏完全中文教程(二)

Spritebuilder的用户界面 在我们创建我们的游戏之前,让我们来看看SpriteBuilder的用户界面。乍一看,SpriteBuilder的UI感觉很熟悉 - 它使用了Xcode中的故事板中的许多概念。 该界面分为4个主...

wealpan
2014/03/02
0
1
使用SpriteBuilder制作Cocos2D游戏完全中文教程(七)

使用SpriteBuilder添加粒子特效(Add Particle Effects using SpriteBuilder) SpriteBuilder集成了一个很强大的粒子特效设计器,我们将用他来定义我们的第一个粒子效果的风格。现在,当我们的...

wealpan
2014/03/03
0
1

没有更多内容

加载失败,请刷新页面

加载更多

优雅的关闭Spring Boot

优雅的关闭Spring Boot 1、实现 TomcatConnectorCustomizer 接口拿到Tomcat的连接获取 Tomcat连接池 2、实现 ApplicationListener<ContextClosedEvent> 监听服务器关闭事件,注册JVM钩子函数...

sowhat
今天
2
0
Python3-Web开发

简介 Web开发框架 什么是Web框架? Web应用程序框架或简单的Web框架表示一组库和模块,使Web应用程序开发人员能够编写应用程序,而不必担心协议,线程管理等低级细节。 virtualenv是一个虚拟...

wuxinshui
今天
3
0
使用技媒体实践编写发布博客

技媒体实践博客 CSDN OSChina 知乎 简书 思否 掘金 51CTO

晨猫
今天
2
0
Lucene

1、什么是全文检索 数据分类 我们生活中的数据总体分为两种:结构化数据和非结构化数据。 结构化数据:指具有固定格式或有限长度的数据,如数据库,元数据等。 非结构化数据:指不定长或无固...

榴莲黑芝麻糊
昨天
5
0
python到setuptools、pip工具的安装

python安装 基础开发库   apt-get install gcc  apt-get install openssl libssl-dev 安装数据库和开发库   apt-get install mysql-server libmysqld-dev python环境   下载地址...

问题终结者
昨天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部