这篇文章还可以在这里找到 英语
接上篇
编译并运行!它是否正常运作了呢?是的!太好了!
何去何从? Where to Go From Here?
恭喜你!你已经构建了属于你自己的物理引擎了!如果你一步一步的跟着教程走到了这里,你可以深呼吸并锤锤后背了。这是本本游戏最难的一部分,在第2部分中将会是一马平川!
这里是到目前为止的完整的工程。
在第2部分中, 你将会让你的英雄考拉跑和跳。同时在地面增加一些危险物,并处理胜利/失败的逻辑。
如果你想获取平台游戏更多的信息,以下是我收集的一些资源:
- 刺猬索尼克Wiki描述 索尼克是如何和实体tile碰撞的。
- 也许是目前最好的 平台游戏指南,高阶的。
- 游戏“N”的作者撰写的一篇 很棒的教程。
你可以在留言区留言以让我知道你的进度!
第1部分完结
Learn how to make a game like Super Mario!
这是一篇IOS教程组的成员 Jacob Gundersen发布的教程, 他是一位独立游戏开发者,经营着Indie Ambitions 博客。去看看他最新的app吧Factor Samurai!
欢迎回到我们的两部分教程 – 如何制作一款像超级玛丽的游戏!
在 第1部分中,你学会了如何制作一个简单的,基于tile的物理引擎,使用这个引擎,你可以控制你的英雄考里奥在他的世界里有所作为。
在第2部分同时也是最后一部分中,你将学到如何控制考里奥跑和跳,这部分很有趣哟!
你还将加入一些具有碰撞的危险的地刺,处理胜利和失败,并毫无例外的加入一些免费的音效和音乐。
第2部分和第一部分相比较而言,简单多了,也短多了,这可是在第1部分中艰苦努力的奖励哦!重拾你的代码,享受之后的过程吧!
移动考里奥 Moving Koalio Around
你将要实现的控制系统相当简单。只有前进和跳跃,很像 1-bit Ninja。如果你点击屏幕的左半边,考里奥会前进,如果点击屏幕的右半边,考里奥就跳跃。
你没有听错,考里奥不能往回移动!真正的考拉是不会从危险中后退的。
因为考里奥不是由GameLevelLayer,而是由玩家控制向前移动的,你需要在Player类中实时更新它向前的素素。在Player类中加入如下属性(不要忘记synthesize部分!):
在Player.h中:
@property (nonatomic, assign) BOOL forwardMarch;
@property (nonatomic, assign) BOOL mightAsWellJump; |
在Player.m中:
@synthesize forwardMarch = _forwardMarch, mightAsWellJump = _mightAsWellJump; |
现在在GameLevelLayer中加入如下处理触摸事件的代码:
- (void)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
for (UITouch *t in touches) {
CGPoint touchLocation = [self convertTouchToNodeSpace:t];
if (touchLocation.x > 240) {
player.mightAsWellJump = YES;
} else {
player.forwardMarch = YES;
}
}
}
- (void)ccTouchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
for (UITouch *t in touches) {
CGPoint touchLocation = [self convertTouchToNodeSpace:t];
//get previous touch and convert it to node space
CGPoint previousTouchLocation = [t previousLocationInView:[t view]];
CGSize screenSize = [[CCDirector sharedDirector] winSize];
previousTouchLocation = ccp(previousTouchLocation.x, screenSize.height - previousTouchLocation.y);
if (touchLocation.x > 240 && previousTouchLocation.x <= 240) {
player.forwardMarch = NO;
player.mightAsWellJump = YES;
} else if (previousTouchLocation.x > 240 && touchLocation.x <=240) {
player.forwardMarch = YES;
player.mightAsWellJump = NO;
}
}
}
- (void)ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
for (UITouch *t in touches) {
CGPoint touchLocation = [self convertTouchToNodeSpace:t];
if (touchLocation.x <240) {
player.forwardMarch = NO;
} else {
player.mightAsWellJump = NO;
}
}
} |
这些内容相当直接。如果玩家点击坐标的x值小于240(一半的屏幕),你就把player中的forwardMarch变量置为YES。否则(点击坐标的x值大于240)就把mightAsWellJump变量置为YES。
touchesMoved稍微有一点复杂,因为你只想在触摸点穿越屏幕中心时才切换那些boolean值,所以你不得不把previousTouch坐标也计算在内。除了这点之外,你仅仅需要检测触摸点划过的方向来相应的设置那些boolean值。最后,如果玩家停止触摸屏幕的任何一侧时,你需要把相应的boolean值置为NO。
为了能够相应触摸事件,还需要做一些工作。首先,在init中加入这行:
self.isTouchEnabled = YES; |
然后,你还需要在AppDelegate.m打开多点触摸(为了检测玩家同时发出跑和跳的指令)。在[director_ pushScene: [GameLevelLayer scene]];之前加入以下内容:
[glView setMultipleTouchEnabled:YES]; |
既然你把触摸点传递到了你的Player类中的一系列boolean变量中了,你便可以在update方法中加入一些代码,来让考里奥移动。首先先考虑前向移动,对Player.m中的update方法作如下修改:
-(void)update:(ccTime)dt {
CGPoint gravity = ccp(0.0, -450.0);
CGPoint gravityStep = ccpMult(gravity, dt);
CGPoint forwardMove = ccp(800.0, 0.0);
CGPoint forwardStep = ccpMult(forwardMove, dt); //1
self.velocity = ccpAdd(self.velocity, gravityStep);
self.velocity = ccp(self.velocity.x * 0.90, self.velocity.y); //2
if (self.forwardMarch) {
self.velocity = ccpAdd(self.velocity, forwardStep);
}
var cpro_id = "u6885494";
推荐阅读
-
生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ...
[详细]
蜡笔小新 2023-12-14 17:51:18
-
本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ...
[详细]
蜡笔小新 2023-12-14 16:35:39
-
-
本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ...
[详细]
蜡笔小新 2023-12-14 14:44:00
-
本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ...
[详细]
蜡笔小新 2023-12-14 14:37:52
-
本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ...
[详细]
蜡笔小新 2023-12-14 12:03:27
-
本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ...
[详细]
蜡笔小新 2023-12-14 11:49:51
-
本文介绍了使用C++的ofstream和ifstream类进行文件读写操作的方法,包括创建文件、写入文件和读取文件的过程。同时还介绍了如何判断文件是否成功打开和关闭文件的方法。通过本文的学习,读者可以了解如何在C++中进行文件读写操作。 ...
[详细]
蜡笔小新 2023-12-12 17:48:18
-
本文由编程笔记#小编整理,主要介绍了关于数论相关的知识,包括数论的算法和百度百科的链接。文章还介绍了欧几里得算法、辗转相除法、gcd、lcm和扩展欧几里得算法的使用方法。此外,文章还提到了数论在求解不定方程、模线性方程和乘法逆元方面的应用。摘要长度:184字。 ...
[详细]
蜡笔小新 2023-12-11 17:31:53
-
本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ...
[详细]
蜡笔小新 2023-12-14 20:58:32
-
在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ...
[详细]
蜡笔小新 2023-12-14 17:34:00
-
本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ...
[详细]
蜡笔小新 2023-12-14 15:52:52
-
篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ...
[详细]
蜡笔小新 2023-12-14 15:18:35
-
本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ...
[详细]
蜡笔小新 2023-12-14 14:15:30
-
本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ...
[详细]
蜡笔小新 2023-12-14 13:00:09
-
本文介绍了在CentOS上安装Python2.7.2的详细步骤,包括下载、解压、编译和安装等操作。同时提供了一些注意事项,以及测试安装是否成功的方法。 ...
[详细]
蜡笔小新 2023-12-12 13:54:31
-
|