Cocos2d-x碰撞检查与消灭的实现

  1. #ifndef __HELLOWORLD_SCENE_H__  
  2. #define __HELLOWORLD_SCENE_H__  
  3.   
  4. #include "cocos2d.h"  
  5. using namespace cocos2d;  
  6.   
  7. class HelloWorld : public cocos2d::CCLayerColor  
  8. {  
  9. public:  
  10.     // Method 'init' in cocos2d-x returns bool, instead of 'id' in cocos2d-iphone (an object pointer)  
  11.     virtual bool init();  
  12.   
  13.     // there's no 'id' in cpp, so we recommend to return the class instance pointer  
  14.     static cocos2d::CCScene* scene();  
  15.       
  16.     // a selector callback  
  17.     void menuCloseCallback(CCObject* pSender);  
  18.   
  19.     // preprocessor macro for "static create()" constructor ( node() deprecated )  
  20.     CREATE_FUNC(HelloWorld);  
  21.       
  22.     void addTarget();  
  23.     void spriteMoveFinished(CCNode *sender);  
  24.     void gameLogic(cocos2d::CCTime dt);  
  25.       
  26.     void ccTouchesEnded(CCSet *touches, CCEvent *event);  
  27.       
  28.     CCArray *aarayTarget;//敌人  
  29.     CCArray *arrayProjectile;//飞镖  
  30.     void update(CCTime dt);  
  31. };  
  32.   
  33. #endif // __HELLOWORLD_SCENE_H__  

HelloWorldScence.cpp

