地图的制作
工具: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