1. 程式人生 > >cocos2d-x 碰撞問題詳解(上)

cocos2d-x 碰撞問題詳解(上)

本次主要需要用到的函式
CC_SYNTHESIZE
此函式是為你的函式生成set,get方法的,如何僅僅需要全域性函式,只需要靜態方法即可

#define CC_SYNTHESIZE(varType, varName, funName)\
protected: varType varName;\
public: virtual varType get##funName(void) const { return varName; }\
public: virtual void set##funName(varType var){ varName = var; }

goto next
強制調到next後面的語句

Rect
rect 對應四個引數 繪製點的x座標,繪製點的y座標,寬度,高度
本次應該注意的問題:1.標頭檔案的順序一定要放好,否則莫名的錯誤一大堆,2.由於cocos中文亂碼問題,所以暫時以123代替相撞,以456代替不相撞,關於亂碼問題的解決筆者會在下次部落格中給出解決
cocos2d碰撞問題:點與矩形的碰撞,矩形與圓形的碰撞

這次我們主要介紹矩形與圓形的碰撞
首先以圓心為原點建立座標系
這裡寫圖片描述
分兩種情況:矩形在單個象限內,怎麼判斷矩形在一個象限裡?只要判斷對角
座標是否同號就可以了,1.單個象限判斷:判斷矩形四個頂點的距離與圓心的距離;
2.多個象限判斷:判斷矩形與圓的外切正方形是否相交

//碰撞問題的封裝(.h檔案)
#ifndef _circle_H_
#define _circle_H_

#include <iostream>
#include "cocos2d.h"
using namespace std;
using namespace cocos2d;

class circle
{
public:
    CC_SYNTHESIZE(float, _radius, Radius);
    CC_SYNTHESIZE(Point, _position, Position);

    circle(float radius, Point position):_radius(radius), _position(position){};

    bool
isContant(Rect rect); }; #endif /* !_circle_H_*/ </iostream>
//碰撞問題封裝(.cpp#include "circle.h"
USING_NS_CC;

bool circle::isContant(Rect rect){
    bool _isContant = false;
    Point origin = _position;   //圓心
    //圓的正切矩形
    Rect squareone = Rect::Rect(_position.x - _radius, _position.x - _radius, 2 * _radius, 2 * _radius);
    do 
    {
        Point rect0 = rect.origin;
        Point rect1 = rect.origin + Point(rect.size.width, 0);
        Point rect2 = rect.origin + Point(rect.size.width, rect.size.height);
        Point rect3 = rect.origin + Point(0, rect.size.height);
        Point pos[] = { rect0, rect1, rect2, rect3 };
        if ((pos[1].x-origin.x)*(pos[2].x-origin.x)>0&&(pos[1].y-origin.y)*(pos[2].y - origin.y)>0)
        {
            for (int i = 0; i < 4;i++)
            {
                if ((pos[i].x - origin.x)*(pos[i].x - origin.x) + (pos[i].y - origin.y)*(pos[i].y - origin.y) < _radius*_radius){
                    goto next;
                }   
            }
        }

        if(squareone.intersectsRect(rect))
        {
            goto next;
        }

        for (int i = 0; i < 4;i++)
        {
            if (pos[i] == origin){
                goto next;
            }           
        }

        break;
        next:
        _isContant = true;

    } while (0);
    return _isContant;
}
//碰撞問題測試(.cpp)
#include "circle.h"
#include "test.h"

USING_NS_CC;

Scene* test::createScene()
{
    // 'scene' is an autorelease object
    auto scene = Scene::create();

    // 'layer' is an autorelease object
    auto layer = test::create();

    // add layer as a child to scene
    scene->addChild(layer);

    // return the scene
    return scene;
}