[objc] view
plain
copyprint?

  1. #include "HelloWorldScene.h"  
  2. #include "SimpleAudioEngine.h"  
  3.   
  4. using namespace cocos2d;  
  5. using namespace CocosDenshion;  
  6.   
  7. CCScene* HelloWorld::scene()  
  8. {  
  9.     // 'scene' is an autorelease object  
  10.     CCScene *scene = CCScene::create();  
  11.       
  12.     // 'layer' is an autorelease object  
  13.     HelloWorld *layer = HelloWorld::create();  
  14.   
  15.     // add layer as a child to scene  
  16.     scene->addChild(layer);  
  17.   
  18.     // return the scene  
  19.     return scene;  
  20. }  
  21.   
  22.   
  23.   
  24. // on "init" you need to initialize your instance  
  25. bool HelloWorld::init()  
  26. {  
  27.     //////////////////////////////  
  28.     // 1. super init first  
  29.     if ( CCLayerColor::initWithColor(ccc4(255, 255, 255, 255)) )  
  30.     {  
  31.           
  32.         CCSize winSize = CCDirector::sharedDirector()->getWinSize();//获取屏幕大小  
  33.           
  34.         arrayProjectile = CCArray::create();  
  35.         aarayTarget = CCArray::create();  
  36.           
  37.         float sprite_scale = 2.0;  
  38.         CCSprite *Player =  CCSprite::create("Player.png");  
  39.         Player->setScale(sprite_scale);  
  40.         Player->setPosition(ccp(Player->getContentSize().width*sprite_scale/2.0, winSize.height/2.0));  
  41.         this->addChild(Player);  
  42.           
  43.         aarayTarget->retain();  
  44.         arrayProjectile->retain();  
  45.           
  46.         this->schedule(schedule_selector(HelloWorld::gameLogic), 1.0);  
  47.         this->schedule(schedule_selector(HelloWorld::update));  
  48.         this->setTouchEnabled(true);  
  49.           
  50.         return true;  
  51.     }  
  52.     else{  
  53.         return false;  
  54.     }  
  55.   
  56.       
  57. }  
  58.   
  59. void HelloWorld::gameLogic(cocos2d::CCTime dt){  
  60.     this->addTarget();  
  61. }  
  62.   
  63.   
  64.   
  65. void HelloWorld::addTarget(){  
  66.       
  67.     CCSize winSize = CCDirector::sharedDirector()->getWinSize();  
  68.       
  69.     CCSprite *target = CCSprite::create("Target.png");  
  70.       
  71.     //随机位置  
  72.     int minY = target->getContentSize().height/2.0;  
  73.     int maxY = winSize.height - target->getContentSize().height/2.0;  
  74.     int rangeY = maxY - minY;  
  75.     int actualY = rand()%rangeY + minY;  
  76.       
  77.     target->setPosition(ccp(winSize.width - target->getContentSize().width/2.0, actualY));  
  78.     target->setTag(1);  
  79.     this->addChild(target);  
  80.     aarayTarget->addObject(target);  
  81.       
  82.     //随机速度  
  83.     float minDuration = 2.0;  
  84.     float maxDuration = 4.0;  
  85.     int rangeDuration = maxDuration - minDuration;  
  86.     float actualDuration = rand()%rangeDuration + minDuration;  
  87.       
  88.       
  89.       
  90.       
  91.     CCFiniteTimeAction *actionMove = CCMoveTo::create(actualDuration, ccp(0 - target->getContentSize().width/2.0, actualY));//0代表屏幕外,这句表示在3秒内从初始位置移动到屏幕外  
  92.       
  93.       
  94.     //增加一个回调函数,回收移动到屏幕外的精灵  
  95.     CCFiniteTimeAction *actionMoveDone = CCCallFuncN::create(this, callfuncN_selector(HelloWorld::spriteMoveFinished));  
  96.     target->runAction(CCSequence::create(actionMove,actionMoveDone,NULL));  
  97.       
  98. }  
  99.   
  100. void HelloWorld::spriteMoveFinished(cocos2d::CCNode *sender){  
  101.     CCSprite *sprite = (CCSprite *)sender;  
  102.    // this->removeChild(sprite, true);  
  103.     if (sprite->getTag() == 1) {  
  104.         aarayTarget->removeObject(sprite);//清除敌人  
  105.     }else if(sprite->getTag() == 2){  
  106.         arrayProjectile->removeObject(sprite);//清除飞镖  
  107.     }  
  108. }  
  109.   
  110.   
  111. //发射飞镖  
  112. void HelloWorld::ccTouchesEnded(cocos2d::CCSet *touches, cocos2d::CCEvent *event){  
  113.     CCTouch *touch = (CCTouch *)touches->anyObject();  
  114.     CCPoint location = touch->getLocationInView();  
  115.     location = this->convertTouchToNodeSpace(touch);  
  116.       
  117.     CCSize winSize = CCDirector::sharedDirector()->getWinSize();  
  118.       
  119.     CCSprite *projectile = CCSprite::create("Projectile.png");  
  120.     projectile->setPosition(ccp(20, winSize.height/2));  
  121.       
  122.     float offX = location.x - projectile->getPositionX();  
  123.     float offY = location.y - projectile->getPositionY();  
  124.       
  125.     if (offX <= 0) {  
  126.         return;  
  127.     }  
  128.     projectile->setTag(2);  
  129.     this->addChild(projectile);  
  130.     arrayProjectile->addObject(projectile);  
  131.       
  132.     float angle = offY/offX;  
  133.     float realX= winSize.width + projectile->getContentSize().width/2;  
  134.     float realY = realX * angle + projectile->getPositionY();  
  135.       
  136.     CCPoint finalPosition = ccp(realX, realY);  
  137.       
  138.     //获取飞镖飞行时间  
  139.     float length = sqrtf(realX *realX + realY*realY);  
  140.     float velocity = 480;  
  141.     float realMoveDuration = length/velocity;  
  142.       
  143.     projectile->runAction(CCSequence::create(CCMoveTo::create(realMoveDuration, finalPosition),CCCallFuncN::create(this, callfuncN_selector(HelloWorld::spriteMoveFinished)),NULL));  
  144. }  
  145.   
  146. //碰撞检测,消除飞镖和敌人  
  147. void HelloWorld::update(cocos2d::CCTime dt){  
  148.     for (int i = 0; i < aarayTarget->count(); i++) {  
  149.         CCSprite *target = (CCSprite *)aarayTarget->objectAtIndex(i);  
  150.         for (int j = 0; j < arrayProjectile->count(); j++) {  
  151.             CCSprite *projectile = (CCSprite *)arrayProjectile->objectAtIndex(j);  
  152.             if (target->boundingBox().intersectsRect(projectile->boundingBox())) {  
  153.                 aarayTarget->removeObjectAtIndex(i);  
  154.                 arrayProjectile->removeObjectAtIndex(j);  
  155.                 this->removeChild(target);  
  156.                 this->removeChild(projectile);  
  157.                   
  158.                 break;  
  159.             }  
  160.         }  
  161.     }  
  162. }  
  163.   
  164.   
  165.   
  166. void HelloWorld::menuCloseCallback(CCObject* pSender)  
  167. {  
  168.     CCDirector::sharedDirector()->end();  
  169.   
  170. #if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)  
  171.     exit(0);  
  172. #endif  
  173. }  
时间: 2024-09-17 04:35:06

Cocos2d-x碰撞检查与消灭的实现的相关文章

Cocos2D物理碰撞不按预期工作的排查工作

如果该碰撞的节点不碰撞或反过来不该碰的碰撞了,你可以检查一下几个方面: 1.对应2个节点的分类和掩码必须匹配.如果它们应该碰撞则一个节点的分类应该在另一个节点的掩码中,反之亦然. 2.注意空的分类和掩码区域表示匹配所有分类和掩码.这可能和你想要的意图完全相反. 3.静态对象之间不能碰撞.比如例子中的Gear1.ccb(齿轮节点)不能相互碰撞. 4.所有节点必须属于相同的父CCPhysicsNode节点(或者相同的祖父或曾祖父,以此类推). 5.尽管你可以在一个场景中添加多个CCPhysicsNo

Cocos2D的平台检查宏

