zoukankan      html  css  js  c++  java
  • [置顶] cocos2d-x 3.0游戏开发xcode5帅印博客教学 004.[HoldTail]主角的上下飞行跟移动

    cocos2d-x 3.0游戏开发xcode5帅印博客教学 004.[HoldTail]主角的上下飞行跟移动

    写给大家的前言,在学习cocos2d-x的时候自己走了很多的弯路,也遇到了很多很多问题,不管是简单的还是困难的现在都慢慢的一步一步克服了,其实用cocos2d-x做游戏特别的简单,大家不要被是做游戏吓到了,支持我把游戏开源的原因是因为  eoe上海  的大家的支持。加油,加油,要说明一下的是,写得不好还请大家多多包含哦。相信你们跟着我得博客,一步一步做肯定会成功的。


    看到有朋友跟这我做,感到很开心这样我才有写下去的信心,大家一起加油,主角写好了几天了一直没有更新,今天给大家更新送到,下次更新看到家的评论。


    好了回到正题,今天开始主角的上下移动的控制

    效果图片





    首先来添加主角类

    SWGamePlayer.h

     

    //
    //  SWGamePlayer.h
    //  Holdtail
    //
    //  Created by 帅 印 on 13-12-04.
    //
    //
    
    #ifndef __Holdtail__SWGamePlayer__
    #define __Holdtail__SWGamePlayer__
    
    #include <iostream>
    #include <sstream>
    #include "cocos2d.h"
    #include "cocos-ext.h"
    
    using namespace cocos2d;
    using namespace std;
    using namespace extension;
    
    //类型转换类int.float --> String
    template<typename T>
    string Convert2String(const T & value){
        stringstream ss;
        ss << value;
        return ss.str();
    }
    
    //定义图片的枚举的类型
    typedef enum{
        tag_player_up,
        tag_player_down,
        tag_player_fly,
        tag_player_run,
        tag_playerHp,
    }tagPlayers;
    
    
    class SWGamePlayer:public cocos2d::Sprite{
    public:
        static SWGamePlayer *createPlayer(const char *fileName,int allCount,float sprit);
        //降低主角的血量
        void downHp(float _value);
        int hp;//血量
        int hpMax;//最高血量
        static SWGamePlayer *sharedPlayer();
        
        void callbackForDown();
    private:
        void playerInit(const char *fileName,int allCount,float sprit);
        //精灵的动态表现  文件名称  文件帧数  精灵速度
        void createAnimate(const char *fileName,int allCount,float sprit);
        
    
        bool isStrong;
        int strongCount;
        int strongTime;
        void strongIng(float soso);
        
    };
    #endif /* defined(__Holdtail__SWGamePlayer__) */
    


    SWGamePlayer.m

     

    //
    //  SWGamePlayer.cpp
    //  Holdtail
    //
    //  Created by 帅 印 on 13-8-21.
    //
    //
    
    #include "SWGamePlayer.h"
    #include "SWGameMap.h"
    #include "SWGameWorld.h"
    #include "SimpleAudioEngine.h"
    #include "SWMenu.h"
    
    using namespace cocos2d;
    using namespace CocosDenshion;
    
    //设置主角精灵的两种表现形式
    static Sprite *flySprite;
    static Sprite *runSprite;
    
    
    //声明静态变量
    static SWGamePlayer *SWPL;
    
    SWGamePlayer *SWGamePlayer::sharedPlayer(){
        if(SWPL != NULL){
            return SWPL;
        }
        return  NULL;
    }
    
    
    
    SWGamePlayer *SWGamePlayer::createPlayer(const char* fileName,int allCount,float sprit){
        SWGamePlayer *player = new SWGamePlayer();
        
        if (player && player->initWithFile("nulls.png")) {
            player->autorelease();
            player->playerInit(fileName,allCount,sprit);
            return player;
        }
        
        CC_SAFE_DELETE(player);
        return NULL;
    
    }
    
    void SWGamePlayer::playerInit(const char *fileName,int allCount,float sprit){
        
        SWPL = this;
        
        Size size = Director::getInstance()->getWinSize();
        
        //主角加入枪支
        auto spgane = Sprite::create("gang01.png");
        spgane->setPosition(Point(40, -10));
        addChild(spgane);
        
        //创建动物的动画
        createAnimate(fileName,allCount,sprit);
        
        //初始化主角的位置
        this->setPosition(Point(size.width/8, size.height/2));
        
        //设置血量
        hp = 1000;
        hpMax = 1000;
        
        ControlSlider* slider = ControlSlider::create("brood.png", "broods.png", "null.png");
        slider->setPosition(Point(250, size.height-40));
        slider->setTag(tag_playerHp);
        /* 设置滑动条的范围 */
        slider->setMinimumValue(0);
        slider->setMaximumValue(hpMax);
        /* 直接设置滑动条的当前值 */
        slider->setValue(hp);
        //slider->setTouchEnabled(false);
        SWGameWorld::sharedWorld()->addChild(slider);
        
        //添加主角形象
        Sprite *hmsprite = Sprite::create("gameicon.png");
        hmsprite->setPosition(Point(50, size.height-40));
        SWGameWorld::sharedWorld()->addChild(hmsprite);
        
        
        //添加游戏进行进度条
        Sprite *timebg = Sprite::create("timelinebg.png");
        timebg->setPosition(Point(670, size.height-35));
        SWGameWorld::sharedWorld()->addChild(timebg);
        
        //添加游戏进行条动画效果
        Sprite *timeplay = Sprite::create("timelineyou.png");
        timeplay->setPosition(Point(510, size.height-40));
        SWGameWorld::sharedWorld()->addChild(timeplay);
        
        //让动画进行播放
    //    ActionInterval* moveToGameOver = MoveBy::create(120, Point(320, 0));
    //    CallFunc * funCall =CallFunc::create(timeplay, callfunc_selector(SWGamePlayer::gameGoOver));
    //    FiniteTimeAction *seq =Sequence::create(moveToGameOver,funCall,NULL);
    //    seq->setTag(tag_player_down);
    //    timeplay->runAction(seq);
    
    //    MenuItemImage *SPJN01ITEM = MenuItemImage::create("pausebutton.png", "pausedownbutton.png",this,menu_selector(SWGamePlayer::backMenu));
    //    SPJN01ITEM->setPosition(Point(420,280));
    //    Menu *menu = Menu::create(SPJN01ITEM,NULL);
    //    SWGameWorld::sharedWorld()->addChild(menu);
        
        
        
    }
    
    void SWGamePlayer::createAnimate(const char *fileName,int allCount,float sprit){
        
        runSprite = Sprite::create("zhujuerun.png");
        runSprite->setTag(tag_player_run);
        Animation *animation = Animation::create();
        Texture2D *texture = TextureCache::getInstance()->addImage("zhujuerun.png");
        int eachWidth = runSprite->getContentSize().width/8;
        for (int i = 0; i<8; i++) {
            animation->addSpriteFrameWithTexture(texture, Rect(i*eachWidth, 0, eachWidth, this->getContentSize().height));
        }
        animation->setDelayPerUnit(0.1f);//必须设置否则不会动态播放
        animation->setRestoreOriginalFrame(true);//是否回到第一个
        animation->setLoops(-1);//重复次数
        FiniteTimeAction *animaterun = Animate::create(animation);
        runSprite->setPosition(this->getPosition());
        runSprite->runAction(animaterun);
        this->addChild(runSprite);
        
        
        flySprite = Sprite::create("zhujue.png");
        flySprite->setTag(tag_player_fly);
        Animation *animations = Animation::create();
        Texture2D *textures = TextureCache::getInstance()->addImage("zhujue.png");
        int eachWidths = flySprite->getContentSize().width/8;
        for (int i = 0; i<8; i++) {
            animations->addSpriteFrameWithTexture(textures, Rect(i*eachWidths, 0, eachWidths, this->getContentSize().height));
        }
        animations->setDelayPerUnit(0.05f);//必须设置否则不会动态播放
        animations->setRestoreOriginalFrame(true);//是否回到第一个
        animations->setLoops(-1);//重复次数
        FiniteTimeAction *animateruns = Animate::create(animations);
        flySprite->setPosition(this->getPosition());
        flySprite->runAction(animateruns);
        this->addChild(flySprite);
        
        
        runSprite->setOpacity(0);
        flySprite->setOpacity(255);
    }
    
    
    void SWGamePlayer::downHp(float _value){
        //通过这个方法来检测是否有发生碰撞
        //获取血量减掉血量
        hp = hp-_value;
        //将血量ICO进行更新
        ControlSlider *slider = (ControlSlider *)SWGameWorld::sharedWorld()->getChildByTag(tag_playerHp);
        slider->setValue(hp);
        
        //判断主角的血量是否已经达到了零的位置
        if(0 >= hp){
            Size size = Director::getInstance()->getWinSize();
            LayerColor *layer = LayerColor::create(Color4B(0, 0, 0, 200), size.width, size.height);
            Sprite *sp = Sprite::create("fail_bg.png");
            sp->setPosition(Point(size.width*0.5, size.height*0.5));
            layer->addChild(sp);
            
        }else{
            //主角无敌时的闪的效果
            isStrong = true;
            strongCount = 0;
            strongTime = 1*30;
            this->schedule(schedule_selector(SWGamePlayer::strongIng));
        }
    }
    
    //无敌时间处理函数
    void SWGamePlayer::strongIng(float soso){
        strongCount++;
        if(strongCount%strongTime == 0){
            this->setVisible(true);
            this->unschedule(schedule_selector(SWGamePlayer::strongIng));
        }else{
            //主角无敌时的闪的效果
            if(strongCount%3 == 0){
                this->setVisible(false);
            }else{
                this->setVisible(true);
            }
        }
    }
    
    void SWGamePlayer::callbackForDown(){
        //当开始让主角飞行时切换动画到行走模式
        Sprite *run = (Sprite *)this->getChildByTag(tag_player_run);
        run->setOpacity(255);
        Sprite *fly = (Sprite *)this->getChildByTag(tag_player_fly);
        fly->setOpacity(0);
    }
    



    然后在游戏世界里面加入对主角的配置

    当然对游戏的世界类也需要做小小的修改

    SWGameWorld.h

     

    //
    //  SWGameWorld.h
    //  Holdtail
    //
    //  Created by 帅 印 on 13-12-02.
    //
    //
    
    #ifndef __Holdtail__SWGameWorld__
    #define __Holdtail__SWGameWorld__
    
    #include <iostream>
    #include "cocos2d.h"
    #include "cocos-ext.h"
    
    USING_NS_CC;
    USING_NS_CC_EXT;
    //定义属性
    typedef enum {
        tag_player
    }tagWorld;
    
    class SWGameWorld:public cocos2d::Layer{
    public:
        static cocos2d::Scene *scene();
        static SWGameWorld *sharedWorld();
        
        void onTouchesBegan(const std::vector<Touch*>& touches, Event  *event);
        void onTouchesMoved(const std::vector<Touch*>& touches, Event  *event);
        void onTouchesEnded(const std::vector<Touch*>& touches, Event  *event);
    private:
        virtual bool init();
        CREATE_FUNC(SWGameWorld);
    };
    #endif /* defined(__Holdtail__SWGameWorld__) */
    


    SWGameWorld.cpp

     

    //
    //  SWGameWorld.cpp
    //  Holdtail
    //
    //  Created by 帅 印 on 13-12-02.
    //
    //
    
    #include "SWGameWorld.h"
    #include "cocos2d.h"
    #include "SimpleAudioEngine.h"
    #include "SWGameMap.h"
    #include "SWGamePlayer.h"
    
    using namespace cocos2d;
    using namespace CocosDenshion;
    
    //声明静态变量
    static SWGameWorld *SWGW;
    
    SWGameWorld *SWGameWorld::sharedWorld(){
        if(SWGW != NULL){
            return SWGW;
        }
        return  NULL;
    }
    
    
    Scene *SWGameWorld::scene(){
        Scene *scene = Scene::create();
        SWGameWorld *layer = SWGameWorld::create();
        scene->addChild(layer);
        
        return scene;
    }
    
    //创建场景
    bool SWGameWorld::init(){
        if( !Layer::init()){
            return false;
        }
        SWGW = this;
        
        //地图
        SWGameMap *map = SWGameMap::createMap("cloudbg.png","cloud04.png","cloud03.png","cloud02.png","cloud01.png","treesbg.png");
        addChild(map);
        
        //创建主角
        SWGamePlayer *player = SWGamePlayer::createPlayer("zhujuerun.png", 8, 0.05f);
        addChild(player,10,tag_player);
        
        
        setTouchEnabled(true);
    	//设置为单点响应
    	setTouchMode(Touch::DispatchMode::ALL_AT_ONCE);
        
        auto myListener = EventListenerTouchAllAtOnce::create();
        myListener->onTouchesBegan = CC_CALLBACK_2(SWGameWorld::onTouchesBegan, this);
        myListener->onTouchesMoved = CC_CALLBACK_2(SWGameWorld::onTouchesMoved, this);
        myListener->onTouchesEnded = CC_CALLBACK_2(SWGameWorld::onTouchesEnded, this);
        
        
        return true;
    }
    
    
    void SWGameWorld::onTouchesBegan(const std::vector<Touch*>& touches, Event  *event){
        
        for (int i = 0; i<touches.size(); i++) {
            if (0 == i) {
                SWGameMap::updateLayerHeight(0);
            }
        }
    }
    void SWGameWorld::onTouchesMoved(const std::vector<Touch*>& touches, Event  *event){
        
    }
    void SWGameWorld::onTouchesEnded(const std::vector<Touch*>& touches, Event  *event){
        for (int i = 0; i<touches.size(); i++) {
            if (0 == i) {
                SWGameMap::updateLayerHeight(1);
            }
        }
    }
    


    好了这下,主角就可以上下移动了,原理就是控制背景的移动,从而达到主角的移动效果


    今天的这个阶段的项目打包下载-->飞机直达


  • 相关阅读:
    更新pip10后 ImportError: cannot import name ‘main'
    动态规划刷题集python代码
    ctr中的GBDT+LR的优点
    msgpack生成lib,vs新建lib等
    两个简单的动态规划问题,0-1背包和最大不相邻数累加和,附递归c代码
    贝叶斯先验解释l1正则和l2正则区别
    找出平面上斜率最大的两点
    Maven——快速入门手册(学习记录)
    Java基础——深入理解Java中的final关键字(转载)
    Spring——scope详解(转载)
  • 原文地址:https://www.cnblogs.com/riasky/p/3465140.html
Copyright © 2011-2022 走看看