个人初做小游戏RunRunMagic(六) 代码

PlayLayer.h

PlayLayer.cpp

Player.h

Player.cpp

Fire.h

Fire.cpp

Enemy.h

Enemy.cpp


PlayLayer.h

#include <stdio.h>
#include "cocos2d.h"
#include "Player.h"
#include "Enemy.h"
#include "Fire.h"
using namespace cocos2d;

class PlayLayer:public Layer{
public:
    static cocos2d::Scene* scene();
    virtual bool init();
    CREATE_FUNC(PlayLayer);
    
    Player* player;//玩家对象
    
    virtual bool onTouchBegan(Touch *touch, Event *unused_event);
    virtual void onTouchMoved(Touch *touch, Event *unused_event);
    virtual void onTouchEnded(Touch *touch, Event *unused_event);
    virtual void onTouchCancelled(Touch *touch, Event *unused_event);
    
    virtual void update(float t);//时间调度
    cocos2d::Point magicPoint;//玩家位置
    Label* scoreLabel;//分数文字
    Label* scoreNumberLabel;//分数数字Label
    __Array* enemyArray;
    __Array* fireArray;
    
    void stopMove();//令isMove为false
    void myUpdate(float t);//创建敌人的时间调度器
    void enemyUpdate(float t);//出现敌人调用的随机时间调度器
    void knockUpdate(float t);//碰撞检测的时间调度器
    
};

PlayLayer.cpp

#include "PlayLayer.h"
#include "Data.h"

Scene* PlayLayer::scene(){
    auto scene = Scene::create();
    auto layer = PlayLayer::create();
    scene->addChild(layer);
    return scene;
}

bool PlayLayer::init(){
    
    if(!Layer::init()){
        return false;
    }
    
    enemyArray = __Array::create();
    enemyArray->retain();
    fireArray = __Array::create();
    fireArray->retain();
    //触摸监听
    auto dispatcher = Director::getInstance()->getEventDispatcher();
    auto listener = EventListenerTouchOneByOne::create();
    listener->onTouchBegan = CC_CALLBACK_2(PlayLayer::onTouchBegan, this);
    listener->onTouchMoved = CC_CALLBACK_2(PlayLayer::onTouchMoved, this);
    listener->onTouchEnded = CC_CALLBACK_2(PlayLayer::onTouchEnded, this);
    listener->onTouchCancelled = CC_CALLBACK_2(PlayLayer::onTouchCancelled, this);
    listener->setSwallowTouches(true);
    dispatcher->addEventListenerWithSceneGraphPriority(listener, this);
    
    //玩家
    player = new Player();
    player->setPosition(Vec2(50,40));
    player->ignoreAnchorPointForPosition(false);
    player->setAnchorPoint(Point(0.5,0.5));
    this->addChild(player,2);
    player->PlayerMove();
    playerScore = 0;
    
    //循环背景
    auto bg1 = Sprite::create("background.png");
    bg1->setTag(100);
    bg1->setAnchorPoint(Point(0,0.5));
    bg1->setPosition(Vec2(0,100));
    this->addChild(bg1,1);
    auto bg2 = Sprite::create("background.png");
    bg2->setTag(101);
    bg2->setAnchorPoint(Point(0,0.5));
    bg2->setPosition(Vec2(300,100));
    this->addChild(bg2,1);
    
    //分数
    scoreLabel = Label::createWithTTF("fonts/pixel3.ttf", "SCORE");
    scoreLabel->setPosition(Vec2(30,150));
    this->addChild(scoreLabel,3);
    char number[20] ;
    sprintf(number, "%d",playerScore);
    scoreNumberLabel = Label::createWithTTF("fonts/pixel3.ttf", number);
    scoreNumberLabel->setPosition(Vec2(75,150));
    this->addChild(scoreNumberLabel,3);
    
    //时间调度器
    scheduleUpdate();
    //创建敌人的时间调度器
    this->schedule(CC_CALLBACK_1(PlayLayer::enemyUpdate, this),1.0,"enemyUpdate");
    //碰撞检测的时间调度器
    this->schedule(CC_CALLBACK_1(PlayLayer::knockUpdate, this),"knockUpdate");
    
    return true;
}

