2014-11-25 17:02:49 zhangzhenyuaf 阅读数 253
  • Cocos2d-x 3.x项目实战:星空大战(射击类游戏)

    本课程是《从零开始掌握Cocos2d-x 3.0(基于3.0正式版) 》课程配套的项目实战课程。建议对Cocos2d-x 3.0不了解的同学先学习该课程。本课程将利用《从零开始掌握Cocos2d-x 3.0(基于3.0正式版) 》中讲解的知识开发一款射击类游戏:星空大战(与打飞机游戏类似)。从这个项目中可学习到如何利用Cocos2d-x 3.0的相关知识开发一款完整的射击类游戏。

    18362 人正在学习 去看看 李宁

tiledmap有两种层,一种为图层,一种为对象层。

从对象层上读取数据:

TMXTiledMap* map = TMXTiledMap::create("map1.tmx");

    this->addChild(map);

    TMXObjectGroup* riverObjects = map->getObjectGroup("riverObjects");//对象层名字

//直接读取坐标,放置所需精灵。

    for (int i = 0; i < riverObjects->getObjects().size(); i ++) {

        ValueMap value = riverObjects->getObjects().at(i).asValueMap();

        std::string type = value.at("type").asString();

        if (type == "water") {

            float x = value.at("x").asFloat();

            float y = value.at("y").asFloat();

            this->setAMySprite(type, x, y);

        }

    }


从图层上读取数据:

TMXTiledMap* map = TMXTiledMap::create("map1.tmx");

    this->addChild(map);

    map->setVisible(false);

    TMXLayer* lay = map->getLayer("back");//图层名字

    MAXH = lay->getLayerSize().height;//图层高度

    MAXW = lay->getLayerSize().width;//图层宽度

for (int i = 0; i < MAXH; i ++) {

        for (int j = 0; j < MAXW; j ++) {

            Vec2 point = Vec2(j, i);//nodeToPoint(MapNode(i, j));

            int ff = lay->getTileGIDAt(point);

    switch (ff){//得到的ff为你在图层上添加的图块。可自主转换坐标,然后放置自己的精灵。

case 0:

    break;

    }

}

}




2015-04-23 23:31:27 jingzhewangzi 阅读数 1436
  • Cocos2d-x 3.x项目实战:星空大战(射击类游戏)

    本课程是《从零开始掌握Cocos2d-x 3.0(基于3.0正式版) 》课程配套的项目实战课程。建议对Cocos2d-x 3.0不了解的同学先学习该课程。本课程将利用《从零开始掌握Cocos2d-x 3.0(基于3.0正式版) 》中讲解的知识开发一款射击类游戏:星空大战(与打飞机游戏类似)。从这个项目中可学习到如何利用Cocos2d-x 3.0的相关知识开发一款完整的射击类游戏。

    18362 人正在学习 去看看 李宁

1、cocos2d-x使用tiledMap时地图格子之间出现黑线、黑色斑点:

方法有几种,我只记得其中一个方法:在cocos2d\cocos\base\ccConfig.h

 #ifndef CC_FIX_ARTIFACTS_BY_STRECHING_TEXEL
#define CC_FIX_ARTIFACTS_BY_STRECHING_TEXEL 1(默认是0,试试1,具体原理我还不清晰,解释不了)
#endif 

问题原因在于精灵做渲染插值时边缘点应该选取附近的点进行融合,0和1应该是开关设置。我记得我修改过其他地方的代码,可以版本出现混乱,没有完成代码整理导致丢失


2、公司的日报不等同于个人技术笔记

近期我发现我丢失了几份技术笔记,然而我没能在各种电子笔记本中找到,原因好像是csdn提交失败。当需要进行技术点查询时,发现笔记是多么重要的资料。

2014-04-29 22:45:28 yangxuan0261 阅读数 854
  • Cocos2d-x 3.x项目实战:星空大战(射击类游戏)

    本课程是《从零开始掌握Cocos2d-x 3.0(基于3.0正式版) 》课程配套的项目实战课程。建议对Cocos2d-x 3.0不了解的同学先学习该课程。本课程将利用《从零开始掌握Cocos2d-x 3.0(基于3.0正式版) 》中讲解的知识开发一款射击类游戏:星空大战(与打飞机游戏类似)。从这个项目中可学习到如何利用Cocos2d-x 3.0的相关知识开发一款完整的射击类游戏。

    18362 人正在学习 去看看 李宁

TiledMap 使用



代码:

