- 浏览: 1117607 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (349)
- javascript (28)
- objective-c&cocos2d (46)
- 开发备忘及常用java代码 (46)
- core java7学习笔记 (13)
- Mina (7)
- HTML5 (13)
- 系统集成项目管理工程师学习笔记 (10)
- 数据库系统原理学习笔记 (11)
- C++学习笔记 (10)
- C语言学习笔记 (5)
- 数据结构学习笔记 (4)
- 计算机网络原理学习笔记 (3)
- 计算机组成原理学习笔记 (2)
- 软件工程学习笔记 (6)
- 开发工具 (15)
- OSGI学习 (1)
- 学习笔记 (19)
- oracle (3)
- java tv (1)
- web server (5)
- javafx (1)
- 随笔 (8)
- 梦舞集 (4)
- 工作流 (3)
- 程序错误记录 (6)
- Windows (2)
- Linux (4)
- Git (1)
- 企业管理 (2)
- android (1)
- JVM (17)
- box2dweb (1)
- 操作系统学习笔记 (6)
- 英语学习 (1)
- Windows 8 应用商店 (1)
- Go语言 (1)
- docker (1)
- visualVM源码学习 (0)
- MariaDB (0)
- JAVA7 (2)
- 面向对象存储 (0)
- Hibernate (14)
- Spring (3)
- 项目构建 (0)
- 读源码学JAVA (0)
- mybatis (1)
- spring mvc (2)
- Javassist (0)
最新评论
-
白天看黑夜:
Apache Mina Server 2.0 中文参考手册(带 ...
Mina学习笔记二_基础 -
yjph83:
兄弟,你这个解决方案是什么什么啊?我现在遇到个问题跟你类似的! ...
Tomcat 8.0.11 移动端访问报400错误问题 -
comedsh:
你好,我也想为开源的做点事情,想让 tomcat-redis- ...
利用tomcat-redis-session-manager做session同步时自定义类对象属性保存不上的解决方法 -
bsr1983:
这个应该是浏览器内部设置的,你可以在Android上试一下别的 ...
javascript学习笔记八 -
787250527:
bsr1983 写道该值是浏览器内部的一个变量,只读的,不可修 ...
javascript学习笔记八
第7章 滚屏射击游戏(上)
7.1 高级视差滚屏
7.1.1 将背景创建为底纹
将背景条纹分成单独的文件保存并不只是为了保持正确的Z轴次序,这么做还可以节省空间。
将背景条纹分成单独的文件保存还有助于保持高帧率。iOS设备的填充能力(每一帧可以画的像素个数)非常有限。由于图像经常会互相覆盖,iOS设备不得不在同一帧多次绘制相同的像素。最极端的情况是一幅全屏图像覆盖在另一幅全屏图像上,虽然你只看到其中一幅,但设备将会绘制两幅,这在技术上叫做overdraw。将背景分为独立的条纹可以减少覆盖部分,从而减少绘画的像素点数量,以提高帧率。
7.1.2 在代码中重建背景
因为所有的图像都已经保存在一个全屏图像中,Zwoptex会记住这些图像的的偏移值。你唯一要做的就是将这些图像放在画布中它们各自的中心位置上,然后它们就会在正确的位置上。
提示:
由于Zwoptex保存了图像的偏移值,因此在cocos2d中重建背景会非常简单。对于创建游戏界面布局来说,这也是一个非常棒的方式。可以将界面上不同的UI元素设计为独立的层。然后将每一层作为独立的包含透明信息的全屏文件单独输出,并根据输出的文件生成一个纹理相册。这样一来,不必费心对各个图层进行定位就能轻松实现最初的设计,也不会造成内存浪费。
7.1.3 移动ParallaxBackground
7.14 视差滚动的速度因素
关于CCArray和iPhone SDK中所有容器的关键问题:它们只能存储对象,不能存储整数或浮点数之类的数值。解决这个问题的方法是将数值封装到NSNumber对象中。
7.15 实现背景的无限滚动
在每一个条纹的游标将该条纹重复一遍,这样一来,背景条纹的宽度变为原来的两倍,可以满足无限滚屏的需求。
我们仅仅需要检查条纹的横坐标,判断它是否小于负的屏幕的宽度。如果是,就加上屏幕宽度的两倍。这样就使原来在屏幕左边的条纹移动到了屏幕右边,正好在屏幕右边,正好在屏幕外面。通过对两个精灵不断重复这个动作,就有了无限滚动的效果。
7.1.6 取消闪烁
如果仔细观察,可能会注意到在条纹的接缝处,会不时地有垂直的黑线出现。出现黑线的原因是四舍五入有误差,因此不时地会出现宽度为1像素的黑色线条。
最简单的解决方法是让左右两个条纹间有1个像素发生重叠。
7.1.7 重复贴图
你可以在指定大小的矩形区域里让任意纹理重复出现。
这里用到了OpenGL支持的GL_REPEAT纹理参数。但它只对边长为2的方幂的正方形区域有效,就像32*32或128*128那样的区域。
7.2 虚拟手柄
不同于传统的移动游戏设备,iOS设备上没有按钮、十字按钮,更没有手柄,所有的输入操作都使用触控屏接收。
7.2.1 引入SneakyInput
在编写任意一个看起来十分普通的程序之前,总是应该先搜索一下是否存在可以直接使用的解决方案,而不要花大量时间去自己写。
SneakyInput的源代码保存在github上,这是一个公开的代码管理网站,地址如下:http://github.com/sneakyness/SneakyInput。
7.2.2 集成SneakyInput
下面5个类是SneakyInput的核心:
1)SneakyButton和 SneakyButtonSkinnedBase
2)SneakyJoystick和SneakJoystickSkinnedBase
3)ColoredCircleSprite
7.2.3 触摸按钮产生射击
7.2.4 为按钮添加皮肤
计算机图形学中的皮肤是指给一个普通的对象添加一个纹理或是一个不同的外观。
7.2.5 控制动作
7.2.5 数字控制
如果虚拟手柄不适合你的游戏怎么办?你可以把SneakyJoystick类变成一个数字控制器,就像D-pad一样。
joystick.isDPad=YES;
joystick.numberOfDirections=8;
将isDPad属性设为YES,于是摇杆就成了数字控制器。D-pads有4个方向键,在许多游戏中,你可以同时按住两个方向键,这样就能让较色沿着对角线方向移动。为了得到这样的效果,可将numberOfDirectors属性设置为8。SneakyJoystick自动确保这些方向被均衡地分配到拇指控制器中。
7.2.6 另一个选择
GPJoystick是一个商业软件。网址:http://wrensation.com/?p=36
7.4 本章小结
第8章 滚屏设计游戏(下)
8.1 添加BulletCache类
注意:
虽然添加一个像BulletCache这样的CCNode会增加场景层次体系的深度,但这样的变化不会造成太大的影响。如果你很介意场景层次体系的继承深度,一个替代的方案是像往常那样在GameScene类中添加精灵节点,然后在BulletCache类中使用存取器方法得到精灵节点。不过这样会导致额外的函数调用,可能对性能产生影响。我的原则是:首先应该保持代码良好的可读性,然后只在必要时才进行重构来提高性能。
8.2 关于敌人
对于程序设计,并没有一种所谓的最好的方法。我们所做的选择都完全处于主观喜好和个人经验。如果你愿意在对所制作的游戏有更深入的理解之后再重构代码,那么在移开时,一份可以工作的代码会比一份简洁、完美的代码更值得推崇。
8.3 Entity类的继承体系
8.3.1 EnemyEntity
只要不忘记调用[super init...]这个方法,我们就可以在数值赋给self之前运行一下代码,不然的话,super类无法初始化,将会出现奇怪的错误和导致崩溃。
在Objective-C中,你向nil对象发送任何消息都没有问题,因为它们都将被忽略掉。
8.3.2 EnemyCache类
8.3.3 组件类
组件类是用来扩展游戏逻辑的插件。如果给一个实体添加了一个组件,那么这个实体就会执行组件的逻辑行为:移动、开火、动画、显示生命条,等等。
8.4 射击开火
8.5 大怪物的生命条
大怪物不可能是一个很简单、可以被一下就消灭的敌人。所以我们需要一个生命条来给玩家反馈一些信息:即大怪物每被击中一次,它的生命条就会缩短。
8.6 本章小结
7.1 高级视差滚屏
7.1.1 将背景创建为底纹
将背景条纹分成单独的文件保存并不只是为了保持正确的Z轴次序,这么做还可以节省空间。
将背景条纹分成单独的文件保存还有助于保持高帧率。iOS设备的填充能力(每一帧可以画的像素个数)非常有限。由于图像经常会互相覆盖,iOS设备不得不在同一帧多次绘制相同的像素。最极端的情况是一幅全屏图像覆盖在另一幅全屏图像上,虽然你只看到其中一幅,但设备将会绘制两幅,这在技术上叫做overdraw。将背景分为独立的条纹可以减少覆盖部分,从而减少绘画的像素点数量,以提高帧率。
7.1.2 在代码中重建背景
因为所有的图像都已经保存在一个全屏图像中,Zwoptex会记住这些图像的的偏移值。你唯一要做的就是将这些图像放在画布中它们各自的中心位置上,然后它们就会在正确的位置上。
提示:
由于Zwoptex保存了图像的偏移值,因此在cocos2d中重建背景会非常简单。对于创建游戏界面布局来说,这也是一个非常棒的方式。可以将界面上不同的UI元素设计为独立的层。然后将每一层作为独立的包含透明信息的全屏文件单独输出,并根据输出的文件生成一个纹理相册。这样一来,不必费心对各个图层进行定位就能轻松实现最初的设计,也不会造成内存浪费。
7.1.3 移动ParallaxBackground
7.14 视差滚动的速度因素
关于CCArray和iPhone SDK中所有容器的关键问题:它们只能存储对象,不能存储整数或浮点数之类的数值。解决这个问题的方法是将数值封装到NSNumber对象中。
7.15 实现背景的无限滚动
在每一个条纹的游标将该条纹重复一遍,这样一来,背景条纹的宽度变为原来的两倍,可以满足无限滚屏的需求。
我们仅仅需要检查条纹的横坐标,判断它是否小于负的屏幕的宽度。如果是,就加上屏幕宽度的两倍。这样就使原来在屏幕左边的条纹移动到了屏幕右边,正好在屏幕右边,正好在屏幕外面。通过对两个精灵不断重复这个动作,就有了无限滚动的效果。
7.1.6 取消闪烁
如果仔细观察,可能会注意到在条纹的接缝处,会不时地有垂直的黑线出现。出现黑线的原因是四舍五入有误差,因此不时地会出现宽度为1像素的黑色线条。
最简单的解决方法是让左右两个条纹间有1个像素发生重叠。
7.1.7 重复贴图
你可以在指定大小的矩形区域里让任意纹理重复出现。
这里用到了OpenGL支持的GL_REPEAT纹理参数。但它只对边长为2的方幂的正方形区域有效,就像32*32或128*128那样的区域。
7.2 虚拟手柄
不同于传统的移动游戏设备,iOS设备上没有按钮、十字按钮,更没有手柄,所有的输入操作都使用触控屏接收。
7.2.1 引入SneakyInput
在编写任意一个看起来十分普通的程序之前,总是应该先搜索一下是否存在可以直接使用的解决方案,而不要花大量时间去自己写。
SneakyInput的源代码保存在github上,这是一个公开的代码管理网站,地址如下:http://github.com/sneakyness/SneakyInput。
7.2.2 集成SneakyInput
下面5个类是SneakyInput的核心:
1)SneakyButton和 SneakyButtonSkinnedBase
2)SneakyJoystick和SneakJoystickSkinnedBase
3)ColoredCircleSprite
7.2.3 触摸按钮产生射击
7.2.4 为按钮添加皮肤
计算机图形学中的皮肤是指给一个普通的对象添加一个纹理或是一个不同的外观。
7.2.5 控制动作
7.2.5 数字控制
如果虚拟手柄不适合你的游戏怎么办?你可以把SneakyJoystick类变成一个数字控制器,就像D-pad一样。
joystick.isDPad=YES;
joystick.numberOfDirections=8;
将isDPad属性设为YES,于是摇杆就成了数字控制器。D-pads有4个方向键,在许多游戏中,你可以同时按住两个方向键,这样就能让较色沿着对角线方向移动。为了得到这样的效果,可将numberOfDirectors属性设置为8。SneakyJoystick自动确保这些方向被均衡地分配到拇指控制器中。
7.2.6 另一个选择
GPJoystick是一个商业软件。网址:http://wrensation.com/?p=36
7.4 本章小结
第8章 滚屏设计游戏(下)
8.1 添加BulletCache类
注意:
虽然添加一个像BulletCache这样的CCNode会增加场景层次体系的深度,但这样的变化不会造成太大的影响。如果你很介意场景层次体系的继承深度,一个替代的方案是像往常那样在GameScene类中添加精灵节点,然后在BulletCache类中使用存取器方法得到精灵节点。不过这样会导致额外的函数调用,可能对性能产生影响。我的原则是:首先应该保持代码良好的可读性,然后只在必要时才进行重构来提高性能。
8.2 关于敌人
对于程序设计,并没有一种所谓的最好的方法。我们所做的选择都完全处于主观喜好和个人经验。如果你愿意在对所制作的游戏有更深入的理解之后再重构代码,那么在移开时,一份可以工作的代码会比一份简洁、完美的代码更值得推崇。
8.3 Entity类的继承体系
8.3.1 EnemyEntity
只要不忘记调用[super init...]这个方法,我们就可以在数值赋给self之前运行一下代码,不然的话,super类无法初始化,将会出现奇怪的错误和导致崩溃。
在Objective-C中,你向nil对象发送任何消息都没有问题,因为它们都将被忽略掉。
8.3.2 EnemyCache类
8.3.3 组件类
组件类是用来扩展游戏逻辑的插件。如果给一个实体添加了一个组件,那么这个实体就会执行组件的逻辑行为:移动、开火、动画、显示生命条,等等。
8.4 射击开火
8.5 大怪物的生命条
大怪物不可能是一个很简单、可以被一下就消灭的敌人。所以我们需要一个生命条来给玩家反馈一些信息:即大怪物每被击中一次,它的生命条就会缩短。
8.6 本章小结
发表评论
-
[转]解决 Xcode 删除文件后 missing file 警告
2014-03-19 18:19 1129转自:http://www.oschina.net/ques ... -
CocoStudio简介
2014-03-05 19:19 1412一、概述 1.1.功能简介 CocoS ... -
xcode5预览版下载地址
2013-06-16 09:56 22211.xcode5预览版下载地址 http://adcdo ... -
解决提交应用到AppStore时,提示UUID及UIDevice错误
2013-06-04 03:34 22621.如果使用了Admob,更新到最新版本6.4.2,删除Add ... -
解决Could not instantiate class named NSLayoutConstraint
2013-02-17 10:22 1422点击xib或storyboard文件,在右边的 inspect ... -
objective-c的arc项目中使用不支持arc的依赖库时编译错误的解决
2013-02-06 14:04 1166在Target->build phases->Co ... -
xcode4.6下载地址
2013-02-04 12:08 3092http://adcdownload.apple.com/De ... -
Mac上的DMG与ISO互转
2013-01-14 14:59 11661.把DMG转为ISO hdiutil convert /p ... -
设置ios中DatePicker的日期为中文格式
2012-12-18 18:12 72451.在模拟器中的“设置”-“通用”-“多语言环境”-“语言”设 ... -
Xcode 错误- Could not launch app - No such file or directory Error.
2012-12-14 11:50 1848通常发生在联机调试过程中,新旧工程交替测试 解决方 ... -
UIPickerView控件中自定义显示的字体大小及样式
2012-12-14 00:21 17784通过覆盖如下方法实现 - (UIView *)pickerV ... -
Flurry analytics SDK集成步骤及功能简介
2012-12-13 11:48 15388Flurry analytics SDK集成步骤及功能 ... -
Xcode4中显示“Line Numbers”行号
2012-12-11 10:46 1123Xcode4中显示“Line Numbers”行号 1 ... -
ios代码备忘
2012-12-09 00:23 14511.自定义导航栏返回按钮 self.navigationIt ... -
iOS OpenSource Library Collection
2012-12-07 17:45 1347转自:http://www.cppblog.com/inkcp ... -
ios内置付费IAP校验
2012-12-07 15:50 1582参考链接:http://developer.apple.com ... -
ios应用中集成多盟广告墙
2012-12-06 16:59 35491.下载广告墙SDK最新版 ... -
ios 导航栏、工具栏、tab栏图标大小
2012-12-06 16:50 11286工具栏和导航栏上的图标尺寸应如下所示: 对于iPhoe和iP ... -
【转】Google Admob 广告最佳做法
2012-11-13 15:40 6572转自:https://developers.google.co ... -
【转】Google AdMob 广告 iOS 初级指南
2012-11-13 15:37 1527转自:https://developers.google.co ...
相关推荐
在本教程中,我们将深入探讨如何使用Cocos2d 2.x引擎开发一款多向滚屏射击游戏。Cocos2d 2.x是一款强大的2D游戏开发框架,它提供了丰富的功能,包括图形渲染、动画系统、物理引擎以及事件处理等,使得游戏开发者能够...
第七章《横向滚屏射击游戏》是一个具体的案例研究,展示了如何利用cocos2d创建一个典型的横版射击游戏,包括滚动背景、子弹发射、敌机AI等内容。 第九章《粒子效果》介绍了cocos2d的粒子系统,用于创建各种视觉特效...
第1章-介绍cocos2d 第2章-开始学习 第3章-基础知识 第4章-你的第一个游戏 第4章-你的第一个游戏(修正错误) 第5章-游戏构成要素 第6章-深入了解精灵(Sprite) 第7章-横向滚屏射击游戏 第8章-完成滚屏射击游戏-1 第9章-...
第7章和第8章则聚焦于一个完整游戏案例的制作,具体到一个横向滚屏射击游戏的开发。开发者将学习如何将前面章节学到的知识整合起来,通过实例展示一个游戏从无到有的完整开发流程。 第9章介绍粒子效果,这是增加...
第七章: 横向滚屏射击游戏 第八章: 完成滚屏射击游戏 第九章: 粒子效果 第十章: 瓷砖地图(Tilemap)基础知识 第十一章: 45度角瓷砖地图(Isometric_Tilemaps) 第十二章: 物理引擎 第十三章: 弹球游戏
01 介绍cocos2d 02 开始学习 03 基础知识 04 你的第一个游戏 05 游戏构成要素 06 深入了解精灵 07 横向滚屏射击游戏 08 完成滚屏射击游戏 09 粒子效果 10 瓷砖地图基础知识 11 45度角瓷砖地图 12 物理引擎 13 弹球...
第1章 介绍cocos2d 第2章 开始学习 第3章 基础知识 第4章 你的第一个游戏 第5章 游戏构成要素 第6章 深入了解精灵 第7章 横向滚屏射击游戏 第8章 完成滚屏射击游戏 第9章 粒子效果 第10章 瓷砖地图 第11章 45度角...
第1章-介绍cocos2d.pdf 第2章-开始学习.pdf 第3章-基础知识.pdf 第4章-你的第一个游戏.pdf 第5章-游戏构成要素.pdf 第6章-深入了解精灵(Sprite).pdf 第7章-横向滚屏射击游戏.pdf 第8章-完成滚屏射击游戏.pdf 第9章-...
第7章“横向滚屏射击游戏”通过一个具体的示例,展示了如何利用Cocos2D实现滚动背景和动态游戏行为,这对于制作动作类游戏尤其重要。 第10章“瓷砖地图(Tilemap)基础知识”涵盖了Cocos2D中的地图系统,讲解了如何...
第7章《横向滚屏射击游戏》展示了如何构建一个完整的滚动游戏场景,这涉及到了场景管理、动态物体的移动以及用户输入响应等技术。开发者可以通过此章学习到如何实现动态的游戏世界。 第9章《粒子效果》介绍了Cocos...
第8章——“完成滚屏射击游戏”,在上一章的基础上,进一步完善游戏功能。这可能包括增加更多的敌人类型、设计复杂的游戏逻辑、优化性能,以及添加得分系统和游戏结束条件。这一章将教你如何通过cocos2d的事件处理...
最后,第7章《横向滚屏射击游戏》是一个进阶示例,它涵盖了更复杂的游戏设计和实现技巧,如滚动背景、敌人生成和射击机制等。这将帮助你将前面所学的知识应用到实践中,构建一个完整的、有挑战性的游戏。 通过这七...
第7章——“横向滚屏射击游戏”则提供了一个实际项目案例,演示如何利用Cocos2d构建一个典型的横版滚动射击游戏。此章节可能涵盖了游戏场景的管理、子弹发射机制、敌机行为逻辑以及背景滚动效果的实现。通过这个实例...
第7章-横向滚屏射击游戏:这一章会讲解如何创建一个滚动背景的游戏,包括实现滚动效果、子弹发射和敌人AI设计等。这涉及到空间管理、游戏循环和碰撞检测等复杂机制。 第9章-粒子效果:粒子系统是游戏开发中常用的...
第1章-介绍cocos2d 第2章-开始学习 第3章-基础知识 第4章-你的第一个游戏(修正错误) 第5章-游戏构成要素 第6章-深入了解精灵 第7章-横向滚屏射击游戏 第8章-完成滚屏射击游戏 第9章-粒子效果 第10章-瓷砖地图 第11章...
本教程涵盖了一系列章节,包括横向滚屏射击游戏、瓷砖地图、45度角地图、粒子效果、物理引擎以及弹球游戏的实现,旨在帮助开发者提升Cocos2D游戏开发的专业技能。 首先,我们来到第7章——“横向滚屏射击游戏”。这...