преобразовать массив NSValues ​​/ CGPoints в структуру CGPoint для использования с glDrawArrays в cocos2d - PullRequest
0 голосов
/ 03 марта 2010

Я довольно новичок в Objective-C и даже C в целом, поэтому, пожалуйста, потерпите меня. Моя главная цель - отобразить мой NSMutableArray для CGPoints (через NSValue) с glDrawArrays (GL_LINE_STRIP, 0, points);

Я заметил, что cocos2d требует указатель массива (?) *poli примерно так:


void ccDrawPoly( CGPoint *poli, int points, BOOL closePolygon ) { ... }

Итак, я попытался преобразовать свой NSMutableArray в массив C, и я могу просто получить доступ к / отладить CGPoints:


NSUInteger count = [points count];
id *buffer = malloc(sizeof(NSValue) * count);
[points getObjects: buffer];
for(uint i = 0; i < count; i++) {
  NSValue *val = buffer[i];
  CGPoint p = [val CGPointValue];
  NSLog(@"points x %i: %f", i, p.x);
  /* shows up in the console as:
  -----------points at 0: 42.000000
  -----------points at 1: 44.000000
  ... etc
  */
}
free(buffer);

Но я думаю, что я застрял в том, чтобы привести их к типу данных, который ccDrawPoly или glDrawArrays(GL_LINE_STRIP, 0, points) примет. Что, очевидно, является структурой или чем-то, но я не уверен, как получить их в структуре.

Любая помощь будет принята с благодарностью! Спасибо!

1 Ответ

0 голосов
/ 03 марта 2010

Вот новый код, который я использую на тот случай, если он кому-то поможет:



@interface Blah : CCLayer
{
  CGPoint *parr;
  NSUInteger parr_count;
  NSUInteger parr_max;
}
@end

@implementation Blah

-(id) init
{
  if((self = [super init])) {
    parr_count = 0;
    parr_max = 64;
    parr = malloc(parr_max * 2 * sizeof(CGPoint));
  }
  return self;
}

...

-(void) ccTouchMoved:(UITouch *)touch withEvent:(UIEvent *)event
{
  CGPoint prev_loc = [touch previousLocationInView: [touch view]];
  CGPoint prev_glloc = [[CCDirector sharedDirector] convertToGL:prev_loc];

  CGPoint loc = [touch locationInView: [touch view]];
  CGPoint glloc = [[CCDirector sharedDirector] convertToGL:loc];

  if(parr_count >= 2048) { // hard limit of 2048
    return;
  } else if(parr_count == parr_max) {
    parr_max = 2 * parr_max;
    parr = realloc(parr, parr_max * 2 * sizeof(GLfloat));
  }

  parr[parr_count] = prev_glloc;
  parr_count += 1;
  parr[parr_count] = glloc;
  parr_count += 1;
}

...

-(void) draw
{
  if(parr_count < 2048)
    ccDrawPoly(parr, parr_count, NO);
}

- (void) dealloc
{
  free(parr);
  [super dealloc];
}

@end


Кажется, работает нормально! Если у кого-то есть оптимизация или комментарии, я был бы благодарен, спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...