1

頂点配列を動的にしたい。そのため、すべてのマウスイベントの後に値が追加されます。ユーザーがマウスをドラッグすると、マウスの位置座標が登録されます。座標の名前は「loc」です。ユーザーがマウスをドラッグすると、「loc」値が更新されます。したがって、「loc」が更新されると、座標が頂点配列に追加されます。それでも、「loc」が更新されて頂点配列が再構築される場合にのみ実行できるため、頂点配列には常に 1 つの座標 (現在の「loc」値) しかありません。

頂点配列の値は GLfloat に格納されています。

GLfloat vertexes[] = { loc.x, loc.y };

'loc' は次の方法で登録され- (void) mouseDragged:(NSEvent *)eventています。

loc = [self convertPoint: [event locationInWindow] fromView:self];

頂点配列は次のように描画さ- (void) drawMyShapeれます。

glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(2, GL_FLOAT, 0, vertexes);
glPointSize(30);
glDrawArrays(GL_POINTS, 0, vertexCount);
glFlush();
glDisableClientState(GL_VERTEX_ARRAY);

- (void) drawMyShapeマウスイベントを登録し、それらを GLfloat に追加した後に呼び出され- (void) mouseDragged:(NSEvent *)eventます。

[self drawMyShape]

現在のコード:

.h ファイル内:

NSMutableArray *vertices;
@property (nonatomic, retain) NSMutableArray *vertices;

.m ファイルの先頭

@dynamic vertices;

.m ファイル内- (id)initWithCoder:(NSCoder *)coder

vertices = [[NSMutableArray alloc] init];

.m ファイル内- (void) mouseDragged:(NSEvent *)event

loc = [self convertPoint: [event locationInWindow] fromView:self];
NSValue *locationValue = [NSValue valueWithPoint:loc];
[vertices addObject:locationValue];`
[self addValuesToArray];

.m ファイル内- (void) addValuesToArray

int count = [vertices count] * 2; 
NSLog(@"count: %d", count); 
int currIndex = 0; 
GLfloat GLVertices[] = {*(GLfloat *)malloc(count * sizeof(GLfloat))}; 
for (NSValue *locationValue in vertices) { 
  NSValue *locationValue = [vertices objectAtIndex:currIndex++]; 
  CGPoint curLoc = locationValue.pointValue; 
  GLVertices[currIndex++] = curLoc.x; 
  GLVertices[currIndex++] = curLoc.y; 
} 

そして、それはクラッシュします

NSValue *locationValue = [vertices objectAtIndex:i];

ログでクラッシュした後、次のように表示されます(重要ではないため、ログの一部を削除しました):

sum: 2
*** -[__NSArrayM objectAtIndex:]: index 2 beyond bounds [0 .. 1]
sum: 3
*** -[__NSArrayM objectAtIndex:]: index 3 beyond bounds [0 .. 2]
sum: 4
*** -[__NSArrayM objectAtIndex:]: index 4 beyond bounds [0 .. 3]
sum: 5
*** -[__NSArrayM objectAtIndex:]: index 5 beyond bounds [0 .. 4]
sum: 6
(lldb) 
4

1 に答える 1

3

NSMutableArray を使用して、ロケーション オブジェクトを動的に格納します。

初期化フェーズで配列を初期化します。

NSMutableArray *vertices = [[NSMutableArray alloc] init];

マウス イベントで頂点を追加:

loc = [self convertPoint: [event locationInWindow] fromView:self];
[vertices addObject:loc]; // Assuming loc can be added as an object to the array

GLFloat描画前に配列に変換:

int count = [vertices count] * 2; // * 2 for the two coordinates of a loc object
GLFloat *glVertices = (GLFloat *)malloc(count * sizeof(GLFloat));
int currIndex = 0;
for (YourLocObject *loc in vertices) {
    glVertices[currIndex++] = loc.x;
    glVertices[currIndex++] = loc.y;        
}

glVertices描画時に配列を使用できるようになりました。

于 2012-07-04T08:08:17.760 に答える