1. 程式人生 > >cocos2dx 精靈的碰撞檢測和消滅(3)

cocos2dx 精靈的碰撞檢測和消滅(3)

在上一篇的基礎上增加了一點內容,必要的註釋都寫在程式碼裡了,,就直接貼程式碼吧,我也懶得寫詳細的過程。

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 精靈碰撞檢測消滅3

在上一篇的基礎上增加了一點內容,必要的註釋都寫在程式碼裡了,,就直接貼程式碼吧,我也懶得寫詳細的過程。 HelloWorldSence.h #ifndef __HELLOWORLD_SCENE_H__ #define __HELLOWORLD_SCENE_H__ #in

數組矩陣3——Next Greater Element I

exp put and ann emp arr num .com esp https://leetcode.com/problems/next-greater-element-i/#/description You are given two arrays (withou

python爬蟲——與不斷變化的頁面死磕更新換代3

幸好 python爬蟲 不能 mat 實戰 抓包 數字 32bit 進行   經過上一次的實戰,手感有了,普羅西(霧)池也有了,再戰taobao/tmall   試著使用phantomJS爬手機端,結果發現爬來的tmall頁面全是亂碼,taobao頁面xpath識別錯誤。一

Appium-日誌配置檔案log.conf的讀取使用3

概述:  建立日誌配置檔案log.conf,配置內容如下: 格式:先定義,後描述; 例如先定義兩個記錄器,分別是keys=root,main; 然後描述記錄器的具體內容,例如logger_root記錄器的內容日誌級別level=DEBUG,日誌的輸出方式hanlder

python實現人臉檢測及識別3---- 識別真正的boss

    現在模型訓練已經完成,只需要一個預測函式判斷拍攝的照片是否是boss即可,在boss_train.py裡的Model新增predeict實現函式。 def predict(self, image): # 依然是根據後端系統確定維度順序

劍指Offer-遞迴迴圈-3

知識點:遞迴和迴圈 變態跳臺階 一隻青蛙一次可以跳上一級臺階,也可以跳上2級。。。。。。它也可以跳上n級。求該青蛙跳上一個n級的臺階總共有多少種跳法。 分析: 舉例子找規律; n=1 : 直接返回1; n=2:1-1 2 返回2; n=3:1-1-1 1-2 2-

Hadoop分散式檔案系統:HDFS架構設計3

HDFS被設計成能夠在一個大叢集中跨機器可靠地儲存超大檔案。它將每個檔案儲存成一系列的資料塊,除了最後一個,所有的資料塊都是同樣大小的。為了容錯,檔案的所有資料塊都會有副本。每個檔案的資料塊大小和副本系數都是可配置的。應用程式可以指定某個檔案的副本數目。副本系數可以在檔案建立的時候指定,也可以在之後改變。

挖掘頻繁模、關聯相關性3

模式評估方法 強規則不一定是有趣的 上面的例子雖然是強規則,然而,是一種規則誤導,因為購買錄影的概率是75%,比66%還高。事實上,計算機遊戲和錄影是負相關的,因為買一種實際上降低了買另一種的可能性。 從關聯分析到相關分析 支援度和置信度度量不足

WPF中繪畫動畫3

1. 矩形 矩形由筆觸(Stroke,即邊線)和填充(Fill)構成。Stroke屬性的設置於Line一樣,Fill屬性的資料型別是Brush。Brush是個抽象類,所以我們不可能拿一個Brush類的例項為Fill屬性賦值而只能用Brush派生類的例項進行賦值。 WPF的繪

【C++】類物件3—>> this指標

一、this指標的引入 我們在現實中,定義一個類都是根據一個需求來定義的。所以先來看一個常用的日期類 Date 。 class Date { public: void Print() { cout << _year << "-" << _month

GIS程式設計實現基本向量圖形系統的文件檢視3 實現向量圖形系統的檢視

GIS程式設計(七)實現基本向量圖形系統的文件和檢視(3)實現向量圖形系統的檢視本節將在上兩節的基礎之上,實現向量圖形系統的檢視,完成向量圖形系統的圖形元素繪製功能。1、建立座標系在組織一幅圖形時,採用哪一種映像方式組織向量圖形系統的座標系值得進行研究。在本向量圖形系統中,可

目標定位檢測系列3:交併比IOU非極大值抑制NMS的python實現

交併比(Intersection over Union)和非極大值抑制是(Non-Maximum Suppression)是目標檢測任務中非常重要的兩個概念。例如在用訓練好的模型進行測試時,網路會預測出一系列的候選框。這時候我們會用NMS來移除一些多餘的候選框。

網路穿透與音視訊技術3——NAT對映檢測常見網路穿越方法論NAT檢測

1、什麼是網路穿透 1.1、伺服器高負載狀態下的通訊問題 想想一下這種情況,多個處於不同內部網路的終端同時進行大檔案傳輸工作。我們最直接的思維模式能夠想到的就是這些終端首先將檔案傳輸到某各都能訪問到的伺服器上,再由伺服器進行中轉傳輸。是的,這個方式最簡單直接,

Cocos2d-x 精靈碰撞檢測方法一

宣告函式碰撞檢測函式,兩個精靈和重寫update bool isCollision( CCPoint p1,CCPoint p2,int w1,int h1,int w2,int h2 ); CCSprite *sp2; CCSprite *sp1; virtua

react系列3元件建立、檢測、移除隱藏

在v16.x版本,建立元件的主要方法React.createClass被移除了,新的建立方法(ES5)如下: var createReactClass = require('create-react-class'); var MyComp = createReactClas

第2章 GNS3PacketTracer網絡模擬器3_搭建Packet tracer實驗環境

router images conf address 3.2 發送 style 廣域網 eric 3. Packet tracer實驗環境 3.1 設置網絡拓撲圖 (1)配置路由器局域網和廣域網接口,如上圖(可雙擊相應的圖標,然後在命令行或圖形界面上進行IP地址等配置)

安卓MP3播放器開發實例3之進度條歌詞更新的實現

tac run detail datetime style mem poll() arc call 上一次談了音樂播放的實現,這次說下最復雜的進度條和歌詞更新。因為須要在播放的Activity和播放的Service間進行交互,所以就涉及了Activi

C++開發人臉性別識別教程3——OpenCv配置ImageWatch插件介紹

下劃線 toc bsp 對話 顯示 調試 詳細 結構 post   OpenCv是C++圖像處理的重要工具。這個人臉性別識別的項目就是借助OpenCv進行開發的。盡管網上已經有了非常多關於OpenCv的配置教程,但出於教程完整性考慮。這裏還是用專門的一篇博客來介紹Ope

Android多線程研究3——線程同步相互排斥及死鎖

getname read fix 輸出 ace obj ron tracking stack 為什麽會有線程同步的概念呢?為什麽要同步?什麽是線程同步?先看一段代碼:package com.maso.test; public class ThreadTest2 imp

ServletAndroid網絡交互基礎3

framework 方法 con 不一致 war 新建 name屬性 conf junit 在上一章中採用了最簡單的創建service端代碼方式,但在實際開發中一般都會採用比較成熟的框架。以下是完整的maven+spring mvc 創建service的