void HelloWorld::testTileMap(){
    
    CCTMXTiledMap* map= CCTMXTiledMap::create("Untitled.tmx");//获取tmx文件
    map->setPosition(ccp(this->getContentSize().width/2-100, this->getContentSize().height/2-100));
    this->addChild(map);
    
    // 所有的地图默认是失真的,如果你想创建非失真砖块,你需要添加入下代码:
    //遍历所有的层(失真精灵管理者),并且设置他们为非失真
    CCArray * pChildrenArray = map->getChildren();
    CCSpriteBatchNode* child = NULL;
    CCObject* pObject = NULL;
    
    CCARRAY_FOREACH(pChildrenArray, pObject)
    {
        child = (CCSpriteBatchNode*)pObject;
        if(!child)
            break;
        child->getTexture()->setAntiAliasTexParameters();
    }
    
    CCTMXLayer* layer1=map->layerNamed("layer1");//获取map里面的图层,
    CCSprite* sp1=layer1->tileAt(ccp(3, 3));//获取图层上砖块的
    CCSprite* sp2=layer1->tileAt(ccp(1, 0));
    layer1->removeChild(sp1, true);//移除砖块
    layer1->removeChild(sp2, true);
    layer1->removeTileAt(ccp(9, 1));//根据坐标移除砖块
    //map->removeChild(layer1);
    
    unsigned int m_gid = layer1->tileGIDAt(ccp(5,5));//获取一个砖块A的GID
    layer1->setTileGID(m_gid, ccp(2,7));//设定特定坐标为砖块A
    
//     遍历一个layer
//    CCSize s = layer1->getLayerSize();
//    for( int x=0; x<s.width;x++) {
//        for( int y=0; y< s.height; y++ ) {
//            unsigned int tmpgid = layer1->tileGIDAt(ccp(x,y));
//            layer1->setTileGID(tmpgid+1,ccp(x,y));
//        }
//    }
    
    //MARK: ==
    CCTMXObjectGroup* group =map->objectGroupNamed("obj111");//获取对象组
    
    CCDictionary* dic = group->objectNamed("yang");//获取对象组中的对象
    int x=dic->valueForKey("x")->intValue();//获取x坐标
    int y=dic->valueForKey("y")->intValue();//获取y坐标
    CCSprite* pSprite = CCSprite::create("CloseNormal.png");
    map->addChild(pSprite);//往map上添加一个精灵
    pSprite->setPosition(ccp(x, y));//设置这个精灵的位置
    
//    // 对象层 3.0以后使用方法
//    TMXObjectGroup* pipeGroup = map->objectGroupNamed("pipe");
//    //得一个
//    ValueMap pipe_1  = pipeGroup->objectNamed("pipe_1");
//    std::string pipeStr = pipe_1["name"].asString();
//    float pipeX = pipe_1["x"].asFloat();
//    float pipeY= pipe_1["y"].asFloat();;
//    float pipeWidht = pipe_1["width"].asFloat();
//    float pipeHeight = pipe_1["height"].asFloat();
    
    CCDictionary* dic2 = group->objectNamed("xuan");
    int x2=dic2->valueForKey("x")->intValue();
    int y2=dic2->valueForKey("y")->intValue();
    CCSprite* pSprite2 = CCSprite::create("CloseNormal.png");
    map->addChild(pSprite2);
    pSprite2->setPosition(ccp(x2, y2));
    
    CCTMXObjectGroup* g2=map->objectGroupNamed("obj222");
    
    CCDictionary* dic4=g2->objectNamed("uuu");
    int x4 = dic4->valueForKey("x")->intValue();
    int y4 = dic4->valueForKey("y")->intValue();
    CCSprite* pSprite4 = CCSprite::create("CloseNormal.png");
    map->addChild(pSprite4);
    pSprite4->setPosition(ccp(x4, y4));
    
    CCDictionary* dic5=g2->objectNamed("ooo");
    int x5 = dic5->valueForKey("x")->intValue();
    int y5 = dic5->valueForKey("y")->intValue();
    CCSprite* pSprite5 = CCSprite::create("CloseNormal.png");
    map->addChild(pSprite5);
pSprite5->setPosition(ccp(x5, y5));
}

效果图:


2017-02-17 11:31:25 slaron 阅读数 2180
  • Cocos2d-x 3.x项目实战:星空大战(射击类游戏)

    本课程是《从零开始掌握Cocos2d-x 3.0(基于3.0正式版) 》课程配套的项目实战课程。建议对Cocos2d-x 3.0不了解的同学先学习该课程。本课程将利用《从零开始掌握Cocos2d-x 3.0(基于3.0正式版) 》中讲解的知识开发一款射击类游戏:星空大战(与打飞机游戏类似)。从这个项目中可学习到如何利用Cocos2d-x 3.0的相关知识开发一款完整的射击类游戏。

    18362 人正在学习 去看看 李宁
瓦块地图编辑器Tiled在游戏制作中是比较通用的了,cocos2dx支持载入TiledMap,以cocos2d 3.x版本为例
1、加载瓦块地图:
    //读取
    auto m_pTileMap = TMXTiledMap::create("test.tmx");
    m_pTileMap->setPosition(Vec2::ZERO);
    this->addChild(m_pTileMap);
