Cocos2d-X 3.4版-地图无限滚动与边缘检测《赵云要格斗》

Map类改变的最少,直接贴代码了

Map.h

//
//  Map.h
//  Fight
//
//  Created by Cytzrs on 15/2/3.
//
//

#ifndef __Fight__Map__
#define __Fight__Map__

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

class IMap:public Node
{
public:
    IMap();
	~IMap();
	//初始化地图,window_sizeo为控制台大小
	void InitMap(const char *map_name,const Size &window_size);
	//根据精灵的位置移动地图,visibleSize为当前窗口的大小
	void MoveMap(Node *hero,Size visibleSize);
	//判断地图是否到达边缘
	bool JudgeMap(Node *hero,Size visibleSize);
	//virtual void update(float delta);
	CREATE_FUNC(IMap);
	
private:
	Sprite *m_map;//地图精灵
    
};

#endif /* defined(__Fight__Map__) */
Map.cpp
//
//  Map.cpp
//  Fight
//
//  Created by Cytzrs on 15/2/3.
//
//

#include "Map.h"

IMap::IMap():m_map(NULL)
{
    
}

IMap::~IMap()
{
    
}
void IMap::InitMap(const char *map_name,const Size &window_size)
{
	this->m_map=Sprite::create(map_name);
	m_map->setAnchorPoint(Vec2(0,0));//设置锚点
	this->setAnchorPoint(Vec2(0,0));//设置锚点
	this->addChild(m_map);
    
    
    
}
void IMap::MoveMap(Node *hero,Size visibleSize)//
{
	if(hero->getPositionX()==visibleSize.width/2)//精灵运动到中间,地图才移动
	{
		if(this->getPositionX()!=-(m_map->getContentSize().width-visibleSize.width))//防止地图左边运动后超出边缘
            this->setPosition(this->getPositionX()-1,this->getPositionY());
	}
}
bool IMap::JudgeMap(Node *hero,Size visibleSize)
{
	if(this->getPositionX()!=-(m_map->getContentSize().width-visibleSize.width))//防止地图左边运动后超出边缘
		return false;
	else //地图已经移动到达边缘
        return true;
}

最后,当然我们需要在Scene中添加IMap对象,然后再update中检测hero和map的的位置关系,以决定是hero移动呢还是map移动,

从而实现地图无限滚动的效果。

mymap=IMap::create();
	mymap->InitMap("12.png",visibleSize);
	this->addChild(mymap,0);
将update修改为:
void HelloWorld::update(float delta)
{
	Size visibleSize1 = Director::getInstance()->getVisibleSize();
	//判断是否按下摇杆及其类型
	switch(rocker->rocketDirection)
	{
        case  1:
            //hero->SetAnimation("attack1_animation.plist","attack1_animation.png","attack_",6,rocker->rocketRun);
            hero->SetAnimation("run_animation.plist","run_animation.png","run_",8,rocker->rocketRun);//"run_"为run_animation.png集合图片中每张图片的公共名称部分
            if(hero->getPositionX()<=visibleSize1.width-8)//不让精灵超出右边,8可以改成你喜欢的
            {
                if(!hero->JudgePositona(visibleSize1)||mymap->JudgeMap(hero,visibleSize1))//精灵没到达窗口中间位置或者地图已经移动到边缘了,精灵才可以移动,否则只播放动画
                    hero->setPosition(Vec2(hero->getPosition().x+1,hero->getPosition().y)); //向右走
                //下面是移动地图
                mymap->MoveMap(hero,visibleSize1);
            }
            break;
        case  2:
            hero->SetAnimation("run_animation.plist",rocker->rocketRun);//"run_"为run_animation.png集合图片中每张图片的公共名称部分
            hero->setPosition(Vec2(hero->getPosition().x,hero->getPosition().y+1));   //向上走
            break;
        case 3:
            hero->SetAnimation("run_animation.plist",rocker->rocketRun);//"run_"为run_animation.png集合图片中每张图片的公共名称部分
            if(hero->getPositionX()>=8)//不让精灵超出左边,8可以改成你喜欢的
                hero->setPosition(Vec2(hero->getPosition().x-1,hero->getPosition().y));   //向左走
            break;
        case 4:
            hero->SetAnimation("run_animation.plist",hero->getPosition().y-1));   //向下走
            break;
        case 0:
            hero->StopAnimation();//停止所有动画和运动
            break;
            
	}
	if(attackBtn->isHighlighted())
    {
        hero->AttackAnimation("attack1_animation.plist",rocker->rocketRun);
        log("-------------------_____________");
    }
}




PS:多写博客,帮助自己,方便他人!

相关文章

    本文实践自 RayWenderlich、Ali Hafizji 的文章《...
Cocos-code-ide使用入门学习地点:杭州滨江邮箱:appdevzw@1...
第一次開始用手游引擎挺激动!!!进入正题。下载资源1:从C...
    Cocos2d-x是一款强大的基于OpenGLES的跨平台游戏开发...
1.  来源 QuickV3sample项目中的2048样例游戏,以及最近《...
   Cocos2d-x3.x已经支持使用CMake来进行构建了,这里尝试...