void PlayLayer::update(float t){
    //创建循环背景
    auto bg1 = this->getChildByTag(100);
    bg1->setPosition(Vec2(bg1->getPosition().x-5,bg1->getPosition().y));
    auto bg2 = this->getChildByTag(101);
    bg2->setPosition(Vec2(bg2->getPosition().x-5,bg2->getPosition().y));
    
    if (bg1->getPosition().x <= -bg1->getContentSize().width) {
        bg1->setPosition(300, 100);
    }
    if (bg2->getPosition().x <= -bg2->getContentSize().width) {
        bg2->setPosition(300, 100);
    }
    
    if ( enemyArray->count() > 0 ) {
        for (int i = 0; i < enemyArray->count(); i++) {
            Enemy* enemy = (Enemy *)enemyArray->getObjectAtIndex(i);
            if (enemy->getPosition().x < -10) {
                enemyArray->removeObject(enemy);
                this->removeChild(enemy);
            }
            enemy->setPosition(Vec2(enemy->getPosition().x-5,enemy->getPosition().y));
        }
    }
    
    for (int i = 0 ; i<fireArray->count(); i++) {
        Fire* fire = (Fire*)fireArray->getObjectAtIndex(i);
        if (fire->getPosition().x < 10) {
            fireArray->removeObject(fire);
            this->removeChild(fire);
        }
    }
    
    playerScore++;
    char number[20] ;
    sprintf(number, "%d",playerScore);
    scoreNumberLabel->setString(number);
}

void PlayLayer::enemyUpdate(float t){
    float time = rand()%3 ;
    this->scheduleOnce(CC_CALLBACK_1(PlayLayer::myUpdate, this),time,"myUpdate");//创建敌人的时间调度器
}
void PlayLayer::myUpdate(float t){//创建敌人的时间调度器
    Enemy* enemy = new Enemy();
    for (int i = 0;i<enemyArray->count(); i++) {
        Enemy* enemy1 = (Enemy *)enemyArray->getObjectAtIndex(i);
        if (enemy->getPosition().x<enemy1->getPosition().x+64 &&
            enemy->getPosition().x>enemy1->getPosition().x-64) {
            //如果两个障碍物太近(在其周围64像素点内)则不创建
            return;
        }
    }
    int enemyY = rand()%3*40 +30;
    enemy->setPosition(Vec2(270,enemyY));
    this->addChild(enemy,1);
    enemyArray->addObject(enemy);
}

void PlayLayer::knockUpdate(float t){
    for (int i = 0; i <enemyArray->count(); i++) {
        Enemy* enemy = (Enemy*)enemyArray->getObjectAtIndex(i);//获得障碍物
        if(player->boundingBox().intersectsRect(enemy->boundingBox()) &&
            player->getPosition().y == enemy->getPosition().y + 10){//如果人和物在一行且发生碰撞
            playerScore = 0;//分数归零
            //删除障碍物
            enemyArray->removeObject(enemy);
            this->removeChild(enemy);
        }
    }
    
    for (int j = 0; j<enemyArray->count(); j++) {
        Enemy* enemy = (Enemy*)enemyArray->getObjectAtIndex(j);//获得障碍物
        for (int k = 0; k<fireArray->count(); k++) {
            Fire* fire = (Fire*)fireArray->getObjectAtIndex(k);
            if(fire->boundingBox().intersectsRect(enemy->boundingBox()) &&
               fire->getPosition().y == enemy->getPosition().y + 10){
                player->isMove = false;
                enemyArray->removeObject(enemy);
                this->removeChild(enemy);
                fireArray->removeObject(fire);
                this->removeChild(fire);
            }
        }
    }
}


bool PlayLayer::onTouchBegan(Touch *touch, Event *unused_event){
/*
    //点击移动相关
    player->stopAllActions();
    auto distance = sqrt(pow(player->getPosition().x-touch->getLocation().x, 2)+pow(player->getPosition().y-touch->getLocation().y, 2));
    auto time = distance/100;
    
    auto move = MoveTo::create(time, touch->getLocation());
    player->runAction(move);
    player->PlayerMove();
    player->isMove = true;
*/
    return true;
}

