1

我正在尝试在 iPad、iPhone 和 iPhone 视网膜上制作 cocos2d/box2d 游戏。我的问题是,视网膜模拟器上的fixture和body不对齐,请点击下面的截图进行说明(作为stackoverflow的新成员,它不允许我在这里发布截图)。

截屏

(请忽略不同的形状,我希望 4 个角对齐)在过去的几天里,我对此做了很多研究,我发现最接近的是:

关联

但是 PTM_RATIO 和 CC_CONTENT_SCALE_FACTOR() 提供的解决方案在我的情况下似乎不起作用。我认为这与我没有将文件中的图像加载到我的精灵中这一事实有关。这个问题的大多数解决方案都是基于为视网膜显示器加载 -hd 图像文件,但我根本不想在我的游戏中使用文件。我基本上想在运行时自己绘制多边形,

我的代码如下所示:

-(CCSprite*)addSprite
{
    CGSize contextsize = CGSizeMake(200, 200); 
    UIGraphicsBeginImageContext(contextsize);
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextFlush(context);
    CGContextSetAllowsAntialiasing(context, true);
    CGContextTranslateCTM(context, 0, contextsize.height);
    CGContextScaleCTM(context, 1.0, -1.0);
    CGColorSpaceRef colorspace = CGColorSpaceCreateDeviceRGB();
    CGFloat components[] = {0.0, 0.0, 1.0, 1.0};
    CGColorRef color = CGColorCreate(colorspace, components);
    CGContextSetStrokeColorWithColor(context, color);

    UIBezierPath* aPath;

    aPath = [UIBezierPath bezierPathWithArcCenter:CGPointMake(100, 100)
                                           radius:100
                                       startAngle:0 
                                         endAngle:1.57 
                                        clockwise:YES];
    [aPath addArcWithCenter:CGPointMake(100, 100) 
                     radius:50
                 startAngle:1.57
                   endAngle:0
                  clockwise:NO];

    [aPath stroke];

    CGContextStrokePath(context);
    CGColorSpaceRelease(colorspace);
    CGColorRelease(color);

    UIImage *graphImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    CCTexture2D *tex = [[[CCTexture2D alloc] initWithImage:graphImage] autorelease];
    CCSprite *sprite = [CCSprite spriteWithTexture:tex];
    return sprite;
}

-(void) addFixture:(CCSprite *)fixsprite
{
    b2Vec2 arcdots[] = {
        b2Vec2(50.0f / PTM_RATIO, 0.0f / PTM_RATIO),
        b2Vec2(100.0f / PTM_RATIO, 0.0f / PTM_RATIO),
        b2Vec2(0.0f / PTM_RATIO, 100.0f / PTM_RATIO),
        b2Vec2(0.0f / PTM_RATIO, 50.0f / PTM_RATIO)
};

    b2PolygonShape p_shape;
    b2FixtureDef fixtureDef;

    b2BodyDef bodyDef;
    bodyDef.type = b2_kinematicBody;

    bodyDef.position.Set(100/PTM_RATIO, 100/PTM_RATIO);
    bodyDef.userData = fixsprite;
    b2Body *body = world->CreateBody(&bodyDef);

    p_shape.Set(arcdots, 4);
    fixtureDef.shape = &p_shape;    
    fixtureDef.density = 1.0f;
    fixtureDef.friction = 0.3f;
    body->CreateFixture(&fixtureDef);
}   

我从主例程中调用这些函数,如下所示:

CCSprite *sprite2 = [self addSprite];
sprite2.position = ccp(0, 0);
[self addChild:sprite2 z:0];        
[self addFixture:sprite2];

我在委托文件中未注释这些行:

if( ! [director enableRetinaDisplay:YES] )
    CCLOG(@"Retina Display Not supported");

如果需要更多信息,请告诉我。请温柔一点,我才刚刚开始学习这个。谢谢你的时间。

4

1 回答 1

0

除非另有说明,cocos2d(以及大部分 UIKit)中的所有坐标都以点为单位,而不是像素。在 Retina 显示设备上,您的点分辨率仍为 480x320 点(960x640 像素)。

由此得出:当您以实际像素计算时,乘以或除以 CC_CONTENT_SCALE_FACTOR。如果您处理点坐标,则什么也不做。由于您正在渲染自己的多边形,我假设您知道是否使用实际的像素坐标。如果您直接使用 OpenGL,那么您将使用像素坐标。

如果您不使用 cocos2d 来呈现您的内容,我不确定启用 Retina 显示模式是否对您有任何帮助。

最后,一个常见的误解是 Box2D 世界使用点坐标并且必须转换为像素,反之亦然。也不是这样。Box2D 世界完全没有特定的坐标系。PTM_RATIO 的使用仅用于确保 Box2D 坐标在 Box2D 引擎的合理范围内,因为它最适用于尺寸/直径为 1 米的对象,并且大多数对象的直径范围应为 0.1 到 10 米。

于 2012-07-10T13:27:07.657 回答