(1)头文件中
#include <iostream>
#include "cocos2d.h"
using namespace cocos2d;
class AA:public CCLayer
{
public:
virtual bool init();
static CCScene *scene();
CREATE_FUNC(AA);
CCSprite *_player;
int count;
bool mode;
CCArray *bulletArray;
CCArray *enemyArray;
CCTMXTiledMap *_tileMap;
CCTMXTiledMap *_titleMap;
CCTMXLayer *wall,*foreground;
CCPoint mapPoint,heroPoint,beginPoint;
CCLabelTTF *label;
//碰撞检测
void detection();
bool iscallision(CCSprite *mysprite,CCSprite *testsprite);
CCRect getRect(CCSprite *sprite);
//触摸事件
virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent);
virtual void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent);
virtual void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent);
virtual void ccTouchCancelled(CCTouch *pTouch, CCEvent *pEvent);
void goon(CCNode *pSender);
void toggleGame(CCObject *pSender);
void targetFinish(CCNode *pSender);
};
(2)实现文件中//
// AA.cpp
// date10
//
// Created by Student on 14-9-22.
//
//
#include "AA.h"
CCScene *AA::scene()
{
CCScene *s=CCScene::create();
AA *layer=AA::create();
s->addChild(layer);
return s;
}
bool AA::init()
{
if(!CCLayer::init())
{
return false;
}
mode=true;
//初始化数组
bulletArray = CCArray::create();
bulletArray->retain();
enemyArray = CCArray::create();
enemyArray->retain();
//加载瓦片地图
_tileMap=CCTMXTiledMap::create("ThefirstTiled1.tmx");
_tileMap->setPosition(mapPoint);
addChild(_tileMap);
//读取瓦片地图中的层和对象
wall=_tileMap->layerNamed("wall");
foreground=_tileMap->layerNamed("water");
CCTMXObjectGroup *objects=_tileMap->objectGroupNamed("hero");
CCDictionary *spawnPoint=objects->objectNamed("pa");
heroPoint.x=spawnPoint->valueForKey("x")->floatValue();
heroPoint.y=spawnPoint->valueForKey("y")->floatValue();
CCLog("x=%f,y=%f",heroPoint.x,heroPoint.y);
//加载英雄到界面
_player=CCSprite::create("www.png");
_player->setAnchorPoint(CCPoint(0,0));
_player->setPosition(heroPoint);
_tileMap->addChild(_player,0);
//加载敌人到界面
for(int i=0;i<int(objects->getObjects()->count());i++) //得到敌人的数量
{
CCDictionary *enemy=(CCDictionary *)objects->getObjects()->objectAtIndex(i);
if(enemy->valueForKey("n")->intValue()==1)
{
CCSprite *s=CCSprite::create("enemy1.png");
float x=enemy->valueForKey("x")->floatValue();
float y=enemy->valueForKey("y")->floatValue();
s->setPosition(ccp(x,y));
s->setAnchorPoint(CCPoint(0,0));
_tileMap->addChild(s,4);
enemyArray->addObject(s);
CCActionInterval *move=CCMoveBy::create(0.5,CCPoint(_player->getPosition().x-s->getPosition().x>0?10:-10,_player->getPosition().y-s->getPosition().y>0?10:-10));
//goon 表示不断的移动
CCFiniteTimeAction *func=CCCallFuncN::create(this,callfuncN_selector(AA::goon));
s->runAction(CCSequence::create(move,func,NULL));
}
}
//加载开关选项
CCMenuItem *oon,*ooff;
oon=CCMenuItemImage::create("projectile-button-on.png","projectile-button-on.png");
ooff=CCMenuItemImage::create("projectile-button-off.png","projectile-button-off.png");
CCMenuItemToggle *toggle=CCMenuItemToggle::createWithTarget(this,
menu_selector(AA::toggleGame),
ooff,oon,NULL);
CCMenu *menu=CCMenu::create(toggle,NULL);
menu->setPosition(ccp(oon->getContentSize().width/2,oon->getContentSize().height/2));
addChild(menu);
//加入触摸的单例
CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, 1, true);
//碰撞检测的调用
this->schedule(schedule_selector(AA::detection), 0.2);
label=CCLabelTTF::create("0","Arial",20);
label->setPosition(ccp(CCDirector::sharedDirector()->getWinSize().width-label->getContentSize().width/2,label->getContentSize().height/2));
addChild(label,10);
return true;
}
//表示敌人不断移动的距离
void AA::goon(CCNode *pSender)
{
CCLOG("goon");
CCSprite *s=(CCSprite *)pSender;
CCActionInterval *move=CCMoveBy::create(0.5,CCPoint(_player->getPosition().x-s->getPosition().x>0?10:-10,_player->getPosition().y-s->getPosition().y>0?10:-10));
CCFiniteTimeAction *func=CCCallFuncN::create(this,callfuncN_selector(AA::goon));
s->runAction(CCSequence::create(move,func,NULL));
}
void AA::toggleGame(CCObject *pSender)
{
mode=mode?false:true;
}
bool AA::ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent)
{
beginPoint=pTouch->getLocation();
return true;
}
void AA::ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent)
{
/*
if(mode)
{
//得到先前的坐标(0,0)
CCPoint PP=pTouch->getPreviousLocation();
//得到当前的坐标
CCPoint np=pTouch->getLocation();
//两坐标相减
CCPoint dp=ccpSub(np, PP);
//向左为负 右侧为正
if(_titleMap->getPosition().x+dp.x>-480 && _titleMap->getPosition().x+dp.x<0)
{
mapPoint=ccp(_titleMap->getPosition().x+dp.x,0);
_titleMap->setPosition(mapPoint);
}
}
*/
if(mode)
{
CCPoint pp=pTouch->getPreviousLocation();
CCPoint np=pTouch->getLocation();
CCPoint dp=ccpSub(np,pp);
if(_tileMap->getPosition().x+dp.x>-480&&_tileMap->getPosition().x+dp.x<0)
{
mapPoint=ccp(_tileMap->getPosition().x+dp.x,0);
_tileMap->setPosition(mapPoint);
}
}
}
void AA::ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent)
{
/*
//地图里的坐标(0,0)是从左上角开始的
步骤:
1、判断是否点击
2、判断点击的位置与英雄的位置的X,Y的差值 比较DX与DY的大小
3、判断英雄的X做标要大于点击的X坐标 才能向左
4、判断移动时是否撞击墙和移出地图外
*/
//获得点击的位置
/*
CCPoint pp=pTouch->getLocation();
if(mode)
{
//是点击不是滑动 在原地点击下又点击离开
if(beginPoint.x==pp.x && beginPoint.y==pp.y)//beginPoint是开始触摸的位置
{
//—player的位置
CCPoint pt=_player->getPosition();
//判断是否 x>y
if(fabs(pt.x-(pp.x-mapPoint.x))>=fabs( pt.y-(pp.y-mapPoint.y)) )
{
点击点向左移动 英雄的X做标要大于点击的X坐标 才能向左
if(pt.x>=pp.x-mapPoint.x)
{
if(9-_player->getPosition().y/32<10 && 9-_player->getPosition().y/32>=0&&
_player->getPosition().x/32-1<50&&_player->getPosition().x/32-1>=0&&
!(wall->tileGIDAt(ccp(_player->getPosition().x/32-1,9-_player->getPosition().y/32))))//判断是否是地图外面,或者是不是墙
{
_player->setPosition(ccp(_player->getPosition().x-32,_player->getPosition().y));
if(foreground->tileGIDAt(ccp(_player->getPosition().x/32,9-_player->getPosition().y/32)))
{
foreground->removeTileAt(ccp(_player->getPosition().x/32,9-_player->getPosition().y/32));
count++;
CCString *temp=CCString::createWithFormat("%d",count);
label->setString(temp->getCString());
}
}
}
else
{
if(9-_player->getPosition().y/32<10&&9-_player->getPosition().y/32>=0&&_player->getPosition().x/32+1<50&&_player->getPosition().x/32+1>=0&&!(wall->tileGIDAt(ccp(_player->getPosition().x/32+1,9-_player->getPosition().y/32))))
{
_player->setPosition(ccp(_player->getPosition().x+32,_player->getPosition().y));
if(foreground->tileGIDAt(ccp(_player->getPosition().x/32,9-_player->getPosition().y/32)))
{
foreground->removeTileAt(ccp(_player->getPosition().x/32,9-_player->getPosition().y/32));
count++;
CCString *temp=CCString::createWithFormat("%d",count);
label->setString(temp->getCString());
}
}
}
}
else
{
if(pt.y>=pp.y-mapPoint.y)
{
if(9-_player->getPosition().y/32+1<10&&9-_player->getPosition().y/32+1>=0&&_player->getPosition().x/32<50&&_player->getPosition().x/32>=0&&!(wall->tileGIDAt(ccp(_player->getPosition().x/32,9-_player->getPosition().y/32+1))))
{
_player->setPosition(ccp(_player->getPosition().x,_player->getPosition().y-32));
if(foreground->tileGIDAt(ccp(_player->getPosition().x/32,9-_player->getPosition().y/32)))
{
foreground->removeTileAt(ccp(_player->getPosition().x/32,9-_player->getPosition().y/32));
count++;
CCString *temp=CCString::createWithFormat("%d",count);
label->setString(temp->getCString());
}
}
}
else
{
if(9-_player->getPosition().y/32-1<10&&9-_player->getPosition().y/32-1>=0&&_player->getPosition().x/32<50&&_player->getPosition().x/32>=0&&!(wall->tileGIDAt(ccp(_player->getPosition().x/32,9-_player->getPosition().y/32-1))))
{
_player->setPosition(ccp(_player->getPosition().x,_player->getPosition().y+32));
if(foreground->tileGIDAt(ccp(_player->getPosition().x/32,9-_player->getPosition().y/32)))
{
foreground->removeTileAt(ccp(_player->getPosition().x/32,9-_player->getPosition().y/32));
count++;
CCString *temp=CCString::createWithFormat("%d",count);
label->setString(temp->getCString());
}
}
}
}
}
}
else
{
CCSprite *s=CCSprite::create("Projectile.png");
s->setPosition(_player->getPosition());
_tileMap->addChild(s,4);
bulletArray->addObject(s);
float dx=pp.x-_player->getPosition().x;
float dy=pp.y-_player->getPosition().y;
if(dx>0)
{
float lx=32*30-_player->getPosition().x;
float ly=dy/dx*lx;
CCActionInterval *move=CCMoveBy::create(3,ccp(lx+s->getContentSize().width,ly));
CCFiniteTimeAction *ff=CCCallFuncN::create(this,callfuncN_selector(AA::targetFinish));
s->runAction(CCSequence::create(move,ff,NULL));
}
else
{
float lx=0-_player->getPosition().x;
float ly=dy/dx*lx;
CCActionInterval *move=CCMoveBy::create(3,ccp(lx-s->getContentSize().width,ly));
CCFiniteTimeAction *ff=CCCallFuncN::create(this,callfuncN_selector(AA::targetFinish));
s->runAction(CCSequence::create(move,ff,NULL));
}
}
*/
CCPoint pp=pTouch->getLocation();
if(mode)//移动
{
if(beginPoint.x==pp.x&&beginPoint.y==pp.y)
{
cocos2d::CCPoint pt=_player->getPosition();
//dx>dy
if(fabs(pt.x-(pp.x-mapPoint.x))>=fabs(pt.y-(pp.y-mapPoint.y)))
{
//左移
if(pt.x>=pp.x-mapPoint.x)
{
if(9-_player->getPosition().y/32<10&&9-_player->getPosition().y/32>=0&&
_player->getPosition().x/32-1<50&&_player->getPosition().x/32-1>=0&&
!(wall->tileGIDAt(ccp(_player->getPosition().x/32-1,9-_player->getPosition().y/32))))//判断是否是地图外面,或者是不是墙 //tileGIDAt表示有没有的意思
{
//32表示32个像素 表示向左挪动了1个单位
_player->setPosition(ccp(_player->getPosition().x-32,_player->getPosition().y));
//判断西瓜的和_player相撞
if(foreground->tileGIDAt(ccp(_player->getPosition().x/32,9-_player->getPosition().y/32)))
{
//西瓜的位置消失
foreground->removeTileAt(ccp(_player->getPosition().x/32,9-_player->getPosition().y/32));
count++;
CCString *temp=CCString::createWithFormat("%d",count);
label->setString(temp->getCString());
}
}
}
//右移
else
{
if(9-_player->getPosition().y/32<10&&9-_player->getPosition().y/32>=0&&_player->getPosition().x/32+1<50&&_player->getPosition().x/32+1>=0&&!(wall->tileGIDAt(ccp(_player->getPosition().x/32+1,9-_player->getPosition().y/32))))
{
_player->setPosition(ccp(_player->getPosition().x+32,_player->getPosition().y));
if(foreground->tileGIDAt(ccp(_player->getPosition().x/32,9-_player->getPosition().y/32)))
{
foreground->removeTileAt(ccp(_player->getPosition().x/32,9-_player->getPosition().y/32));
count++;
CCString *temp=CCString::createWithFormat("%d",count);
label->setString(temp->getCString());
}
}
}
}
//dx<dy
else
{
//下移
if(pt.y>=pp.y-mapPoint.y)
{
if(9-_player->getPosition().y/32+1<10&&9-_player->getPosition().y/32+1>=0&&_player->getPosition().x/32<50&&_player->getPosition().x/32>=0&&!(wall->tileGIDAt(ccp(_player->getPosition().x/32,9-_player->getPosition().y/32+1))))
{
_player->setPosition(ccp(_player->getPosition().x,_player->getPosition().y-32));
if(foreground->tileGIDAt(ccp(_player->getPosition().x/32,9-_player->getPosition().y/32)))
{
foreground->removeTileAt(ccp(_player->getPosition().x/32,9-_player->getPosition().y/32));
count++;
CCString *temp=CCString::createWithFormat("%d",count);
label->setString(temp->getCString());
}
}
}
//上移
else
{
if(9-_player->getPosition().y/32-1<10&&9-_player->getPosition().y/32-1>=0&&_player->getPosition().x/32<50&&_player->getPosition().x/32>=0&&!(wall->tileGIDAt(ccp(_player->getPosition().x/32,9-_player->getPosition().y/32-1))))
{
_player->setPosition(ccp(_player->getPosition().x,_player->getPosition().y+32));
if(foreground->tileGIDAt(ccp(_player->getPosition().x/32,9-_player->getPosition().y/32)))
{
foreground->removeTileAt(ccp(_player->getPosition().x/32,9-_player->getPosition().y/32));
count++;
CCString *temp=CCString::createWithFormat("%d",count);
label->setString(temp->getCString());
}
}
}
}
}
}
//英雄发射子弹
else
{
CCSprite *s=CCSprite::create("Projectile.png");
s->setPosition(_player->getPosition());
_tileMap->addChild(s,4);
bulletArray->addObject(s);
float dx=pp.x-_player->getPosition().x;
float dy=pp.y-_player->getPosition().y;
if(dx>0)
{
float lx=32*30-_player->getPosition().x;
float ly=dy/dx*lx;
CCActionInterval *move=CCMoveBy::create(3,ccp(lx+s->getContentSize().width,ly));
CCFiniteTimeAction *ff=CCCallFuncN::create(this,callfuncN_selector(AA::targetFinish));
s->runAction(CCSequence::create(move,ff,NULL));
}
else
{
float lx=0-_player->getPosition().x;
float ly=dy/dx*lx;
CCActionInterval *move=CCMoveBy::create(3,ccp(lx-s->getContentSize().width,ly));
CCFiniteTimeAction *ff=CCCallFuncN::create(this,callfuncN_selector(AA::targetFinish));
s->runAction(CCSequence::create(move,ff,NULL));
}
}
}
void AA::targetFinish(CCNode *pSender)
{
pSender->removeFromParent();
}
void AA::ccTouchCancelled(CCTouch *pTouch, CCEvent *pEvent)
{
}
//碰撞检测
void AA::detection()
{
/*
1、英雄与敌人碰撞
2、子弹与敌人碰撞
*/
//遍历敌人
for(int i=0;i<enemyArray->count();i++)
{
CCSprite *s=(CCSprite *)enemyArray->objectAtIndex(i);
//判断英雄是否和敌人碰撞
if(iscallision(_player, s))
{
CCLog("--------aaaaaaaa-------------");
}
}
//创建临时的数组
CCArray *bulletA=CCArray::create();
CCArray *enemyA=CCArray::create();
//遍历子弹
for(int i=0;i<bulletArray->count();i++)
{
CCSprite *bullet=(CCSprite *)bulletArray->objectAtIndex(i);
//遍历敌人
for(int j=0;j<enemyArray->count();j++)
{
CCSprite *enemy=(CCSprite *)enemyArray->objectAtIndex(i);
//判断子弹是否和敌人相撞
if(iscallision(bullet, enemy))
{
//这里移除后应该加入数组 否则会崩溃
enemy->removeFromParent();
bullet->removeFromParent();
bulletA->addObject(bullet);
enemyA->addObject(enemy);
}
}
}
//从数组中移除子弹
for(int i=0;i<bulletA->count();i++)
{
CCSprite *bullet = (CCSprite *) bulletA->objectAtIndex(i);
bulletArray->removeObject(bullet);
}
//从数组中移除敌人
for(int i=0;i<enemyA->count();i++)
{
CCSprite *enemy = (CCSprite *) enemyA->objectAtIndex(i);
enemyArray->removeObject(enemy);
}
}
//碰撞检测
bool AA::iscallision(CCSprite *mysprite,CCSprite *testsprite)
{
CCRect myrect=mysprite->boundingBox();
CCRect testrect=testsprite->boundingBox();
return myrect.intersectsRect(testrect);
}