cocos2d-x 碰撞问题详解(上)

来源:互联网 发布:五五开这个人 知乎 编辑:程序博客网 时间:2024/06/04 19:32

本次主要需要用到的函数
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为启动项目即可

0 0
原创粉丝点击