-2

問題は、アニメーションが 1 回だけ実行され、再度繰り返すことができないことです。どこかに NSTimer をもう 1 つ追加する必要がありますか?

私が欠けているものはありますか?ヘルプとアドバイスを探しています。どうもありがとう !

そして、これがコードです。

まず、ViewController.h & ViewController.m で


@interface ViewController : UIViewController {
    GameView* gameView;
}

- (void)viewDidLoad
{
    [super viewDidLoad];

    if(gameView == nil) {
        gameView = [[GameView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)];
        gameView.backgroundColor = [UIColor clearColor];
    }

    [self.view addSubview:gameView];

    [[AppEngine sharedInstance] addSnow:CGPointMake((random() % 320),(random() % -20))];
    [[AppEngine sharedInstance] addSnow:CGPointMake((random() % 320),(random() % -20))];
    [[AppEngine sharedInstance] addSnow:CGPointMake((random() % 320),(random() % -20))];
    [[AppEngine sharedInstance] addSnow:CGPointMake((random() % 320),(random() % -20))];
    [[AppEngine sharedInstance] addSnow:CGPointMake((random() % 320),(random() % -20))];
}

GameView.h & .m で


@interface GameView : UIView <UIAccelerometerDelegate>{
    CADisplayLink* displayLink;
} 

-(void) timeStep;

- (id)initWithFrame:(CGRect)frame {

    self = [super initWithFrame:frame];
    if (self) {
        displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(timeStep)];
        [displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
    }
    return self;
}

-(void) timeStep {
    [[AppEngine sharedInstance] timeStep];
    [self setNeedsDisplay];
}

- (void)drawRect:(CGRect)rect {

    [[UIImage imageNamed:@"Christmas.jpg"] drawInRect:CGRectMake(0,0,320,480)]; // set the background image

    CGContextRef context = UIGraphicsGetCurrentContext();


    for(MySnow* snowObject in [AppEngine sharedInstance].snowObjectArray)

    {
        CGContextSaveGState(context);

        CGContextTranslateCTM(context, snowObject.x, snowObject.y);

        NSString *imagePath = [NSString stringWithFormat:@"snowflake0%d.png",snowObject.type];

        [[UIImage imageNamed: imagePath] drawInRect:CGRectMake(-16,-16,32,32)];

        CGContextRestoreGState(context);
    }
}

第三に、雪の中で.h & m


@interface MySnow : NSObject
{
    float x,y;
    float vx, vy;
    float rotSpeed;
    float rotation;
    int type;
    }

@property (nonatomic) float x,y;
@property (nonatomic) float vx, vy, rotSpeed,rotation;
@property (nonatomic) int type;

-(id) initWithStartPoint:(CGPoint) startPoint withType:(int) type;
-(void) timeStep;

@implementation MySnow
@synthesize x,y,vx,vy,rotation,rotSpeed,type;

-(id) initWithStartPoint:(CGPoint) startPoint withType:(int) _type {
    self = [super init];
    if(self) {

    x = startPoint.x;
        y = startPoint.y;
        vx = RANDOM_FLOAT() * 1 + 0.1;
        vy = RANDOM_FLOAT() * 2 + 0.1;
        type = _type;
    }
    return self;
}

-(void) timeStep {
    y += vy;
}

最後に、AppEngine.h & m で

@interface AppEngine : NSObject {
    NSMutableArray* snowObjectArray;
    float ax, ay;
}

@property (readonly) NSMutableArray* snowObjectArray;
@property (nonatomic) float ax,ay;

+(AppEngine*) sharedInstance;
+(void) destoryInstance;
-(void) timeStep;
-(void) addSnow:(CGPoint) point;

static AppEngine* _sharedEngine;

@implementation AppEngine
@synthesize snowObjectArray;
@synthesize ax,ay;
+(AppEngine*) sharedInstance {
    if(_sharedEngine == nil)
        _sharedEngine = [[AppEngine alloc] init];
    return _sharedEngine;
}

+(void) destoryInstance {
    if(_sharedEngine != nil) {
        _sharedEngine = nil;
    }
}

-(id) init {
    self = [super init];
    if(self) {
        snowObjectArray = [[NSMutableArray alloc] init];
    }
    return self;
}


-(void) addSnow:(CGPoint) point {
    int type = (arc4random() % 9) + 1;  // random snow image 01 to 09
    MySnow* snowObject = [[MySnow alloc] initWithStartPoint:point withType:type];
    [snowObjectArray addObject:snowObject];
}

-(void) timeStep {
    NSMutableArray* removeArray = [NSMutableArray array];
    for(MySnow* item in snowObjectArray) {
        [item timeStep];
        if(item.y > 400 || item.y < -100)
        [removeArray addObject:item];
    }
   [snowObjectArray removeObjectsInArray:removeArray];
 [removeArray removeAllObjects];
}
4

1 に答える 1

0

これはあなたのコードですか?アニメーションを開始する方法を説明できますか?

AppEngine の timeStep メソッドには、snowObjectsArray 内の各項目が何らかの境界に達すると明確に削除するコードがあるように見えます。しかし、これがあなたのコードなら、それが何をするのか理解できないのはなぜですか?

編集:OK、これは講義からです。

アニメーションを続けたい場合は、次のようにします。

viewDidLoad メソッド (雪のオブジェクトを作成および追加するコード) からコードの最後のブロックを取得し、別のメソッドに配置します。viewDidLoad にそのメソッドを呼び出させます。メソッド makeItSnow を呼び出しましょう。

次に、AppEngine の timeStep メソッドの最後で、snowObjectArray のオブジェクト数が 0 になったら、makeItSnow を呼び出します。

このアプローチでは、一連の雪片が一番上から始まり、下に落ちて消え、別の雪片のグループが始まります。連続して雪片を降らせたい場合は、timeStep メソッドを変更して削除する雪片オブジェクトの数をカウントし、メソッドの最後でその数の雪片を配列に追加します。これにより、プログラムはスノーフレークが消えるたびに新しいスノーフレークを追加します。

さらに別のアプローチとして、繰り返しタイマーを AppEngine に追加し、そのタイマーに別のスノーフレークを作成させることもできます。これにより、一定の間隔で雪片が追加され続けます。

于 2012-11-27T01:50:04.383 に答える