最新cocos2d-x 3.0博客教学 小游戏[史上最坑爹的游戏] 002第一关:关闭卡死的电脑

昨天做了主画面的选择,今天做第一关的关闭卡死的电脑,这个小游戏,这个游戏是很多的小游戏组合起来的,所以我们逐个击破,第一个游戏到底要如何做呢?

看看今天实现第一关的效果







这个第一个游戏不算太难

首先我做了一个工具类,这个类实现了精灵的动画播放

SWSpritePlayForTexturePacker.h 和 SWSpritePlayForTexturePacker.cpp

SWSpritePlayForTexturePacker.h 

//
//  SWSpritePlayForTexturePacker.h
//  Holdtail
//  精灵播放动画,让精灵动起来
//  Created by 帅 印 on 13-8-17.
//
//

#ifndef __Holdtail__SWSpritePlayForTexturePacker__
#define __Holdtail__SWSpritePlayForTexturePacker__

#include <iostream>
#include "cocos2d.h"

using namespace cocos2d;

class SWSpritePlayForTexturePacker:public cocos2d::Sprite{
public:
    //实例化传入图片名称
    static SWSpritePlayForTexturePacker *createPlay(const char *fileName,int startCount,int allCount,float sprit,bool isrun);
    
private:
    //初始化
    void playInit(const char *fileName,int startCount,int allCount,float sprit,bool isrun);
    //精灵的动态表现  文件名称 文件开始位置 文件帧数  精灵速度  是否循环
    void createAnimate(const char *fileName,int startCount,int allCount,float sprit,bool isrun);
    
};
#endif /* defined(__Holdtail__SWSpritePlayForTexturePacker__) */

SWSpritePlayForTexturePacker.cpp

//
//  SWSpritePlayForTexturePacker.cpp
//  Holdtail
//  
//  Created by 帅 印 on 13-8-17.
//
//

#include "SWSpritePlayForTexturePacker.h"
#include "cocos2d.h"

using namespace cocos2d;

SWSpritePlayForTexturePacker *SWSpritePlayForTexturePacker::createPlay(const char *fileName,int startCount,int allCount,float sprit,bool isrun){
    SWSpritePlayForTexturePacker *spritePlay = new SWSpritePlayForTexturePacker();
    if(spritePlay && spritePlay->initWithFile("CloseSelected.png")){
        spritePlay->autorelease();
        spritePlay->playInit(fileName,startCount,allCount,sprit,isrun);
        return spritePlay;
    }
    return NULL;
}

//初始化
void SWSpritePlayForTexturePacker::playInit(const char *fileName,int startCount,int allCount,float sprit,bool isrun){
    //创建动物的动画
    createAnimate(fileName,startCount,allCount,sprit,isrun);
}

void SWSpritePlayForTexturePacker::createAnimate(const char *fileName,int startCount,int allCount,float sprit,bool isrun){
    SpriteFrameCache *cache = SpriteFrameCache::getInstance();//获取内存中的缓冲图片
    
    Array *arrypeople = Array::create();
    char str[100]={0};
    for (int i = startCount; i<=allCount; i++) {
        if (i<10) {
            sprintf(str, "%s_0%d.png",fileName,i);
        }else{
            sprintf(str, "%s_%d.png",fileName,i);
        }
        SpriteFrame *spfr = cache->getSpriteFrameByName(str);
        arrypeople->addObject(spfr);
    }
    Animation *animationpeople = Animation::createWithSpriteFrames(arrypeople,sprit);
    animationpeople->createWithSpriteFrames(arrypeople);
    if (isrun) {
        animationpeople->setLoops(-1);
    }else{
        animationpeople->setLoops(1);
    }
    
    //Animate *animatepeople = Animate::create(animationpeople);
    //this->runAction(RepeatForever::create(animatepeople->reverse()));
    Animate *animate = Animate::create(animationpeople);
    this->runAction(animate);
}


//下面就可以做游戏的第一关咯

HistoryGame01.h  和  HistoryGame01.cpp

HistoryGame01.h

#ifndef __HistoryGame01_SCENE_H__
#define __HistoryGame01_SCENE_H__

#include "cocos2d.h"

USING_NS_CC;

class HistoryGame01 : public cocos2d::Layer
{
public:
    static cocos2d::Scene* createScene();
    virtual bool init();
    
