豪华版飞机大战系列(五)

在介绍了前面的几篇后,对于源代码会在下一篇中上传,须要源代码的能够在下一篇中看到下载链接,开源才是王道,分享才干成长。

这篇继续介绍下游戏中的子弹层的渲染。也就是BulletSprite的介绍。

对于子弹层的渲染有两种机制。一种是直接从缓存中进行精灵创建,创建后的精灵直接加入并使用,另外一种机制为将创建的精灵加入到SpriteBatchNode中,这样进行渲染效率更高。对于这样渲染的机制我在这里略微提一下,

普通的渲染机制为:准备,渲染,清除。准备,渲染,清除。...

批次渲染机制为:准备,渲染,渲染....渲染。清除

看以看到上面两种差别。批次渲染中仅仅进行一次准备一次清除,要节省好多硬件消耗,这是游戏优化的一个重要指标。

对与文件里的两种渲染机制我都进行了实现,终于执行时我用的还是批次渲染,能够考到终于的编译为BulletSprite2.cpp,而不是BulletSprite.cpp。

好啦,说了这么多。该上代码了。

看一下BulletSprite.h头文件的内容:

<span style="font-size:18px;"><strong>#include "cocos2d.h"
USING_NS_CC;

class BulletSprite : public cocos2d::Layer
{
public:
    BulletSprite();
	~BulletSprite();
    virtual bool init();
    CREATE_FUNC(BulletSprite);

	Animation* f_createAnimate(int count,int fps);//创建子弹执行的动画
	void removeBullet( Node* pNode );//移除超出屏幕可视范围的子弹或者碰撞后的子弹清除
	void ShootBullet(float dt);//发射子弹,在当中进行子弹的渲染和子弹的飞行动作

public:
	Vector <Sprite *>vecBullet;//子弹容器
	SpriteBatchNode* bulletBatchNode;//批次渲染节点
};</strong></span>

函数都有具体说明,不做过多解释,以下看BulletSprite2.cpp的内容:

<span style="font-size:18px;"><strong>#include "BulletSprite.h"
#include "PlaneLayer.h"
BulletSprite::BulletSprite() {
}
BulletSprite::~BulletSprite() {
}
bool BulletSprite::init() {
	bool bRet = false;
	do {
		CC_BREAK_IF(!Layer::init());
		Texture2D* texture = TextureCache::sharedTextureCache()->textureForKey("bullet.png");
		//创建BatchNode节点
		bulletBatchNode = SpriteBatchNode::createWithTexture(texture);
		this->addChild(bulletBatchNode);
		//每隔0.2S调用一次发射子弹函数
		this->schedule(schedule_selector(BulletSprite::ShootBullet),0.2f);
		bRet = true;
	} while (0);
	return bRet;
}
void BulletSprite::ShootBullet(float dt) {
	Size winSize = Director::getInstance()->getWinSize();
	auto PlanePos = PlaneLayer::sharedPlane->getChildByTag(AIRPLANE)->getPosition();
	//从缓存中创建子弹
	auto spritebullet = Sprite::createWithSpriteFrameName("bullet_1.png");
	//将创建好的子弹加入到BatchNode中进行批次渲染
	bulletBatchNode->addChild(spritebullet);
	//将创建好的子弹加入到容器
	vecBullet.pushBack(spritebullet);
	Point bulletPos = (Point(PlanePos.x,
					PlanePos.y
							+ PlaneLayer::sharedPlane->getChildByTag(AIRPLANE)->getContentSize().height
									/ 2 + 20));
	spritebullet->setPosition(bulletPos);
	spritebullet->setScale(0.4f);

	float flyLen = winSize.height - PlanePos.y;
	float flyVelocity = 320 / 1;//执行速度,能够自己控制。每秒所走的像素
	float realFlyDuration = flyLen / flyVelocity;//实际飞行的时间

	//子弹执行的距离和时间,从飞机处開始执行到屏幕顶端
	auto actionMove = MoveTo::create(realFlyDuration,
			Point(bulletPos.x, winSize.height));
	//子弹执行完动作后进行函数回调。调用移除子弹函数
	auto actionDone = CallFuncN::create(
			CC_CALLBACK_1(BulletSprite::removeBullet, this));

	Sequence* sequence = Sequence::create(actionMove, actionDone, NULL);
	spritebullet->runAction(sequence);

}
/**
 * 移除子弹。将子弹从容器中移除。同一时候也从SpriteBatchNode中移除
 */
void BulletSprite::removeBullet(Node* pNode) {
	if (NULL == pNode) {
		return;
	}
	Sprite* bullet = (Sprite*) pNode;
	this->bulletBatchNode->removeChild(bullet, true);
	vecBullet.eraseObject(bullet);
}

/**
 * 从缓存中获取子弹动绘图片后创建子弹动画。终于返回创建好的动画
 */
Animation* BulletSprite::f_createAnimate(int count, int fps) {
	char buff[16];
	Animation *panimation = Animation::create();
	panimation->setDelayPerUnit(1.0 / fps);
	for (int id = 1; id <= count; id++) {
		sprintf(buff, "bullet_%d.png", id);
		panimation->addSpriteFrame(
				SpriteFrameCache::getInstance()->getSpriteFrameByName(buff));
	}
	return panimation;
}
</strong></span>

上面函数中凝视的都比較具体,关键要注意批次渲染机制的运用,这是游戏优化的一大提高点。

介绍了这么多还没有開始介绍游戏主要逻辑层,我都等不及了,在下一篇中会进行游戏源代码的上传。须要的能够看下一篇的介绍。

这篇就介绍到这里,下一篇也是最后一篇。介绍游戏主要逻辑层的实现。

