2011-07-01 14 views
2

私はNSBoxを持っていますが、その中に小さい矩形を描いています。NSRectFill()です。私のコードは次のようになります:NSRectFillで描画されたココアを消去しますか?

for (int i = 0; i <= 100; i++){ 


    int x = (rand() % 640) + 20; 
    int y = (rand() % 315) + 196; 

    array[i] = NSMakeRect(x, y, 4, 4); 
    NSRectFill(array[i]); 
} 

このforループは、グリッド内に100個のランダムに配置された矩形を作成します。

for (int i = 0; i <= 10; i++) {  

    [self performSelector:@selector(executeFrame) withObject:nil afterDelay:(.05*i)]; 

    } 

ループの最初で唯一のものです:私は何をしようとしていることは、このコードで、何度も実行し、このコードによって作成されたアニメーションのようなものを作成、ランダムに表示される長方形のアニメーションを作成でちなみに、executeFrameの機能の中にあります。だから、私がする必要があるのは、フレーム間のすべての長方形を消去することです。そのため、それらの数は同じままで、移動しているように見えます。私はexecuteFrameを呼び出す前に[myNsBox display];と呼んで背景をもう一度描くだけでこれをやってみましたが、それはまるで四角形が描画されていないように見えました。同じことをした後に呼び出すと、表示の代わりにsetNeedsDisplayに切り替わりました。私はこれを理解することはできません、どんな助けも認められるでしょう。

ちなみに、フレームを実行するコードを実行しようとすると、その間に四角形を消去せずに、100個の四角形が描画されます。私は1000を描くことを要求したとしても、10,000を描くことを要求しても。しかし、私が窓を離れて戻ってきたら(すぐに時間はここの要素ではありません)、ページが更新され、長方形がそこにあります。私は[box setNeedsDisplayInRect:array[i]];でこれを克服しようとしましたが、これは奇妙な方法で動作し、すべてのフレームを更新しましたが、長方形の一部を消去しました。これについての助けもありがたいです。

+1

をダウンロードすることができますそれはあなたのビューを送信することは、 'display'メッセージが適切なソリューションであることは非常にまれです。あなたは通常、 'needsDisplay'を設定してAppKitに適切なタイミングで描画させるように指示するだけで、AppKitが指示するときはすべての描画を行います。 –

答えて

1

drawRectの外に描画しているようです。その場合は、描画コードをビューの(ボックスまたは一部のサブビューの)drawRect:メソッドに移動します。それ以外の場合は、あなたが見ているように、ココアの描画システムによって図面がぶつかることになります。繰り返される描画を行うには、ループではなくタイマーやアニメーションを使用することも必要です。

+1

2番目の 'for'ループが' drawRect: 'にあっても、performSelector:withObject:afterDelay:'メッセージは、 'executeFrame'メッセージが* 'drawRect:'。 –

1

私は最近、サークルと似たようなことをしようとしている人のためのサンプルプログラムを作成しました。私が取ったアプローチは、円の配列の配列を作成し、それらをdrawRectに描画することでした。それはかなりうまくいく。多分それが助けになるでしょう。あなたがプロジェクト全体をしたい場合、あなたはそれをfrom here

@implementation CircleView 

@synthesize maxCircles, circleSize; 

- (id)initWithFrame:(NSRect)frame { 
    self = [super initWithFrame:frame]; 
    if (self) { 
     maxCircles = 1000; 
     circles = [[NSMutableArray alloc] initWithCapacity:maxCircles]; 
    } 
    return self; 
} 

- (void)dealloc { 
    [circles release]; 
    [super dealloc]; 
} 

- (void)drawRect:(NSRect)dirtyRect { 
    NSArray *myCircles; 
    @synchronized(circles) { 
     myCircles = [circles copy]; 
    } 
    NSRect bounds = [self bounds]; 
    NSRect circleBounds; 
    for (NSDictionary *circleSpecs in myCircles) { 
     NSColor *color = [circleSpecs objectForKey:colorKey]; 
     float size = [[circleSpecs objectForKey:sizeKey] floatValue]; 
     NSPoint origin = NSPointFromString([circleSpecs objectForKey:originKey]); 
     circleBounds.size.width = size * bounds.size.width; 
     circleBounds.size.height = size * bounds.size.height; 
     circleBounds.origin.x = origin.x * bounds.size.width - (circleBounds.size.width/2); 
     circleBounds.origin.y = origin.y * bounds.size.height - (circleBounds.size.height/2); 
     NSBezierPath *drawingPath = [NSBezierPath bezierPath]; 
     [color set]; 
     [drawingPath appendBezierPathWithOvalInRect:circleBounds]; 
     [drawingPath fill]; 
    } 
    [myCircles release]; 
} 

#pragma mark Public Methods 

-(void)makeMoreCircles:(BOOL)flag { 
    if (flag) { 
     circleTimer = [NSTimer scheduledTimerWithTimeInterval:0.2 target:self selector:@selector(makeACircle:) userInfo:nil repeats:YES]; 
    } 
    else { 
     [circleTimer invalidate]; 
    } 
} 

-(void)makeACircle:(NSTimer*)theTimer { 
    // Calculate a random color 
    NSColor *color;   
    color = [NSColor colorWithCalibratedRed:(arc4random() % 255)/255.0 
             green:(arc4random() % 255)/255.0 
             blue:(arc4random() % 255)/255.0 
             alpha:(arc4random() % 255)/255.0]; 
    //Calculate a random origin from 0 to 1 
    NSPoint origin; 
    origin.x = (double)arc4random()/(double)0xFFFFFFFF; 
    origin.y = (double)arc4random()/(double)0xFFFFFFFF; 
    NSDictionary *circleSpecs = [NSDictionary dictionaryWithObjectsAndKeys:color, colorKey, 
           [NSNumber numberWithFloat:circleSize], sizeKey, 
           NSStringFromPoint(origin), originKey, 
           nil]; 
    @synchronized(circles) { 
     [circles addObject:circleSpecs]; 
     if ([circles count] > maxCircles) { 
      [circles removeObjectsInRange:NSMakeRange(0, [circles count] - maxCircles)]; 
     } 
    } 
    [self setNeedsDisplay:YES]; 
} 

@end