游戏开发入门03

地图的制作

工具:tiled
步骤:
1.新建——指定宽度和高度——显示网格
2.讲拾取的图片拖到图块图层——拾取(进行填充背景)——拾取填充道路
3.讲地图保存——notepad打开——讲引入的图片的绝对路径改成相对路径(把中文改成英文)
4.图层——添加对象层(rode名字)
5.插入对象(将路按顺序点出来)

新建的地图用notepad打开
<?xml version="1.0" encoding="UTF-8"?>
<map version="1.0" orientation="orthogonal" width="14" height="6" tilewidth="46" tileheight="54">
 <tileset firstgid="1" name="bk1" tilewidth="46" tileheight="54">
  <image source="bk1.jpg" width="678" height="320"/>
 </tileset>
 <layer name="block" width="14" height="6">
  <data encoding="base64" compression="zlib">
   eJwTY2BgECMDW6BhQuK4zCDEprY+YtxMyBx8GADLYgpH
  </data>
 </layer>
 <objectgroup name="road" width="14" height="6">
  <object x="22" y="80"/>
  <object x="160" y="82"/>
  <object x="161" y="244"/>
  <object x="299" y="243"/>
  <object x="298" y="82"/>
  <object x="436" y="83"/>
  <object x="436" y="246"/>
  <object x="620" y="246"/>
 </objectgroup>
</map>

加载地图

 private void loadMap() {
    map = CCTMXTiledMap.tiledMap("map.tmx");
    map.setAnchorPoint(0.5f,0.5f);
    // 因为修改了锚点 ,所以坐标也是需要修改的
    map.setPosition(map.getContentSize().width/2, map.getContentSize().height/2);
    this.addChild(map);
}

加载地图

  // 解析地图
private void parserMap() {
    roadPoits = new ArrayList<CGPoint>();
    // 解析地图(对象层里面有road)
    CCTMXObjectGroup objectGroupNamed = map.objectGroupNamed("road");
    ArrayList<HashMap<String, String>> objects = objectGroupNamed.objects;
    for (HashMap<String, String> hashMap : objects) {
        int x = Integer.parseInt(hashMap.get("x"));
        int y = Integer.parseInt(hashMap.get("y"));
        //拿到我们画的每一个点
        CGPoint cgPoint = ccp(x, y);
        //讲所有的点放到集合里面
        roadPoits.add(cgPoint);
    }
}

加载雪花

 //加载雪花
private void loadParticle() {
    system = CCParticleSnow.node();
    // 设置雪花的样式
    system.setTexture(CCTextureCache.sharedTextureCache().addImage("f.png"));
    this.addChild(system, 1);
}

加载僵尸精灵

 // 展示僵尸
private void loadZombies() {
    sprite = CCSprite.sprite("z_1_01.png");
    sprite.setPosition(roadPoits.get(0));
    sprite.setAnchorPoint(0.5f, 0); // 设置锚点在两腿之间
    sprite.setScale(0.65f);
    sprite.setFlipX(true); // 水平翻转

    map.addChild(sprite);// 通过地图去添加僵尸 // 地图随着手指移动,僵尸也会随着手指移动

    // 序列帧的播放
    ArrayList<CCSpriteFrame> frames = new ArrayList<CCSpriteFrame>();
    String format = "z_1_%02d.png";// 02d 占位符 可以表示两位的整数 如果不足两位前面用0补足
    for (int i = 1; i <= 7; i++) {
        CCSpriteFrame displayedFrame = CCSprite.sprite(
                String.format(format, i)).displayedFrame();
        frames.add(displayedFrame);
    }

    // 配置序列帧的信息 参数1 动作的名字(给程序员看的) 参数2 每一帧播放的时间 单位秒 参数3 所有用到的帧
    CCAnimation anim = CCAnimation.animation("走路", 0.2f, frames);
    CCAnimate animate = CCAnimate.action(anim);
    // 序列帧动作默认是永不停止的循环
    CCRepeatForever forever = CCRepeatForever.action(animate);
    sprite.runAction(forever);

    moveToNext();
}
int speed=40;// 僵尸的速度
public void moveToNext() {
    position++;
    if (position < roadPoits.size()) {
        CGPoint cgPoint = roadPoits.get(position);
        //计算两点的距离除以速度得到距离
        float t= CGPointUtil.distance(roadPoits.get(position-1), cgPoint)/speed;
        CCMoveTo moveTo = CCMoveTo.action(t, cgPoint);
        // 调用一个对象的某一个方法
        CCSequence ccSequence = CCSequence.actions(moveTo,
                CCCallFunc.action(this, "moveToNext"));
        sprite.runAction(ccSequence);

    } else {
        //雪停下来
        system.stopSystem();// 停止粒子系统
        sprite.stopAllActions();//停止所有动作
        //  跳舞
        dance();
        SoundEngine engine=SoundEngine.sharedEngine();
        // 1 上下文 2. 音乐资源的id  3 是否循环播放
        engine.playSound(CCDirector.theApp, R.raw.psy, true);
    }
}

让地图跟随手指的移动而移动

@Override
public boolean ccTouchesMoved(MotionEvent event) {
    map.touchMove(event, map);// 地图会随着手指的移动而移动  如果该方法生效 必须保证地图的锚点在中间位置
    return super.ccTouchesMoved(event);
}

游戏的暂停与继续

@Override
public boolean ccTouchesBegan(MotionEvent event) {
    this.onExit(); // 暂停
    this.getParent().addChild(new PauseLayer());// 让场景添加新的图层 
    return super.ccTouchesBegan(event);
}

// 专门用来暂停的图层
private class PauseLayer extends CCLayer{
    private CCSprite heart;
    public PauseLayer(){
        this.setIsTouchEnabled(true);// 打开触摸事件的开关
        heart = CCSprite.sprite("heart.png");
        // 获取屏幕的尺寸
        CGSize winSize = CCDirector.sharedDirector().getWinSize();
        heart.setPosition(winSize.width/2, winSize.height/2);// 让图片再屏幕的中间

        this.addChild(heart);
    }
    // 当点击PauseLayer的时候 
    @Override
    public boolean ccTouchesBegan(MotionEvent event) {
        CGRect boundingBox = heart.getBoundingBox();
        //  把Android坐标系中的点 转换成Cocos2d坐标系中的点 
        CGPoint convertTouchToNodeSpace = this.convertTouchToNodeSpace(event);
        if(CGRect.containsPoint(boundingBox, convertTouchToNodeSpace)){// 确实点击了心


            this.removeSelf();// 回收当前图层
            DemoLayer.this.onEnter();//游戏继续
        }

        return super.ccTouchesBegan(event);
    }
}


源码:http://download.csdn.net/detail/qq_27280457/9628545

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值