    //判断精灵是否点击
    bool isInSprite(Touch *theTouch,Sprite *sp);
    
    //点击
    bool onTouchBegan(Touch *pTouch, Event  *pEvent);
    
    //游戏结束
    void gameover(float over);
    //游戏胜利
    void gamewin(float win);
    
    void menuCloseCallback(Object* pSender);
    CREATE_FUNC(HistoryGame01);
};

#endif // __HistoryGame01_SCENE_H__

 HistoryGame01.cpp

#include "HistoryGame01.h"
#include "SWSpritePlayForTexturePacker.h"
#include "ScrollViewScene.h"
#include "CCEventDispatcher.h"
#include "CCEventListenerTouch.h"

USING_NS_CC;

static bool isClickGo;

Scene* HistoryGame01::createScene()
{
    isClickGo = true;
    auto scene = Scene::create();
    auto layer = HistoryGame01::create();
    scene->addChild(layer);
    return scene;
}

bool HistoryGame01::init()
{
    if ( !Layer::init() )
    {
        return false;
    }
    
    //cocos2d-x3.0中的点击事件
    auto dispatcher = Director::getInstance()->getEventDispatcher();
    auto touchListener = EventListenerTouchOneByOne::create();
    touchListener->onTouchBegan = CC_CALLBACK_2(HistoryGame01::onTouchBegan, this);
    dispatcher->addEventListenerWithSceneGraphPriority(touchListener, this);
    
    
    //加入背景
    Size size = CCDirector::getInstance()->getWinSize();
    SpriteFrameCache *cache = SpriteFrameCache::getInstance();
    cache->addSpriteFramesWithFile("shutdown.plist");
    
    Sprite* sprite =Sprite::createWithSpriteFrameName("background.png");
    sprite->setPosition(Point(size.width*0.5,size.height*0.5));
    addChild(sprite);
    
    //加入电脑
    auto sp_company =Sprite::createWithSpriteFrameName("computer.png");
    sp_company->setPosition(Point(size.width*0.5-50,size.height*0.5));
    addChild(sp_company);
    
    //加入播放的代码动画
    auto sp_codes = SWSpritePlayForTexturePacker::createPlay("code",1, 2, 0.2f,true);
    sp_codes->setPosition(Point(size.width*0.5-245,size.height*0.5+68));
    sp_codes->setTag(104);
    addChild(sp_codes);
    
    
    //加入电源线
    auto sp_tishi =Sprite::createWithSpriteFrameName("wire.png");
    sp_tishi->setPosition(Point(size.width*0.5-95,size.height*0.5+20));
    addChild(sp_tishi);
    
    //加入电源开关
    auto sp_open =Sprite::createWithSpriteFrameName("button.png");
    sp_open->setPosition(Point(size.width*0.5-376,size.height*0.5+76));
    sp_open->setTag(103);
    addChild(sp_open);
    
    
    
    
    //加入文字
    auto sp_wenzi1 =Sprite::createWithSpriteFrameName("word_01.png");
    sp_wenzi1->setPosition(Point(size.width*0.5,size.height*0.5+200));
    addChild(sp_wenzi1);
    auto sp_wenzi2 =Sprite::createWithSpriteFrameName("word_02.png");
    sp_wenzi2->setPosition(Point(size.width*0.5+180,size.height*0.5+200));
    addChild(sp_wenzi2);
    auto sp_wenzi3 =Sprite::createWithSpriteFrameName("word_03.png");
    sp_wenzi3->setPosition(Point(size.width*0.5+360,size.height*0.5+200));
    addChild(sp_wenzi3);
    

    //加入星星播放的代码动画
    auto sp_star = SWSpritePlayForTexturePacker::createPlay("star",1, 3, 0.5f,true);
    sp_star->setPosition(Point(size.width*0.5-95,size.height*0.5+40));
    sp_star->setTag(102);
    addChild(sp_star);
    
    
    //加入人物的代码动画(显示等待)
    auto sp_people = SWSpritePlayForTexturePacker::createPlay("hero",1, 4, 0.5f,true);
    sp_people->setPosition(Point(size.width*0.5+150,size.height*0.5-20));
    sp_people->setTag(101);
    addChild(sp_people);
    
    
    MenuItemImage *closeItem = MenuItemImage::create();
    closeItem->setNormalSpriteFrame(cache->spriteFrameByName("back-1.png"));
    closeItem->setSelectedSpriteFrame(cache->spriteFrameByName("back-2.png"));
    closeItem->initWithTarget(this, menu_selector(HistoryGame01::menuCloseCallback));
    closeItem->setPosition(Point(80,80));
    
    auto menu = Menu::create(closeItem, NULL);
    menu->setPosition(Point::ZERO);
    this->addChild(menu, 1);
    
    return true;
}