bool test::init()
{

    Size visibleSize = Director::getInstance()->getVisibleSize();
    Point origin = Director::getInstance()->getVisibleOrigin();

    auto player = Sprite::create("player.png");
    player->setPosition(visibleSize.width / 2, visibleSize.height / 2);
    addChild(player);

    auto icon = Sprite::create("icon.png");
    icon->setPosition(player->getPositionX() - 100, visibleSize.height / 2);
    addChild(icon);

    circle iconone = circle(icon->getContentSize().width / 2, icon->getPosition());
    Rect rect = Rect::Rect(player->getPositionX() - player->getContentSize().width / 2, player->getPositionY() - player->getContentSize().height / 2, player->getContentSize().width, player->getContentSize().height);

    if (iconone.isContant(rect))
    {
        CCLOG("123");
    }
   else
   {
       CCLOG("456");
   }

    float radius = 100;
    Point position =Point(0, 100);
    circle ico = circle(radius, position);

    Rect rec = Rect::Rect(0, 100, 60, 60);
    if (ico.isContant(rec))
    {
        CCLOG("123");    //由於cocos中文亂碼問題,所以暫時以123代替相撞,以456代替不相撞
    }
    else{
        CCLOG("456");
    }

    return true;
}
//碰撞問題測試(.h)
#ifndef _test_H_
#define _test_H_

#include "cocos2d.h"
using namespace cocos2d;

class test:public cocos2d::Layer
{
public:
    static cocos2d::Scene* createScene();
    virtual bool init();
    CREATE_FUNC(test);
};

#endif

在AppDelegate.cpp裡設定test為啟動專案即可

相關推薦

cocos2d-x 碰撞問題

本次主要需要用到的函式 CC_SYNTHESIZE 此函式是為你的函式生成set,get方法的,如何僅僅需要全域性函式,只需要靜態方法即可 #define CC_SYNTHESIZE(varType, varName, funName)\ protec

Tomcat

tomcat Tomcat是Apache軟件基金會(Apache Software Foundation)的Jakarta項目中的一個核心項目,由Apache、Sun和其他一些公司及個人共同開發而成。java程序寫的網站用tomcat+jdk來運行。tomcat是一個中間件,真正起作用的,解析java腳

heartbeat高可用原理

heartbeat linux 1.heartbeat的作用 通過heartbeat,可以將資源(IP及程序服務等資源)從一臺已經故障的計算機快速轉移到另一臺正常運轉的機器上繼續提供服務,一般稱之為高可用服務。在實際生產中mkeepalived有很多相同之處。在生產實際的業務應用也是有區別的

Android EventBus3.x 使用

led AC target 分解 感覺 div activit .org android事 ?(^∇^*) 五一假期在家無事,新項目中用的是RxJava2+EventBus感覺還不錯,趁這閑暇總結下EventBus 一、概要簡述   EventBus

Java程式設計師從笨鳥到菜鳥之九十三深入java虛擬機器——類載入器

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

大型網站架構系列:負載均衡

//轉載自:http://blog.jobbole.com/97957/ 面對大量使用者訪問、高併發請求,海量資料,可以使用高效能的伺服器、大型資料庫,儲存裝置,高效能Web伺服器,採用高效率的程式語言比如(Go,Scala)等,當單機容量達到極限時,我們需要考慮業務

jvm垃圾收集機制

在我們學習java之前,經常聽到的一個關於java的優點就是,相對於像C語言這種語言,省去了程式設計師手動回收垃圾的步驟,那麼,java虛擬機器到底是怎麼實現自動垃圾回收機制的呢? 一、如何判斷物件需要被回收 什麼時候需要回收物件?經常寫別的語言的人可能會說,當我們對一個東西使用完成

Java 的 IO 四大基類

1、概述      Java 的IO通過java.io 包下的類和介面來支援,java.io包下主要包括輸入、輸出兩種流。每種輸入輸出流又可分為位元組流和字元流兩大類。      位元組流以位元組為單位處理輸入、輸出操作;      字元流以字元來處理輸入

Yii2.0 使用者登入

