zoukankan      html  css  js  c++  java
  • Cocos2d-x 3.2 大富翁游戏项目开发-第七部分 获取角色路径_2

    在编写获取路径方法前,我们先把角色须要的动画文件载入进来,角色的文件为png 和 plist格式。

    player1_anim.png.plist             player1_anim.png  

    player2_anim.png.plist             player2_anim.png

    plist分别记录了每张图在整张png图中的位置 大小,我们仅仅要知道每张小图名称就可以从整张png图中截取出想要的小图。

    player1_anim.png图片为


    player2_anim.png图片为



    图片表示方法同样,每四张表示一个方向


    我们在GameBaseScene中加入角色:

    1、 首先定义addPlayerAnimation()方法。这种方法主要是载入动画文件到内存 并创建角色须要的上下左右四个方向的动画

    void GameBaseScene::addPlayerAnimation()
    {
            //创建player1的帧缓存,并载入player1的动绘图片到缓存
    	player1_spriteFrameCache = SpriteFrameCache::getInstance();
    	player1_spriteFrameCache->addSpriteFramesWithFile("map/player1_anim.plist","map/player1_anim.png");
    
           //创建player2的帧缓存,并载入player2的动绘图片到缓存
    	player2_spriteFrameCache = SpriteFrameCache::getInstance();
    	player2_spriteFrameCache->addSpriteFramesWithFile("map/player2_anim.plist","map/player2_anim.png");
    
    	//创建player1的上下左右四个方向的Vector 
    	Vector<SpriteFrame*> player1_anim_left_vector ;
    	Vector<SpriteFrame*> player1_anim_right_vector;
    	Vector<SpriteFrame*> player1_anim_down_vector;
    	Vector<SpriteFrame*> player1_anim_up_vector;
    
    	//创建player2的上下左右四个方向的Vector
    	Vector<SpriteFrame*> player2_anim_left_vector;
    	Vector<SpriteFrame*> player2_anim_right_vector;
    	Vector<SpriteFrame*> player2_anim_down_vector;
    	Vector<SpriteFrame*> player2_anim_up_vector;}
            //定义name数组
    	char name[20];
    	memset(name, 0, 20);
    
    	//第1-4张图片是表示向左的动画,把这四张图片从缓存中取出。分别保存到对应角色的vector中
    	for (int i=1; i<=4; i++) 
    	{
    		sprintf(name, "player1_anim_%02d.png",i);
    		player1_anim_left_vector.pushBack(player1_spriteFrameCache->getSpriteFrameByName(name));
    
    		sprintf(name, "player2_anim_%02d.png",i);
    		player2_anim_left_vector.pushBack(player2_spriteFrameCache->getSpriteFrameByName(name));
    	}
    	//第5-8张图片是表示向右的动画
    	for (int i=5; i<=8; i++) 
    	{
    		sprintf(name, "player1_anim_%02d.png",i);
    		player1_anim_right_vector.pushBack(player1_spriteFrameCache->getSpriteFrameByName(name));
    
    		sprintf(name, "player2_anim_%02d.png",i);
    		player2_anim_right_vector.pushBack(player2_spriteFrameCache->getSpriteFrameByName(name));
    	}
    	//第9-12张图片是表示向下的动画
    	for (int i=9; i<=12; i++) 
    	{
    		sprintf(name, "player1_anim_%02d.png",i);
    		player1_anim_down_vector.pushBack(player1_spriteFrameCache->getSpriteFrameByName(name));
    		sprintf(name, "player2_anim_%02d.png",i);
    		player2_anim_down_vector.pushBack(player2_spriteFrameCache->getSpriteFrameByName(name));
    	}
    	//第13-16张图片是表示向上的动画
    	for (int i=13; i<=16; i++) 
    	{
    		sprintf(name, "player1_anim_%02d.png",i);
    		player1_anim_up_vector.pushBack(player1_spriteFrameCache->getSpriteFrameByName(name));
    		sprintf(name, "player2_anim_%02d.png",i);
    	}
    
    <span style="white-space:pre">	</span>//依据角色的上下左右四个vector 创建四个方向的动作
    	Animation * player1_animation_left = Animation::createWithSpriteFrames(player1_anim_left_vector,0.1f);
    	Animation * player1_animation_right = Animation::createWithSpriteFrames(player1_anim_right_vector,0.1f);
    	Animation * player1_animation_down = Animation::createWithSpriteFrames(player1_anim_down_vector,0.1f);
    	Animation * player1_animation_up = Animation::createWithSpriteFrames(player1_anim_up_vector,0.1f);
    
    
    	Animation * player2_animation_left = Animation::createWithSpriteFrames(player2_anim_left_vector,0.1f);
    	Animation * player2_animation_right = Animation::createWithSpriteFrames(player2_anim_right_vector,0.1f);
    	Animation * player2_animation_down = Animation::createWithSpriteFrames(player2_anim_down_vector,0.1f);
    	Animation * player2_animation_up = Animation::createWithSpriteFrames(player2_anim_up_vector,0.1f);
    
    	///依据角色的上下左右四个动作  创建四个方向的动画
    	player1_animate_left = Animate::create(player1_animation_left);
    	player1_animate_right = Animate::create(player1_animation_right);
    	player1_animate_down = Animate::create(player1_animation_down);
    	player1_animate_up = Animate::create(player1_animation_up);
    
    
    	player2_animate_left = Animate::create(player2_animation_left);
    	player2_animate_right = Animate::create(player2_animation_right);
    	player2_animate_down = Animate::create(player2_animation_down);
    	player2_animate_up = Animate::create(player2_animation_up);
    
    }
    

    2、 创建完角色须要的文件后,还须要角色在地图的位置,因为能走的路径都在way图层中,在setWayPassToGrid()方法中。我们把way图层中sprite的坐标保存到wayLayerPass_vector中。这样就能够依据当中的坐标设置角色的位置了

    void  GameBaseScene::setWayPassToGrid()
    {
    	TMXLayer* wayLayer = _map->layerNamed("way");
    
    
    	Size _mapSize = wayLayer->getLayerSize(); 
    	for (int j = 0;  j < _mapSize.width; j++) {  
    		for (int i = 0;  i < _mapSize.height; i++) {  
    			Sprite* _sp = wayLayer->tileAt(Point(j, i));  
    			if (_sp) 
    			{  
    				float x = _sp->getPositionX();
    				float y = _sp->getPositionY();
    				int col = x/tiledWidth;
    				int row = y/tiledHeight;
    				canPassGrid[row][col] = true;
    				//取得该位置的坐标,保存到对象wayLayerPass_vector中
    				Vec2 p = _sp->getPosition();
    				wayLayerPass_vector.push_back(p);
    				log("canPassGrid row=  %d ,col =%d ,canpass = %d" ,row,col,canPassGrid[row][col]);
    			}  
    
    		}  
    	}  
    	log("setWayPassToGrid finished");
    }
    

    3、 加入的角色我们先封装成一个RicherPlayer类。该类记录角色的信息。包含角色名称、资金、体力、敌友


    RicherPlayer* RicherPlayer::create(char* name,SpriteFrame* spriteFrame,bool enemy,int money,int strength)
    {
    	RicherPlayer* player = new RicherPlayer();
    	player->init(name,spriteFrame, enemy,money,strength);
    	player->autorelease();
    	return player;
    
    }
    
    
    bool RicherPlayer::init(char* name,SpriteFrame* spriteFrame,bool enemy,int money,int strength)
    {
    
    	Sprite::initWithSpriteFrame(spriteFrame);
    	_name = name;
    	_enemy = enemy;
    	_money = money;
    	_strength = strength;
    	return true;
    }
    

    4、接下来在addPlayer()方法中,从容器wayLayerPass_vector中随机取出坐标,进行角色的加入。

    void GameBaseScene:: addPlayer()
    {
    	//指定随机数种子,随机数依据这个种子产生 採用当前时间生成随机种子:
    	struct timeval now; 
    	gettimeofday(&now, NULL); //计算时间种子
    	unsigned rand_seed = (unsigned)(now.tv_sec*1000 + now.tv_usec/1000);     // 初始化随机数   
    	srand(rand_seed);
    
    	//从帧缓存图片中取第一张。做为角色的初始图片
    	SpriteFrame* spf1 = player1_spriteFrameCache->getSpriteFrameByName("player1_anim_01.png");
    	player1 = RicherPlayer::create("player1",spf1,false);
    	//依据wayLayerPass_vector的坐标数量,取得随机的一个id
    	int _rand1 = rand()%(wayLayerPass_vector.size()); 
    	log("rand %d" ,_rand1);
    	//依据id,取出当中的坐标
    	Vec2 vec2ForPlayer1 = wayLayerPass_vector.at(_rand1);
    	//这个我们给纵向位置加入一个tiledHeight高度,目的是为了让角色居中显示在道路中
    	vec2ForPlayer1.y +=tiledHeight; 
    	//设置角色的位置,以及锚点
    	player1->setPosition(vec2ForPlayer1);
    	player1->setAnchorPoint(ccp(0,0.5));
    	//log 相关
    	int col = vec2ForPlayer1.x/tiledWidth;
    	int row = vec2ForPlayer1.y/tiledHeight;
    	log("player1 position row=  %d ,col = %d" ,row,col);
    	log("player1 position x=  %f ,y = %f" , vec2ForPlayer1.x, vec2ForPlayer1.y);
    	//加入角色到地图场景
    	addChild(player1);
    
    	角色2的加入同角色1方法同样。不再累述
    	…………………
    
    }
    

    測试ok 已经能够看到2个角色了




    未完待续.......................


    差点忘了代码 

    点击下载代码     http://download.csdn.net/detail/lideguo1979/8281909

  • 相关阅读:
    回归分析举例
    用js实现在文本框中检测字数和限制字数功能
    深入理解CSS盒子模型
    CSS盒子模型小剖析
    iphone开发“关闭键盘的例子”
    最全的CSS浏览器兼容问题整理(IE6.0、IE7.0 与 FireFox)
    Soap UI 负载测试
    应聘时最漂亮的回答! 留着 早晚用的上 2012
    SOAP UI 简单使用
    乔布斯做管理的十条戒律
  • 原文地址:https://www.cnblogs.com/gccbuaa/p/6761400.html
Copyright © 2011-2022 走看看