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
- cocos2d-x 碰撞问题详解(上)
- cocos2d-x:矩形碰撞
- cocos2d-x 碰撞检测
- cocos2d-x 碰撞检测
- cocos2d-x 检测碰撞
- Cocos2d-x碰撞检测
- cocos2d-x 碰撞
- cocos2d-x 菜鸟学习笔记十五(简单的碰撞检测 实践篇 上)
- cocos2d-x如何检测碰撞
- cocos2d-x 矩形碰撞检测
- Cocos2d-x如何检测碰撞
- cocos2d-x 检测矩形碰撞
- cocos2d-x中的碰撞检测
- cocos2d-x像素碰撞检测
- cocos2d-x3.x 像素碰撞
- cocos2d -x 3.2 碰撞响应
- cocos2d-x的碰撞检测
- cocos2d-x如何检测碰撞
- 查看Security Context
- Linux ipcs 命令详解
- linux route命令的使用详解
- java代码实现ping ip
- 使用sqlite3与C接口开发数据库程序
- cocos2d-x 碰撞问题详解(上)
- Oracle 删除数据的几种方法
- HDU 2009 求数列的和
- AIX 夏令时
- iOS开发中常用但经常忘记的技巧
- 我害怕阅读的人
- Unix:线程池的例子
- Nginx代码解析
- 贪心算法—Problem A