zoukankan      html  css  js  c++  java
  • 豪华版飞机大战系列(三)

    本篇来介绍下游戏中的敌人类,既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。




  • 相关阅读:
    洛谷 P1032 字串变换
    map && multimap
    【转载】Pycharm调试高效,还是pdb调试高效? (在服务端)
    弱国无外交 弱国一定无外交吗
    [转发]Linux性能测试工具之Lmbench特性、安装及使用
    fedora21 桌面用户自动登录lightdm.conf -20190520 方法
    获取显卡硬件信息lspci -vnn | grep VGA -A 12
    mate桌面用户 root 自动登录lightdm.conf -20190520 方法【fedora 21】mate
    在线文本差异对比
    【科目三】机考 教练不出话 态度要好
  • 原文地址:https://www.cnblogs.com/wzjhoutai/p/7363404.html
Copyright © 2011-2022 走看看