2、获得瓦块地图的每一格大小
    //图块大小
    auto m_nTs_width = m_pTileMap->getTileSize().width;
    auto m_nTs_height = m_pTileMap->getTileSize().height;
3、获得该tiled行列数
    Size m_nTSize = m_pTileMap->getMapSize();
4、读取对象组和对象
    //获得points对象组
    TMXObjectGroup *points = m_pTileMap->getObjectGroup("points");

    //获得一个对象
    points->getObject("test1");

    //获得对象组中的所有对象(返回类型是ValueVector)
    auto m_point = points->getObjects();
    for (auto& obj : m_point)
    {       
        //每一个对象的属性
        auto dic = obj.asValueMap();
        //如坐标值
        float x = dic.at("x").asFloat();
        float y = dic.at("y").asFloat();
    }
5、读取图层
    TMXLayer *layer = m_pTileMap->getLayer("layer");
    //解决图片模糊问题,根据情况添加
    layer ->getTexture()->setAntiAliasTexParameters();
2016-05-11 13:46:13 potato47 阅读数 33313
  • Cocos2d-x 3.x项目实战:星空大战(射击类游戏)

    本课程是《从零开始掌握Cocos2d-x 3.0(基于3.0正式版) 》课程配套的项目实战课程。建议对Cocos2d-x 3.0不了解的同学先学习该课程。本课程将利用《从零开始掌握Cocos2d-x 3.0(基于3.0正式版) 》中讲解的知识开发一款射击类游戏:星空大战(与打飞机游戏类似)。从这个项目中可学习到如何利用Cocos2d-x 3.0的相关知识开发一款完整的射击类游戏。

    18362 人正在学习 去看看 李宁

我特别喜欢瓦片类的游戏,正好在学习Cocos Creator,所以想自己做几个。可是官方文档关于TiledMap组件的介绍太少了。网上一搜,我滴天,全是cocos2d的,就让我来填补一下这个空白吧。

Tiled Map Editor:

下载(window 64位汉化,包括下面用到的资源和工程源码):
http://download.csdn.net/download/potato47/9516578

edit(编辑)->preferences(参数)里面可以设置语言

TiledMap制作:

新建一张地图
这里写图片描述

建立三个图层和一个对象层并将资源图块导入
这里写图片描述

ground层:用ground图块填充满(按住鼠标左键)
barriers层:用barrier图块
stars层:用star图块
最终效果如下图
这里写图片描述

选择players对象层,在如图位置插入两个图块对象,并更改名称如图
这里写图片描述

给星星添加一个属性
这里写图片描述

保存为tmx文件,和图片文件放在一起

Cocos Creator中使用TiledMap:

1.新建一个TiledMapTest工程,创建一个Game场景
2.将刚才生成的tmx文件和相关图片一起添加到工程
3.将map.tmx文件拖入层级管理器或者属性编辑器,就会自动生成map节点以及其子节点(也就是图层节点)【没有对象层节点
4.最后将player(安卓小机器人)图片拖入(位置随意),创建player节点,并使其为map节点的子节点。
5.调整map和player节点的锚点都为(0,0)也就是左下角
6.创建map.js脚本添加到map节点
7.map节点下添加Map Loaded事件(map节点->map脚本->loadMap方法)
最终如下图:
这里写图片描述

map.js:

cc.Class({
    extends: cc.Component,

    properties: {

    },

    onLoad: function () {
        this.player = this.node.getChildByName('player');
        var self = this;
        cc.eventManager.addListener({
            event: cc.EventListener.KEYBOARD,
            onKeyPressed: function(keyCode, event) {
                var newTile = cc.p(self.playerTile.x, self.playerTile.y);
                switch(keyCode) {
                    case cc.KEY.up:
                        newTile.y -= 1;
                        break;
                    case cc.KEY.down:
                        newTile.y += 1;
                        break;
                    case cc.KEY.left:
                        newTile.x -= 1;
                        break;
                    case cc.KEY.right:
                        newTile.x += 1;
                        break;
                    default:
                        return;
                }

                self.tryMoveToNewTile(newTile);

            }
        },self);
    },



    tryMoveToNewTile: function(newTile) {
        var mapSize = this.tiledMap.getMapSize();
        if (newTile.x < 0 || newTile.x >= mapSize.width) return;
        if (newTile.y < 0 || newTile.y >= mapSize.height) return;

        if (this.barriers.getTileGIDAt(newTile)) {//GID=0,则该Tile为空
            cc.log('This way is blocked!');
            return false;
        }

        this.tryCatchStar(newTile);

        this.playerTile = newTile;
        this.updatePlayerPos();

        if (cc.pointEqualToPoint(this.playerTile, this.endTile)) {
            cc.log('succeed');
        }
    },

    tryCatchStar: function(newTile){
        var GID = this.stars.getTileGIDAt(newTile);
        var prop = this.tiledMap.getPropertiesForGID(GID);
        if(prop.isStar)
        {
            this.stars.removeTileAt(newTile);
        }
    },

    //加载地图文件时调用
    loadMap: function () {
        //初始化地图位置
        this.node.setPosition(cc.visibleRect.bottomLeft);
        //地图
        this.tiledMap = this.node.getComponent(cc.TiledMap);
        //players对象层
        var players = this.tiledMap.getObjectGroup('players');
        //startPoint和endPoint对象
        var startPoint = players.getObject('startPoint');
        var endPoint = players.getObject('endPoint');
        //像素坐标
        var startPos = cc.p(startPoint.x, startPoint.y);
        var endPos = cc.p(endPoint.x, endPoint.y);
        //障碍物图层和星星图层
        this.barriers = this.tiledMap.getLayer('barriers');
        this.stars = this.tiledMap.getLayer('stars');
        //出生Tile和结束Tile
        this.playerTile = this.startTile = this.getTilePos(startPos);
        this.endTile = this.getTilePos(endPos);
        //更新player位置
        this.updatePlayerPos();

    },

    //将像素坐标转化为瓦片坐标
    getTilePos: function(posInPixel) {
        var mapSize = this.node.getContentSize();
        var tileSize = this.tiledMap.getTileSize();
        var x = Math.floor(posInPixel.x / tileSize.width);
        var y = Math.floor((mapSize.height - posInPixel.y) / tileSize.height);
        return cc.p(x, y);
    },


    updatePlayerPos: function() {
        var pos = this.barriers.getPositionAt(this.playerTile);
        this.player.setPosition(pos);
    },

});

最终效果:

这里写图片描述

(当主角走到终点时控制台输出“succeed”,我已经尽力让代码逻辑简单,有什么不懂的可以在评论里留言)

常用方法:

#CC.TiledMap:
~properties:
tmxFile//地图文件
mapLoaded//地图加载是调用的函数
~function:
getMapSize()//
setMapSize()//
getTileSize()//
setTileSize()//
getLayer(name)//returns TieldLayer
getObjectGroup(name)//returns TMXObjectGroup
getPropertiesForGID(GID)//returns Object(属性字典)

#CC.TieldLayer 
getPositionAt(pos)//returns Vec2(像素坐标) 参数是瓦片坐标
removeTileAt(pos)//瓦片坐标
getTileGIDAt(pos)//returns Number(全局唯一标识,0为空)
getTileAt(pos)//returns _ccsg.Sprite   //removeChild(sprite);
setTileGID(gid,pos)//相当于在pos位置添加GID的图块(原来的图块删除)
getTileSize()//
setTleSize()//
getMapTileSize()

#TMXObjectGroup:
~properties:
~function:
var getObject(var objectName)//返回属性字典
#_ccsg.Sprite://cocos js 里的Sprite,继承自CC.Node,而不是组件
~properties:
x
y
width
height
opacity
...//节点的属性都有
~function:
var setSpriteFrame(var spriteFrameName)
var runAction(var action)   
...//节点的方法都有

相关知识点:

  1. 图块放置的位置是基于像素坐标,而图块在map中的索引是基于瓦片坐标(整数),所以在脚本文件中要适时转变
  2. 对象层的对象(比如我们上面做的两个player point),在Cocos Creator中是不会显示的
  3. 对象层记录的是位置信息,图层记录的是图片信息
  4. .tmx文件其实保存的图块的一种映射关系,所以图块文件和地图文件要始终放在一起,不然可能会显示出错
  5. GID是图块在一个地图文件中的唯一ID,(图块指的是右下角的图块文件,每一个图块都不相同,瓦片指的指地图中的块,可以是相同的图块),GID为0说明该Tile的图块为空
  6. 当利用getPropertiesForGID(GID)之类的方法时,得到的返回值是属性字典,可以直接通过点方法得到其属性值,属性值都是字符串类型
  7. 当用到getTileAt(pos)时,得到的返回值是Cocos2d 的Sprite,而不是Cocos Creator的Sprite,相关方法可以查找Cocos2d js的API,需要注意的一点是,Cocos2d的Sprite是继承自节点的,而不是组件式,所以我们可以直接这样写“mySprite.x = 100”而不是“mySprite.node.x = 100”
  8. 地图中同一层只能使用一张图集里的图块

后面我会写几个TileMap相关的游戏教程,更新会在微信公众号(xinshouit)提醒:欢迎关注哈

cocos2dx TiledMap

阅读数 659

没有更多推荐了,返回首页