时间: 2024-10-22 13:14:53

豪华版飞机大战系列(五)的相关文章

豪华版飞机大战系列(一)

鉴于最近在学习cocos2d-x开发手游,对于学习过程中的一些东西做个总结,也记录下学习历程,同时分享些项目源码来和大家一起学习. 第一次写系列教程,可能中间有疏漏的,看到的还请给提个醒,不好的也多多吐槽,以便自己能更好的以后的开发中基类经验. 此次教程分享下豪华版的飞机大战,老规矩,先上图: 介绍下开发环境:cocos2d-x3.2 alpha + Ubuntu14.04 + eclipse + 命令行终端 + android 用的引擎为3.2版本的,3.0以上的应该都能运行跑下来,windo

豪华版飞机大战系列(四)

上一篇介绍了敌人类EnemySprite的实现,这篇来介绍下主角类的实现.在游戏中可以看到主角类的周围有一直在飞行的小猪,时刻跟在主角飞机的旁边,我们先介绍下PigSprite的实现,因为后面的主角飞机类要用到此类. 看PigSprite.h的实现: #include "cocos2d.h" USING_NS_CC; class PigSprite : public cocos2d::Sprite { public: PigSprite(); ~PigSprite(); virtual

豪华版飞机大战系列(六)--附源代码

最后一篇讲一下游戏中的主要逻辑推断,在上面的工作都做充分准备后,游戏主要逻辑将变得特别清晰,接下来你会看到全部的逻辑都是那么的清晰自然,由于前面已经做好了充分的准备工作,这里仅仅是整合了前面的工作,略微增加了一些游戏推断元素. 同一时候源代码会在文章最后给出链接地址,源代码托管在github上,全部的东西都是开源免费的,在如今的大环境下.开源才是王道,分享才干双赢,我始终认为这是对的.你有一种思想我有一种思想,交流分享后我们都有了两种思想,何乐而不为呢. 好了,回归正题.游戏主要推断逻辑都在Ga

豪华版飞机大战系列(六)--附源码

最后一篇讲一下游戏中的主要逻辑判断,在上面的工作都做充分准备后,游戏主要逻辑将变得特别清晰,接下来你会看到所有的逻辑都是那么的清晰自然,因为前面已经做好了充分的准备工作,这里只是整合了前面的工作,稍微加入了一些游戏判断元素. 同时源码会在文章最后给出链接地址,源码托管在github上,所有的东西都是开源免费的,在现在的大环境下,开源才是王道,分享才能双赢,我始终觉得这是对的,你有一种思想我有一种思想,交流分享后我们都有了两种思想,何乐而不为呢. 好了,回归正题,游戏主要判断逻辑都在GameSce

豪华版飞机大战系列(二)

既上一篇介绍了游戏的主要概况下,这篇来开始讲一下游戏中的各个文件. 先来看看cocos2d-x 3.0 中一个比较赞的功能,比起3.0以前的要令人非常激动的.虽说3.0出来很久了,我还是说下这个功能,知道的飘过. 对于在不同环境下用cocos2d-x开发手游,屏幕尺寸是一个比较蛋疼的问题,比如在3.0以前,在代码中修改屏幕尺寸还是比较麻烦的,而且在电脑上运行良好的尺寸到手机端感觉效果就差了一点. AppDelegate.cpp是整个游戏的入口程序,3.0以前设置游戏尺寸时主要代码如下: bool

豪华版飞机大战系列(三)

本篇来介绍下游戏中的敌人类,既EnemySprite.h和EnemySprite.cpp中关于敌人类中的具体实现. 游戏中的敌人类主要有四种,三种不同的敌机和炸弹从上面随机的落下来,同时每个敌人都有自己的生命值,当生命值为0后会被从游戏中移除. 看一下敌人信息的头文件:EnemyInfo.h #pragma once const int ENEMY1_MAXLIFE=3; const int ENEMY2_MAXLIFE=5; const int ENEMY3_MAXLIFE=10; const

Python版飞机大战

前面学了java用java写了飞机大战这次学完python基础后写了个python版的飞机大战,有兴趣的可以看下. 父类是飞行物类是所有对象的父类,setting里面是需要加载的图片,你可以换称自己的喜欢的图片,敌机可以分为敌机和奖励,enemy为普通敌人的父类,award为奖励敌机的父类. 各个类的基本属性 主类的大概逻辑 具体的代码: settings配置 import pygame class Settings(object): """设置常用的属性"&quo

安卓飞机大战(五) 飞机瞬移的解决方法

在游戏开发时,角色可以随手指移动,但是当手指移动到屏幕另一个位置时,角色可以瞬移 解决方法如下: 在手指触摸屏幕时进行判定,如果手指点到了角色并且在屏幕上进行滑动,角色才移动 具体代码如下: 定义一个值a 当手指点到了角色并且在屏幕上进行滑动,a的值变为1,当手指离开屏幕,a的值变为0,当a=1时角色才进行移动. if(event.getAction()==MotionEvent.ACTION_DOWN&&event.getX()>=myplane.x&&event.

Cocos2d-x 3.0final 终结者系列教程16-《微信飞机大战》实现

看到cocos2d-x推出了3.1版本,真是每月一次新版本,速度, 还有一个好消息就是http://cn.cocos2d-x.org/上线了,祝贺!啥时候把我的视频和教程放上去呢?!!! 本文介绍一款纵版射击游戏的实现,开发环境: win7 vs2012 cocos2d-x3.0final android adt android ndk r9 首先看下最后的效果: (图1,微信飞机大战运行效果) 源码下载地址:http://download.csdn.net/detail/sdhjob/7513