Cocos2d iphone Can';t让box2d光线投射在cocos2d中工作

Cocos2d iphone Can';t让box2d光线投射在cocos2d中工作,cocos2d-iphone,box2d,collision-detection,raycasting,Cocos2d Iphone,Box2d,Collision Detection,Raycasting,我已经尝试了一些从互联网上收集到的关于如何设置Raycast的不同方法,但是无论我做什么,我都无法注册任何类型的连接。这是怎么回事?世界是正确设置的(比如,事物出现、碰撞等等),但是光线投射似乎从未检测到任何东西,我尝试了三种不同的方法(两种略有不同)。为了完整性,我将包括我的测试用例和附属类(你们中的一些人可能会认识Ray Wenderlich的设置): 层头 //B2dtest.h #import <Foundation/Foundation.h> #import "cocos2

我已经尝试了一些从互联网上收集到的关于如何设置Raycast的不同方法,但是无论我做什么,我都无法注册任何类型的连接。这是怎么回事?世界是正确设置的(比如,事物出现、碰撞等等),但是光线投射似乎从未检测到任何东西,我尝试了三种不同的方法(两种略有不同)。为了完整性,我将包括我的测试用例和附属类(你们中的一些人可能会认识Ray Wenderlich的设置):

层头

//B2dtest.h
#import <Foundation/Foundation.h>
#import "cocos2d.h"
#import "Box2D.h"
#import "GLES-Render.h"
#import "MyContactListener.h"
#define PTM_RATIO 16
@interface B2dTest : CCLayer {
b2World* world;                 // strong ref
GLESDebugDraw *m_debugDraw;
MyContactListener *_contactListener;
b2Body* groundBody;
b2Body* wallBody;
DataModel *m;
float rayAngle;
b2Vec2 p1;
b2Vec2 p2;
b2Vec2 intersectionPoint;
}
+(CCScene *) scene;
-(void)initPhysics;
@end
OtherCast.h

#import "Box2D.h"
class OtherCast : public b2RayCastCallback{
public:
OtherCast()
{
    m_hit = false;
}
float32 ReportFixture(  b2Fixture* fixture, const b2Vec2& point,
                      const b2Vec2& normal, float32 fraction)
{
    b2Body* body = fixture->GetBody();
    void* userData = body->GetUserData();
    if (userData)
    {
        int32 index = *(int32*)userData;
        if (index == 0)
        {
            // filter
            return -1.0f;
        }
    }

    m_hit = true;
    m_point = point;
    m_normal = normal;
    return fraction;
}

bool m_hit;
b2Vec2 m_point;
b2Vec2 m_normal;
};

检查是否调用了ReportFixture方法。如果是的话,那么射线根本没有击中任何东西。这可能是由于值的比例、光线太短或对象太远(未应用PTM_比率?)。但也可能是身体的形状太小,或者甚至没有形状。可能光线瞄准的方向相反或角度为90°,很容易忘记或错误地将角度转换为弧度,反之亦然。这些问题并非罕见


它有助于设置一个测试用例,手动将两个对象放置在已知位置,然后投射一条光线,以确保光线相交。拿出笔和纸,跟踪位置和光线,查看调试运行期间变量的值是否匹配。这将有助于定位因矢量、角度等不正确而导致的任何问题。

嘿,Steffan!谢谢你回答我的问题,你给了我答案!我得到的是将光线的起点设置为(240240),而不是(240/PTM_比率,240/PTM_比率)。现在它至少注册了点击率!真不敢相信我在让一堆其他的box2d东西毫无问题地工作后把事情搞砸了。非常感谢!
#ifndef Shoot_N_Run_RaysCastCallback_h
#define Shoot_N_Run_RaysCastCallback_h
#endif
#import "Box2D.h"

class RaysCastCallback : public b2RayCastCallback{
public:
RaysCastCallback() : m_fixture(NULL) {
}

float32 ReportFixture(b2Fixture* fixture, const b2Vec2& point, const b2Vec2& normal, float32 fraction) {        
    m_fixture = fixture;        
    m_point = point;        
    m_normal = normal;        
    m_fraction = fraction;        
    return fraction;     
}    

b2Fixture* m_fixture;    
b2Vec2 m_point;    
b2Vec2 m_normal;    
float32 m_fraction;
};
#import "Box2D.h"
class OtherCast : public b2RayCastCallback{
public:
OtherCast()
{
    m_hit = false;
}
float32 ReportFixture(  b2Fixture* fixture, const b2Vec2& point,
                      const b2Vec2& normal, float32 fraction)
{
    b2Body* body = fixture->GetBody();
    void* userData = body->GetUserData();
    if (userData)
    {
        int32 index = *(int32*)userData;
        if (index == 0)
        {
            // filter
            return -1.0f;
        }
    }

    m_hit = true;
    m_point = point;
    m_normal = normal;
    return fraction;
}

bool m_hit;
b2Vec2 m_point;
b2Vec2 m_normal;
};