[置顶] 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);
        }
    }
}


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

 


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


 

posted on 2013-12-09 12:33  love so much  阅读(485)  评论(0编辑  收藏  举报

导航