为了避免在非iOS平台包含UIKit.h文件,需要在Prefix.pch文件中添加一个条件判断: #if __CC_PLATFORM_IOS #import <UIKit/UIKit.h> #endif Cocos2d提供3个宏允许你在建立目标文件时包含或排除代码,这取决于你的目标平台: __CC_PLATFORM_IOS __CC_PLATFORM_MAC __CC_PLATFORM_ANDROID 当在一个特定平台上编译时只有一个宏的值为1,其他都为0.

二十年前是怎样开发游戏的

知乎上有人问:"贴吧都是十五六岁就用引擎写游戏的天才,大家怎么看?",感觉现在做游戏真实一件幸福的事情呀,不尽想起当年开发游戏的各种艰辛. 现在做游戏很简单,大把代码给你参考,大把框架给你使用,Windows帮你作完了大部分事情.我们那个年纪写游戏时,家里还没有Internet,什么资料都查不到,什么开源引擎都没有,95年左右你要写一个游戏,你起码面临: 同显卡打交道,显卡著名的 ModeX显示模式,估计现在没几个人听过了吧,直接写显卡端口,N多trick才能初始化成功. 直接访问显存

【IOS(译)】游戏引擎剖析

本站文章均为 李华明Himi 原创,转载务必在明显处注明:  转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/iphone-cocos2d/406.html 为了解决"如何在IPHONE上创建一个游戏"这个大问题,我们需要首先解决诸如"如何显示图像"与"如何播放声音"等一系列小问题.这些问题关系到创建部分游戏引擎.就像人类的身体一样,游戏引擎的每个部分虽然不同,但是却都不可或缺.因此,首先从游戏引擎剖

java项目实战——Java打飞机小游戏(附完整源码)

写在前面 技术源于分享,所以今天抽空把自己之前用java做过的小游戏整理贴出来给大家参考学习.java确实不适合写桌面应用,这里只是通过这个游戏让大家理解oop面向对象编程的过程,纯属娱乐.代码写的很简单,也很容易理解,并且注释写的很清楚了,还有问题,自己私下去补课学习. 完整代码 敌飞机 import java.util.Random; 敌飞机: 是飞行物,也是敌人 public class Airplane extends FlyingObject implements Enemy { pr

c++-C++如何开发游戏服务端?

问题描述 C++如何开发游戏服务端? 对于动作类.格斗类游戏,有一个很大的问题,就是需要做碰撞检查和寻路. 如果是单机游戏,客户端有非常非常多的引擎,例如unity3d等. 但如果是网游对战游戏,如果都是客户端判断的话,容易不同步,也容易作弊. 我想请问,服务端做碰撞检查的话,有没有类似的引擎? 如果没有,一般该如何处理? 解决方案 你没有了解过游戏开发.根本不需要将这种表现同步. 动作类游戏,每个目标在服务端就是一个点,二点之间有攻击距离,在攻击距离内就可以攻击,否则不能,客户端发起攻击请求然

085_《Delphi经典游戏程序设计40例》

<Delphi经典游戏程序设计40例> Delphi 教程 系列书籍 (085) <Delphi经典游戏程序设计40例> 网友(邦)整理 EMail: shuaihj@163.com 下载地址: Part1 Part2 Part3 Part4 Part5 作者: (日)日高 徹 译者: 博硕文化 丛书名: 游戏编程大师系列 出版社:中国铁道出版社 ISBN:7113059848 上架时间:2004-12-16 出版日期:2004 年11月 开本:18开 页码:549 版次:1-1

java版飞机大战 实战项目详细步骤

分析 飞机大战 首先对这个游戏分析,在屏幕上的物体都是飞行物,我们可以把建一个类,让其他飞行物继承这个类.游戏中应有英雄机(也就是自己控制的飞机).敌人.而敌人应该分为打死给分的飞机(就是普通飞机),另一种就是打死有奖励的敌人.他们都应该是飞行物的子类,我们也可以为普通飞机和给奖励的敌人设一个接口让他们去实现接口,这样有利于以后的扩展,我在这里给的简化版的飞机大战,主要是为了让大家了解面向对象. 第一步建立飞行物类 import java.awt.image.BufferedImage; /**

中望CAD隆重推出水暖电工程设计解决方案

中望软件隆重推出中望水暖电工程设计解决方案(包括中望给排水.暖通.电气,以下简称"中望水暖电"),与中望CAD已有的中望建筑.结构系列软件构建成完整的工程建设行业CAD整体解决方案,将彻底解决图纸兼容性低.数据交互性差等工程建设领域中诸多阻碍CAD协同设计的难题. 本次发布的中望水暖电,是中望软件在积极匹配满足行业需求,引领CAD技术发展的基础上,采用BIM思想研发出来的新一代设计软件,实现施工图设计.专业(规范)计算与BIM全程互动,具有超强的兼容性.智能的设计功能和精准的分析能力,