cocos2dx 精灵的碰撞检测和消灭(3)
2013-12-02 15:45
501 查看
在上一篇的基础上增加了一点内容,必要的注释都写在代码里了,,就直接贴代码吧,我也懒得写详细的过程。
HelloWorldSence.h
HelloWorldScence.cpp
运行结果截图:
HelloWorldSence.h
#ifndef __HELLOWORLD_SCENE_H__ #define __HELLOWORLD_SCENE_H__ #include "cocos2d.h" using namespace cocos2d; class HelloWorld : public cocos2d::CCLayerColor { public: // Method 'init' in cocos2d-x returns bool, instead of 'id' in cocos2d-iphone (an object pointer) virtual bool init(); // there's no 'id' in cpp, so we recommend to return the class instance pointer static cocos2d::CCScene* scene(); // a selector callback void menuCloseCallback(CCObject* pSender); // preprocessor macro for "static create()" constructor ( node() deprecated ) CREATE_FUNC(HelloWorld); void addTarget(); void spriteMoveFinished(CCNode *sender); void gameLogic(cocos2d::CCTime dt); void ccTouchesEnded(CCSet *touches, CCEvent *event); CCArray *aarayTarget;//敌人 CCArray *arrayProjectile;//飞镖 void update(CCTime dt); }; #endif // __HELLOWORLD_SCENE_H__
HelloWorldScence.cpp
#include "HelloWorldScene.h" #include "SimpleAudioEngine.h" using namespace cocos2d; using namespace CocosDenshion; CCScene* HelloWorld::scene() { // 'scene' is an autorelease object CCScene *scene = CCScene::create(); // 'layer' is an autorelease object HelloWorld *layer = HelloWorld::create(); // add layer as a child to scene scene->addChild(layer); // return the scene return scene; } // on "init" you need to initialize your instance bool HelloWorld::init() { ////////////////////////////// // 1. super init first if ( CCLayerColor::initWithColor(ccc4(255, 255, 255, 255)) ) { CCSize winSize = CCDirector::sharedDirector()->getWinSize();//获取屏幕大小 arrayProjectile = CCArray::create(); aarayTarget = CCArray::create(); float sprite_scale = 2.0; CCSprite *Player = CCSprite::create("Player.png"); Player->setScale(sprite_scale); Player->setPosition(ccp(Player->getContentSize().width*sprite_scale/2.0, winSize.height/2.0)); this->addChild(Player); aarayTarget->retain(); arrayProjectile->retain(); this->schedule(schedule_selector(HelloWorld::gameLogic), 1.0); this->schedule(schedule_selector(HelloWorld::update)); this->setTouchEnabled(true); return true; } else{ return false; } } void HelloWorld::gameLogic(cocos2d::CCTime dt){ this->addTarget(); } void HelloWorld::addTarget(){ CCSize winSize = CCDirector::sharedDirector()->getWinSize(); CCSprite *target = CCSprite::create("Target.png"); //随机位置 int minY = target->getContentSize().height/2.0; int maxY = winSize.height - target->getContentSize().height/2.0; int rangeY = maxY - minY; int actualY = rand()%rangeY + minY; target->setPosition(ccp(winSize.width - target->getContentSize().width/2.0, actualY)); target->setTag(1); this->addChild(target); aarayTarget->addObject(target); //随机速度 float minDuration = 2.0; float maxDuration = 4.0; int rangeDuration = maxDuration - minDuration; float actualDuration = rand()%rangeDuration + minDuration; CCFiniteTimeAction *actionMove = CCMoveTo::create(actualDuration, ccp(0 - target->getContentSize().width/2.0, actualY));//0代表屏幕外,这句表示在3秒内从初始位置移动到屏幕外 //增加一个回调函数,回收移动到屏幕外的精灵 CCFiniteTimeAction *actionMoveDone = CCCallFuncN::create(this, callfuncN_selector(HelloWorld::spriteMoveFinished)); target->runAction(CCSequence::create(actionMove,actionMoveDone,NULL)); } void HelloWorld::spriteMoveFinished(cocos2d::CCNode *sender){ CCSprite *sprite = (CCSprite *)sender; // this->removeChild(sprite, true); if (sprite->getTag() == 1) { aarayTarget->removeObject(sprite);//清除敌人 }else if(sprite->getTag() == 2){ arrayProjectile->removeObject(sprite);//清除飞镖 } } //发射飞镖 void HelloWorld::ccTouchesEnded(cocos2d::CCSet *touches, cocos2d::CCEvent *event){ CCTouch *touch = (CCTouch *)touches->anyObject(); CCPoint location = touch->getLocationInView(); location = this->convertTouchToNodeSpace(touch); CCSize winSize = CCDirector::sharedDirector()->getWinSize(); CCSprite *projectile = CCSprite::create("Projectile.png"); projectile->setPosition(ccp(20, winSize.height/2)); float offX = location.x - projectile->getPositionX(); float offY = location.y - projectile->getPositionY(); if (offX <= 0) { return; } projectile->setTag(2); this->addChild(projectile); arrayProjectile->addObject(projectile); float angle = offY/offX; float realX= winSize.width + projectile->getContentSize().width/2; float realY = realX * angle + projectile->getPositionY(); CCPoint finalPosition = ccp(realX, realY); //获取飞镖飞行时间 float length = sqrtf(realX *realX + realY*realY); float velocity = 480; float realMoveDuration = length/velocity; projectile->runAction(CCSequence::create(CCMoveTo::create(realMoveDuration, finalPosition),CCCallFuncN::create(this, callfuncN_selector(HelloWorld::spriteMoveFinished)),NULL)); } //碰撞检测,消除飞镖和敌人 void HelloWorld::update(cocos2d::CCTime dt){ for (int i = 0; i < aarayTarget->count(); i++) { CCSprite *target = (CCSprite *)aarayTarget->objectAtIndex(i); for (int j = 0; j < arrayProjectile->count(); j++) { CCSprite *projectile = (CCSprite *)arrayProjectile->objectAtIndex(j); if (target->boundingBox().intersectsRect(projectile->boundingBox())) { aarayTarget->removeObjectAtIndex(i); arrayProjectile->removeObjectAtIndex(j); this->removeChild(target); this->removeChild(projectile); break; } } } } void HelloWorld::menuCloseCallback(CCObject* pSender) { CCDirector::sharedDirector()->end(); #if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS) exit(0); #endif }
运行结果截图:
相关文章推荐
- cocos2dx 精灵的碰撞检测和消灭
- cocos2dx中精灵的实时碰撞检测
- cocos2dx 3.x(精灵的碰撞检测,点击移动与拖动精灵)
- 【COCOS2DX-游戏开发之三七】圆与旋转矩形的碰撞检测(下篇)
- TiledMapEditor创建地图,精灵在地图上下左右移动,尚未实现碰撞检测功能
- cocos2dx 碰撞检测
- Cocos2d-x 精灵碰撞检测(方法一)
- Cocos2d-x Tiled地图编辑器(二)精灵走动起来、碰撞检测
- XNA4.0学习笔记2:控制精灵和碰撞检测
- COCOS2DX,cocostudio::ColliderDetector 简单介绍 骨骼动画绑定碰撞区域进行碰撞检测
- cocos2dx碰撞检测实现
- Cocos2d-x地图随精灵无限滚动与边缘检测----之游戏开发《赵云要格斗》(3) cocos2dx 3.3移植版
- J2ME下的游戏精灵的碰撞检测 推荐
- J2ME下的游戏精灵的碰撞检测
- 消灭星星(四)碰撞检测
- 8.4.1.6_图像与精灵的碰撞检测
- Cocos2dx 多边形碰撞检测
- cocos2dx物理引擎和碰撞检测(三)
- cocos2dx 缩放场景以后的碰撞检测跟触摸
- cocos2dx - JS - 碰撞检测