Мне нужно позвонить [convertToGl]? - PullRequest
0 голосов
/ 28 декабря 2010

Я использую cocos2d, и у меня есть подкласс cccnode (я хочу нарисовать круги, и это работает) .h

@interface CCSpriteCircle : CCSprite {
 float radius;
 float angle; //in radians
 NSUInteger segments;
 BOOL drawLineToCenter;
 ccColor4B cColor;
}
-(id) initWithRadius: (float)radius_ withAngle: (float)angle_ withSegments: (NSUInteger)segments_ withDrawLineToCenter:(BOOL)drawLineToCenter_;

@property(nonatomic,assign) float radius;
@property(nonatomic,assign) float angle;
@property(nonatomic,assign) NSUInteger segments;
@property(nonatomic,assign) BOOL drawLineToCenter;
@property(nonatomic,assign) ccColor4B cColor;

@end

// мой .m файл

@ реализация CCSpriteCircle @ Synthesize радиус, угол, сегменты, drawLineToCenter, cColor;

-(id) initWithRadius: (float)radius_ withAngle: (float)angle_ withSegments: (NSUInteger)segments_ withDrawLineToCenter:(BOOL)drawLineToCenter_
{
 if( (self=[super init])) {
  self.radius = radius_;
  self.angle = angle_;
  self.segments = segments_;
  self.drawLineToCenter = drawLineToCenter_;
  //[self draw];
 }

 return self;
}

-(void)draw {

 glLineWidth(1);
 glColor4ub(cColor.r, cColor.g, cColor.b, cColor.a);
 ccDrawCircle(ccp(self.position.x,self.position.y), radius, angle, segments, drawLineToCenter);
 // restore original values
 glLineWidth(1);
 glColor4ub(255,255,255,255);
 glPointSize(1);

}
@end

Все работает нормально, за исключением того, что если я помещаю центр моего ccspritecircle в 480 (это конец экрана), он не появляется, но если я помещаю его в 200px, это в конце экрана.

если я изменю код позиции в моей сцене helloworld следующим образом: от:

circle_.position = ccp (480, 0);

до:

circle_.position = [[CCDirector sharedDirector] convertToGL: CGPointMake(480,0)];

тогда я больше не вижу круг. Я делаю что-то не так?

1 Ответ

0 голосов
/ 09 января 2011

Если ваша единственная цель - нарисовать пользовательский круг без какой-либо другой формы графики (файлов изображений), то вам следует создать подкласс CCNode, а не CCSprite.CCSprite - это особый тип CCNode, который обрабатывает загрузку и отображение графических файлов.

Вам также следует вызвать «[super draw]» изнутри переопределения, чтобы убедиться, что дополнительная обработка выполняется правильно - это можетбыть до или после вашего кода, в зависимости от того, как он влияет на ваш конечный результат.

ccDrawCircle уже преобразует координаты x / y в пространство GL, поэтому вам не нужно беспокоиться об этом.

Хотя точка привязки и позиция вашего CCNode могут быть здесь важны.По умолчанию 0.5 / 0.5 anchorPoint должен установить центр вашего круга в положении x / y вашего узла, чтобы (480,0) с радиусом 32 поместил круг размером 64x64 в нижнем правом углу экрана (в портретной ориентации) ивы сможете увидеть только верхний левый квадрант круга.

Вы говорите, что при установке его на 200 пикселей он помещается в конце экрана, не видя, как инициализировался круг, трудно определитьпочему это произойдет - но это, скорее всего, связано с радиусом круга, который вы используете.

Имейте в виду, что изменение точки привязки может не повлиять на рендеринг круга, поскольку ваш метод рисованияне принимая во внимание текущую точку привязки, поэтому она может размещать кружок в точке x / y независимо от настроек anchorPoint.

...