box2d实力触摸不规则图片
来源:互联网 发布:火炬之光2mac版本更新 编辑:程序博客网 时间:2024/06/09 22:39
原文地址:http://www.cocoachina.com/bbs/read.php?tid=209290
HelloWorldScene文件
#ifndef __HELLOWORLD_SCENE_H__#define __HELLOWORLD_SCENE_H__#include "cocos2d.h"class HelloWorld : public cocos2d::Layer{ cocos2d::Sprite* sp_2dx = nullptr; cocos2d::LabelTTF* status_label = nullptr;public: static cocos2d::Scene* createScene(); virtual bool init(); void menuCloseCallback(cocos2d::Ref* pSender); bool onTouchBegan(cocos2d::Touch* touch, cocos2d::Event* event); void onTouchMoved(cocos2d::Touch* touch, cocos2d::Event* event); void onTouchEnded(cocos2d::Touch* touch, cocos2d::Event* event); Node* nodeUnderTouch(cocos2d::Touch* touch); CREATE_FUNC(HelloWorld);};#endif
#include "HelloWorldScene.h"#include "MyBodyParser.h"USING_NS_CC;Scene* HelloWorld::createScene(){ auto scene = Scene::createWithPhysics(); scene->getPhysicsWorld()->setDebugDrawMask(PhysicsWorld::DEBUGDRAW_ALL); auto layer = HelloWorld::create(); scene->addChild(layer); return scene;}bool HelloWorld::init(){ if ( !Layer::init() ) { return false; } Size visibleSize = Director::getInstance()->getVisibleSize(); Point origin = Director::getInstance()->getVisibleOrigin(); auto closeItem = MenuItemImage::create( "CloseNormal.png", "CloseSelected.png", CC_CALLBACK_1(HelloWorld::menuCloseCallback, this));closeItem->setPosition(Point(origin.x + visibleSize.width - closeItem->getContentSize().width/2 , origin.y + closeItem->getContentSize().height/2)); auto menu = Menu::create(closeItem, NULL); menu->setPosition(Point::ZERO); this->addChild(menu, 1); auto label = LabelTTF::create("Physics Body Loader Demo", "Arial", 24); label->setPosition(Point(origin.x + visibleSize.width/2, origin.y + visibleSize.height - label->getContentSize().height)); this->addChild(label, 1); status_label = LabelTTF::create("Touch anywhere!", "Arial", 36); status_label->setPosition(Point(origin.x + visibleSize.width/2, 1.2*status_label->getContentSize().height)); this->addChild(status_label); sp_2dx = Sprite::create("2dx.png"); sp_2dx->setPosition(Point(visibleSize.width/2 + origin.x, visibleSize.height/2 + origin.y)); MyBodyParser::getInstance()->parseJsonFile("bodies.json"); auto _body = MyBodyParser::getInstance()->bodyFormJson(sp_2dx, "2dx"); if (_body != nullptr) { _body->setDynamic(false); _body->setCollisionBitmask(0x000000); sp_2dx->setPhysicsBody(_body); } this->addChild(sp_2dx, 0); auto touchListener = EventListenerTouchOneByOne::create(); touchListener->onTouchBegan = CC_CALLBACK_2(HelloWorld::onTouchBegan, this); touchListener->onTouchMoved = CC_CALLBACK_2(HelloWorld::onTouchMoved, this); touchListener->onTouchEnded = CC_CALLBACK_2(HelloWorld::onTouchEnded, this); _eventDispatcher->addEventListenerWithSceneGraphPriority(touchListener, this); return true;}Node* HelloWorld::nodeUnderTouch(cocos2d::Touch *touch){ Node* node = nullptr; //转换到layer内的坐标 auto location = this->convertTouchToNodeSpace(touch); //得到当前点下方的物理shapes auto scene = Director::getInstance()->getRunningScene(); auto arr = scene->getPhysicsWorld()->getShapes(location); //遍历当前点击到的所有shapes, 看看有没有我们的2dx! for (auto& obj : arr) { if ( obj->getBody()->getNode() == sp_2dx) { node = obj->getBody()->getNode(); break; } } return node;}bool HelloWorld::onTouchBegan(Touch* touch, Event* event){ auto current_node = nodeUnderTouch(touch); if (current_node == sp_2dx) { status_label->setColor(Color3B::GREEN); status_label->setString("Ohoo, U catch me!"); } else { status_label->setColor(Color3B::RED); status_label->setString("Haha, touch outside!"); } return true;}void HelloWorld::onTouchMoved(Touch* touch, Event* event){}void HelloWorld::onTouchEnded(Touch* touch, Event* event){ status_label->setColor(Color3B::WHITE); status_label->setString("Touch anywhere!");}void HelloWorld::menuCloseCallback(Ref* pSender){}
MyBodyParser文件
#pragma once#include <string>#include "cocos2d.h"USING_NS_CC;#include "json/document.h"class MyBodyParser { MyBodyParser(){} rapidjson::Document doc;public: static MyBodyParser* getInstance(); bool parseJsonFile(const std::string& pFile); bool parse(unsigned char* buffer, long length); void clearCache(); PhysicsBody* bodyFormJson(Node* pNode, const std::string& name);};
#include "MyBodyParser.h"MyBodyParser* MyBodyParser::getInstance(){ static MyBodyParser* sg_ptr = nullptr; if (nullptr == sg_ptr) { sg_ptr = new MyBodyParser; } return sg_ptr;}bool MyBodyParser::parse(unsigned char *buffer, long length){ bool result = false; std::string js((const char*)buffer, length); doc.Parse<0>(js.c_str()); if(!doc.HasParseError()) { result = true; } return result;}void MyBodyParser::clearCache(){ doc.SetNull();}bool MyBodyParser::parseJsonFile(const std::string& pFile){ auto content = FileUtils::getInstance()->getDataFromFile(pFile); bool result = parse(content.getBytes(), content.getSize()); return result;}//从json文件加载正确的bodyPhysicsBody* MyBodyParser::bodyFormJson(cocos2d::Node *pNode, const std::string& name){ PhysicsBody* body = nullptr; rapidjson::Value &bodies = doc["rigidBodies"]; if (bodies.IsArray()) { //遍历文件中的所有body for (int i=0; i<bodies.Size(); ++i) { //找到了请求的那一个 if (0 == strcmp(name.c_str(), bodies[i]["name"].GetString())) { rapidjson::Value &bd = bodies[i]; if (bd.IsObject()) { //创建一个PhysicsBody, 并且根据node的大小来设置 body = PhysicsBody::create(); float width = pNode->getContentSize().width; //多边形的锚点默认都是左下角,精灵的不一定, float offx = - pNode->getAnchorPoint().x * pNode->getContentSize().width; float offy = - pNode->getAnchorPoint().y * pNode->getContentSize().height; Point origin( bd["origin"]["x"].GetDouble(), bd["origin"]["y"].GetDouble()); rapidjson::Value &polygons = bd["polygons"]; for (int i = 0; i<polygons.Size(); ++i) { int pcount = polygons[i].Size(); Point* points = new Point[pcount]; for (int pi = 0; pi<pcount; ++pi) { points[pi].x = offx + width * polygons[i][pcount-1-pi]["x"].GetDouble(); points[pi].y = offy + width * polygons[i][pcount-1-pi]["y"].GetDouble(); } body->addShape(PhysicsShapePolygon::create(points, pcount, PHYSICSBODY_MATERIAL_DEFAULT)); delete [] points; } } else { CCLOG("body: %s not found!", name.c_str()); } break; } } } return body;}
0 0
- box2d实力触摸不规则图片
- box2d中创建不规则的形状
- android不规则图片按钮
- iOS图片不规则剪切
- cvcopy实现不规则图片提取
- android ImageButton响应不规则图片
- 文章图片的不规则显示
- 不规则图片 瀑布流原理
- Android 之 不规则形状图片
- 不规则图片点击事件捕获
- C#创建不规则窗体-图片
- 不规则图片的点击响应
- 不规则图片的点击事件
- 多点触摸缩放图片
- 图片触摸旋转
- Libgdx Box2D实战---放开那小球(四:不规则body创建--physics-body-editor的使用)
- 使用图片创建不规则窗体 windows sdk
- 使用图片创建不规则窗体 windows sdk
- Android 对话框(Dialog)大全 建立你自己的对话框
- 《设计模式之禅》依赖倒置原则之问
- 经验分享:CSS浮动(float,clear)通俗讲解
- android之AlertDialog
- glassfish4.0配置
- box2d实力触摸不规则图片
- 第162天
- WebRTC中的AppRTCDemo.apk简单分析
- hdu 2610
- numpy nonzero使用方法
- ZOJ3469:Food Delivery(区间DP)
- 竖式问题(sprintf函数,strchr)
- 二叉树按层次遍历--队列实现
- HDU 4024 Dwarven Sniper’s hunting (计算几何-其它,搜索-二分)