void HistoryGame01::menuCloseCallback(Object* pSender)
{
    //实现
    CCDirector::getInstance()->replaceScene(CCTransitionFade::create(0.5, ScrollViewScene::create()));
}

bool HistoryGame01::onTouchBegan(Touch *pTouch, Event  *pEvent){
    
    if (isInSprite(pTouch, (Sprite *)this->getChildByTag(102))) {
        //电线被点击
        //隐藏当前播放动画,显示结束动画
        Sprite *peo = (Sprite *)getChildByTag(101);
        peo->setOpacity(0);
        //加入人物的代码动画(显示等待)
        Size size = CCDirector::getInstance()->getWinSize();
        auto sp_people2 = SWSpritePlayForTexturePacker::createPlay("hero",5, 11, 0.5f,false);
        sp_people2->setPosition(Point(size.width*0.5+150,size.height*0.5-20));
        addChild(sp_people2);
        this->scheduleOnce(schedule_selector(HistoryGame01::gameover), 3.0f);
        
        return false;
    }else if(isInSprite(pTouch, (Sprite *)this->getChildByTag(103))){
        //按钮被点击
        //隐藏当前播放动画,显示结束动画
        Sprite *peo = (Sprite *)getChildByTag(104);
        peo->setOpacity(0);
        //加入人物的代码动画(显示等待)
        Size size = CCDirector::getInstance()->getWinSize();
        auto sp_people2 = SWSpritePlayForTexturePacker::createPlay("computerclose",1, 5, 0.5f,false);
        sp_people2->setPosition(Point(size.width*0.5-245,size.height*0.5+68));
        addChild(sp_people2);
        this->scheduleOnce(schedule_selector(HistoryGame01::gamewin), 3.0f);
        
        return false;
    }
    return false;
}


bool HistoryGame01::isInSprite(Touch *theTouch,Sprite *sp){
    //返回当前触摸位置得OpenGL坐标
    Point touchPoint = theTouch->getLocation();
    //将世界坐标转换为当前得父View的本地坐标
    Point reallyPoint = this->getParent()->convertToNodeSpace(touchPoint);
    //获取当前基于父View的坐标系
    Rect rect = sp->boundingBox();
    if (rect.containsPoint(reallyPoint)) {
        //判断是否让用户再点击
        if (isClickGo) {
            isClickGo = false;
            return true;
        }else{
            return false;
        }
    }
    return false;
}

void HistoryGame01::gameover(float over){
    //游戏失败
    Size size = CCDirector::getInstance()->getWinSize();
    LayerColor *layer = LayerColor::create(Color4B(0, 0, 0, 200), size.width, size.height);
    auto sp = Sprite::createWithSpriteFrameName("bg.png");
    sp->setPosition(Point(size.width*0.5, size.height*0.5));
    layer->addChild(sp);
    
    LabelTTF *scorettf = LabelTTF::create("失败", "MarkerFelt-Thin", 60);
    scorettf->setPosition(Point(size.width*0.5, size.height*0.5));
    layer->addChild(scorettf);
    
    this->addChild(layer);
    
    
}

void HistoryGame01::gamewin(float win){
    Size size = CCDirector::getInstance()->getWinSize();
    LayerColor *layer = LayerColor::create(Color4B(0, 0, 0, 200), size.width, size.height);
    auto sp = Sprite::createWithSpriteFrameName("bg.png");
    sp->setPosition(Point(size.width*0.5, size.height*0.5));
    layer->addChild(sp);
    
    LabelTTF *scorettf = LabelTTF::create("成功", "MarkerFelt-Thin", 60);
    scorettf->setPosition(Point(size.width*0.5, size.height*0.5));
    layer->addChild(scorettf);
    
    this->addChild(layer);
}


总结一下,做游戏要动用大量的脑力,跟时间,做起来也相当的废力,希望大家一起共同加油噢,今天就把源码偷偷的放出来,给大家参考参考哈。


飞机直达---》源码下载






  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

shuaiyinoo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值