void PlayLayer::onTouchMoved(Touch *touch, Event *unused_event){
/*
    //随点击点移动
    player->stopAllActions();
    player->PlayerMove();
    auto distance = sqrt(pow(player->getPosition().x-touch->getLocation().x, 2)+pow(player->getPosition().y-touch->getLocation().y, 2));
    auto time = distance/100;
    
    auto move = MoveTo::create(time, touch->getLocation());
    player->runAction(move);
    
    if(player->getPosition() == touch->getLocation()){
        player->stopAllActions();
    }
*/
    if(player->isMove == true)//如果人物移动中则返回
        return;
    
    player->isGo = true;
    if(touch->getStartLocation().y < touch->getLocation().y){//如果向上滑动
        if(player->getPosition().y >= 120){//如果人物在顶端则返回
            return;
        }else{
            player->isMove = true;
            auto move = MoveTo::create(0.5f, Vec2(50,player->getPosition().y+40));//向上移动100
            auto call = CallFunc::create(CC_CALLBACK_0(PlayLayer::stopMove, this));
            auto seq = Sequence::create(move,call, NULL);
            player->runAction(seq);
        }
    }
    
    if(touch->getStartLocation().y > touch->getLocation().y){//如果向下滑动
        if(player->getPosition().y <= 40){//如果人物在底端则返回
            return;
        }else{
            player->isMove = true;
            auto move = MoveTo::create(0.5f, Vec2(50,player->getPosition().y-40));//向上移动100
            auto call = CallFunc::create(CC_CALLBACK_0(PlayLayer::stopMove, this));
            auto seq = Sequence::create(move,call, NULL);
            player->runAction(seq);
        }
    }
}

void PlayLayer::onTouchEnded(Touch *touch, Event *unused_event){
        if(player->isGo == true){//如果是Move则令其状态变回false,然后返回
            player->isGo = false;
            return;
        }
    
        while (touch->getLocation().x < 100) {//点击屏幕左侧 人物跳跃
            if (player->isMove == true) {
                return;
            }
            player->isMove = true;
            auto jump = JumpTo::create(0.5, player->getPosition(), 32, 1);
            auto call = CallFunc::create(CC_CALLBACK_0(PlayLayer::stopMove,this));
            auto seq = Sequence::create(jump,call, NULL);
            player->runAction(seq);
        }
        while (touch->getLocation().x > 140) {//点击屏幕右侧 放出火焰
            if (player->isMove == true) {
                return;
            }
            player->isMove = true;
            auto fire = new Fire();
            int y =player->getPosition().y;
            fire->setPosition(Vec2(60,y));
            this->addChild(fire,2);
            
            auto fireMove = MoveTo::create(2, Vec2(260,y));
            auto fireRotate = RotateTo::create(2, 360*8);
            auto spawn = Spawn::create(fireMove,fireRotate, NULL);
            auto call = CallFunc::create(CC_CALLBACK_0(PlayLayer::stopMove,this));
            auto seq = Sequence::create(DelayTime::create(0.5),call, NULL);
            fire->runAction(spawn);
            fire->runAction(seq);
            fireArray->addObject(fire);
            log("fire");
        }
}

void PlayLayer::onTouchCancelled(Touch *touch, Event *unused_event){

}

void PlayLayer::stopMove(){
    player->isMove = false;
}
Player.h
#include <stdio.h>
#include "cocos2d.h"
using namespace cocos2d;

class Player:public Sprite{
public:
    
    Player();
    ~ Player();
    void PlayerMove();
    
    bool isMove;
    bool isGo;

};
Player.cpp
#include "Player.h"

Player::Player(){
    Sprite::initWithFile("magic02.png");
    isMove = false;
    isGo = false;
}

Player::~ Player(){
}

void Player::PlayerMove(){
    
    auto cache = SpriteFrameCache::getInstance();
    cache->addSpriteFramesWithFile("magicAll.plist", "magicAll.png");
    Vector<SpriteFrame*>vec;
    char name[20];
    for(int i=1;i<=4;i++){
        sprintf(name, "magic0%d.png",i);
        auto frame = cache->getSpriteFrameByName(name);
        vec.pushBack(frame);
    }
    
    auto animation = Animation::createWithSpriteFrames(vec,0.1f);
    auto animate = Animate::create(animation);
    auto seq = Sequence::create(animate, NULL);
    auto repeat = RepeatForever::create(seq);
    
    this->runAction(repeat);
}
Fire.h

#include <stdio.h>
#include "cocos2d.h"
using namespace cocos2d;

class Fire:public Sprite{
public:
    Fire();
    ~ Fire();
    
};
Fire.cpp

#include "Fire.h"

Fire::Fire(){
    Sprite::initWithFile("fire.png");
}

Fire::~ Fire(){
}
Enemy.h

#include <stdio.h>
#include "cocos2d.h"
using namespace cocos2d;

class Enemy:public Sprite{
public:
    Enemy();
    ~ Enemy();
};
Enemy.cpp

#include "Enemy.h"

Enemy::Enemy(){
    Sprite::initWithFile("glasses.png");
}

Enemy::~ Enemy(){
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值