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

本篇来介绍下游戏中的敌人类,既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 int ENEMY1_SCORE=1;
const int ENEMY2_SCORE=6;
const int ENEMY3_SCORE=30;

enum EnemyType
{
	Enemy1 = 1,
	Enemy2,
	Enemy3,
	Enemy4,
};

这个文件中主要设置了枚举类型来区别不同的敌人,同时设置了得人的生命数和每个敌人的分数,定义常量可以方便程序的维护。

接下来看下EnemySprite.h头文件:

#include "cocos2d.h"
#include "EnemyInfo.h"

USING_NS_CC;
class EnemySprite : public Node
{
public:
	EnemySprite();//构造函数
	~EnemySprite();//析构函数
	virtual bool init();//初始化函数
	CREATE_FUNC(EnemySprite);//create函数宏定义,系统已经实现

public:
	void setEnemyByType(EnemyType enType);//设置敌人的种类

	Sprite* getSprite();//取得已经创建的敌人
	int getLife();//获取生命值
	void loseLife();//被子弹击中后生命值减少
	Rect getBoundingBox();//取得敌人的外包装矩形
	Point getcurPoint();//取得敌人的位置

private:
	Sprite *pEnemySprite;
	int nLife;
};

上述中的函数都做了详细的注释,接下来看EnemySprite.cpp文件中的各种实现:

#include "EnemySprite.h"

EnemySprite::EnemySprite() {
}

EnemySprite::~EnemySprite() {
}

/**
 * 根据敌机类型来创建不同的敌机
 */
void EnemySprite::setEnemyByType(EnemyType enType) {
	switch (enType) {
	case Enemy1:
		pEnemySprite = Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("n1.png"));
		nLife = ENEMY1_MAXLIFE;
		break;
	case Enemy2:
		pEnemySprite = Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("n2.png"));
		nLife = ENEMY2_MAXLIFE;
		break;
	case Enemy3:
		pEnemySprite = Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("n3.png"));
		nLife = ENEMY2_MAXLIFE;
		break;
	case Enemy4:
		pEnemySprite = Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("n_boss.png"));
		nLife = ENEMY3_MAXLIFE;
		break;
	default:
		return;
		break;
	}

	this->addChild(pEnemySprite);
	pEnemySprite->setScale(0.6f);
	Size winSize = Director::getInstance()->getWinSize();
	Size enemySize = pEnemySprite->getContentSize();
	//设置敌机随机出现的位置
	int minX = enemySize.width / 2;
	int maxX = winSize.width - enemySize.width / 2;
	int rangeX = maxX - minX;
	int actualX = (rand() % rangeX) + minX;

	this->setPosition(Point(actualX, winSize.height + enemySize.height / 2));
}

bool EnemySprite::init() {
	bool pRet = true;
	if (!Node::init()) {
		pRet = false;
	}
	return pRet;
}
/**
 * 取得创建的敌机精灵
 */
Sprite* EnemySprite::getSprite() {
	return pEnemySprite;
}
/**
 * 取得生命值
 */
int EnemySprite::getLife() {
	return nLife;
}
/**
 * 生命值减少,每次被击中家少0.5
 */
void EnemySprite::loseLife() {
	nLife = nLife - 0.5;
}
/**
 * 取得现在的位置
 */
Point EnemySprite::getcurPoint() {
	return this->getPosition();
}

/**
 * 获取外包装矩形
 */
Rect EnemySprite::getBoundingBox() {
	Rect rect = pEnemySprite->boundingBox();
	Point pos = this->convertToWorldSpace(rect.origin);
	Rect enemyRect(pos.x, pos.y, rect.size.width, rect.size.height);
	return enemyRect;
}

上述函数的实现都比较简单,并在关键处做了说明,对于精灵图片的获取是用的缓存单例类来获取的,第一次加载图片后缓存到游戏中,可以减少每次都加载图片所带来的性能损失。用缓存类来创建精灵的代码如下:

Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("n1.png"));

好了,这篇主要介绍了敌人类的实现,创建好敌人类后就可以在GameLayer中直接调用此文件中已经实现好的函数来创建精灵,使各个文件的功能独立,模块分明,更好的来维护项目。

下一篇来介绍主角类Plane。

时间: 2024-10-13 16:28:00

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

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

鉴于最近在学习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

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

在介绍了前面的几篇后,对于源代码会在下一篇中上传,须要源代码的能够在下一篇中看到下载链接,开源才是王道,分享才干成长. 这篇继续介绍下游戏中的子弹层的渲染.也就是BulletSprite的介绍. 对于子弹层的渲染有两种机制.一种是直接从缓存中进行精灵创建,创建后的精灵直接加入并使用,另外一种机制为将创建的精灵加入到SpriteBatchNode中,这样进行渲染效率更高.对于这样渲染的机制我在这里略微提一下, 普通的渲染机制为:准备,渲染,清除.准备,渲染,清除.... 批次渲染机制为:准备,渲染

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

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

Python版飞机大战

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

安卓飞机大战(三) 弹出对话框

在游戏时,不管是退出游戏还是选择战机,都要弹出一个对话框,需要以下代码 按一个按钮弹出对话框 Layout文件:(添加一个按钮) <Button        android:id="@+id/button1"        android:layout_width="fill_parent"        android:layout_height="wrap_content"        android:text="准备起飞

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