一、準備 在開始編寫程式碼之前,我們需要思考一下:使用者登陸模組,實現的是什麼功能?很明顯,是登陸功能,那麼,登陸需要使用者名稱和密碼,我們在資料庫的一張表中就應該準備好使用者名稱和密碼的欄位,再思考一下,如果要實現自動登陸的功能,那麼還需要什麼?Cookie,是專門用

NIO元件Selector工作機制

在使用Java進行相關網路程式的的設計時,出身C/C++的人,首先想到的框架就是多路複用,想到多路複用,Unix/Linux下馬上就能讓從想到select, poll, epoll系統呼叫。於是,在看到Java的NIO中的Selector類時必然會倍感親切。稍加查閱一下SDK手冊以及相關例程,不一會兒,一個

51微控制器中斷

一.中斷的概念 中斷髮生 CPU在處理某一事件A時,發生了另一事件B請求CPU迅速去處理 中斷響應和中斷服務 CPU暫時中斷當前的工作,轉去處理事件B 中斷返回 待CPU將事件B處理完畢後,再

第04課:GDB常用命令

本課的核心內容如下:   run命令   continue命令   break命令   backtrace與frame命令   info break、enable、disable和delete命令   list命令   print和ptype命令 為了結合實踐,這裡以除錯Redis原始碼為例來

Mybatis最入門---Mapper檔案配置

[一步是咫尺,一步即天涯] 前文中,我們演示了最基本的HelloWorld程式,下面我們將介紹我們上面各項配置檔案的詳細解釋,以及我們正式開發過程中,各種配置的注意事項等。 慣例,先來看看我們的準備工作有: a.作業系統 :win7 x64 b.基本軟體:MySQ

GitHub使用教程——官網操作指南[翻譯]

GitHub 指南 原文地址:GitHub官網指南 示例專案:Hello World 十分鐘輕鬆教學 在學習計算機語言程式設計的過程中建立Hello World 專案是一個歷史悠久的傳統。當你接觸一門新事物的時候可以用它來做一個簡單的練習。讓我們開始使用github吧! 通過本文

Python3.5——裝飾器及應用

1、裝飾器: (1)本質:裝飾器的本質是函式,其基本語法都是用關鍵字def去定義的。 (2)功能:裝飾其他函式,即:為其他函式新增附加功能。 (3)原則:不能修改被裝飾的函式的原始碼,不能修改被裝飾的函式的呼叫方式。即:裝飾器對待被修飾的函式是完全透明的。 (4)簡單應用:

SpringBoot 2.0 系列:流程

寫在前面 本節將詳細介紹如何使用Spring Boot。它涵蓋了諸如專案管理及自動構建工具、自動配置以及如何執行應用程式等主題。我們還介紹了一些Spring Boot最佳實踐。Spring Boot沒有什麼特別之處(它只是另一個我們可以使用的庫),但是有一些約

IDEA新手入門

IDEA(上) 本文主要講idea專案的建立,執行。還有idea常用的快捷鍵。 1.建立專案 建立Java專案 Z:Create New Project,一路next M:編寫完java程式碼,怎麼執行呢? Z:點選右邊的開始按鈕,選

Android音訊焦點

2017年開年第一篇部落格,很早就想總結一下Android音訊的相關知識。 今天我們先來看一下音訊焦點的相關內容,分為上下篇,上篇主要介紹音訊焦點在媒體類應用中的使用,下篇進行原始碼分析,我們學習原始碼不僅僅是為了更深入的瞭解,更主要的目的是學習And

VxWorks啟動過程

vxworks有三種映像: VxWorks Image的檔案型別有三種  Loadable Images:由Boot-ROM引導通過網口或串列埠下載到RAM  ROM-based Images

C#中的Attribute

近期正在研究AOP,本以為學會之後就又得了一個寶貝,想想心中還挺高興的。我在學習時無意中發現了一位大牛在12年前寫的一篇關於AOP的部落格(http://www.cnblogs.com/wayfarer/articles/241024.html),寫的真是很深入