簡體   English   中英

重新啟動Objective-C計時器或方法

[英]Objective-C timer or method restarted

我是編程的新手,從構建一個皮划艇穿越河流的應用程序開始。 該應用程序有兩張圖像,一幅顯示在屏幕左側,另一幅顯示在右側,這些圖像檢測到向上滑動手勢,從而使皮划艇運動員在每一側都向上或向下划船。 有些岩石帶有計時器,每次計時器運行時,計時器都會不斷增加到岩石的“ y”位置,從而使人以為他們是皮划艇運動員正在向他們移動的錯覺,而實際上它們是向下移動的。 問題是,一切正常,但是由於某種原因激活了手勢后,岩石重新出現在頂部並再次開始向下移動。 誰能向我解釋為什么會發生這種情況以及如何解決? 非常感謝。

這是.h文件中的代碼:

#import <UIKit/UIKit.h>

@interface WRViewController : UIViewController <UIGestureRecognizerDelegate> {
    //Image View for the game mode
    UIImageView *bg;
    UIImageView *player;
    UIImageView *rock1;
    UIImageView *rock2;
    UIImageView *rock3;

    UIImageView *con_left;
    UIImageView *con_right;

    NSInteger gameState;

    CGPoint rocksOnCurrent;
    CGPoint current;

    NSArray * lRowUpArray;
    NSArray * lRowDownArray;
    NSArray * rRowUpArray;
    NSArray * rRowDownArray;

}

@property (nonatomic, retain) IBOutlet UIImageView *bg;
@property (nonatomic, retain) IBOutlet UIImageView *player;
@property (nonatomic, retain) IBOutlet UIImageView *rock1;
@property (nonatomic, retain) IBOutlet UIImageView *rock2;
@property (nonatomic, retain) IBOutlet UIImageView *rock3;

@property (nonatomic, retain) IBOutlet UIImageView *con_left;
@property (nonatomic, retain) IBOutlet UIImageView *con_right;

@property (nonatomic) NSInteger gameState;

@property (nonatomic) CGPoint rocksOnCurrent;
@property (nonatomic) CGPoint current;
@property (nonatomic, retain) NSArray *lRowUpArray;
@property (nonatomic, retain) NSArray *lRowDownArray;
@property (nonatomic, retain) NSArray *rRowUpArray;
@property (nonatomic, retain) NSArray *rRowDownArray;

-(void)gameStatePlayNormal;

-(void) swipe_leftUp;
-(void) swipe_leftDown;
-(void) swipe_rightUp;
-(void) swipe_rightDown;

@end

這是.m文件中的內容:#import“ WRViewController.h”

@interface WRViewController ()

@end

#define kStateRunning 1
#define kStateGameOver 2

#define kCurrent 0.0045

@implementation WRViewController
@synthesize bg, player, rock1, rock2, rock3;
@synthesize con_left, con_right;
@synthesize gameState;
@synthesize rocksOnCurrent, current;
@synthesize lRowUpArray, lRowDownArray, rRowUpArray, rRowDownArray;


//Gesture actions called by gesture recognizers upon activation
-(void) swipe_leftDown{// The array inside is not causing the restarting
    NSArray * lRowDownArray = [[NSArray alloc] initWithObjects:[UIImage         imageNamed:@"k_lf1.png"],
                           [UIImage imageNamed:@"k_lf2.png"],
                           [UIImage imageNamed:@"k_lf3.png"],
                           [UIImage imageNamed:@"k_lf4.png"],
                           [UIImage imageNamed:@"k_lf5.png"],
                           [UIImage imageNamed:@"k_lf6.png"],
                           [UIImage imageNamed:@"k_lf7.png"],
                           [UIImage imageNamed:@"k_lf8.png"],
                           [UIImage imageNamed:@"k_lf9.png"],
                           [UIImage imageNamed:@"k_lf10.png"],
                           [UIImage imageNamed:@"k_lf11.png"],
                           [UIImage imageNamed:@"k_lf12.png"], nil];
    player.animationImages = lRowDownArray;
    [player setAnimationRepeatCount:1];
    player.animationDuration = 1.1;
    player.contentMode = UIViewContentModeBottomLeft;
    [self.view addSubview:player];
    [player startAnimating];
    rock1.center = CGPointMake(rock1.center.x, rock1.center.y + rocksOnCurrent.y);
    rocksOnCurrent.x -= 0.4;
    rocksOnCurrent.y += 0.4;
}
-(void) swipe_leftUp{
    NSArray * lRowUpArray = [[NSArray alloc] initWithObjects:[UIImage imageNamed:@"k_lf12.png"],
                         [UIImage imageNamed:@"k_lf11.png"],
                         [UIImage imageNamed:@"k_lf10.png"],
                         [UIImage imageNamed:@"k_lf9.png"],
                         [UIImage imageNamed:@"k_lf8.png"],
                         [UIImage imageNamed:@"k_lf7.png"],
                         [UIImage imageNamed:@"k_lf6.png"],
                         [UIImage imageNamed:@"k_lf5.png"],
                         [UIImage imageNamed:@"k_lf4.png"],
                         [UIImage imageNamed:@"k_lf3.png"],
                         [UIImage imageNamed:@"k_lf2.png"],
                         [UIImage imageNamed:@"k_lf1.png"], nil];
    player.animationImages = lRowUpArray;
    [player setAnimationRepeatCount:1];
    player.animationDuration = 1.1;
    player.contentMode = UIViewContentModeBottomLeft;
    //[self.view addSubview:player];
    [player startAnimating];
}
//Did the above to swipe_RightDown and swipe_RightUp. Didn't add here to save space.

-(NSString *)pathOfFile{
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentationDirectory, NSUserDomainMask, YES);
    NSString *documentFolder = [paths objectAtIndex:0];
    return [documentFolder stringByAppendingFormat:@"saverFile.plist"];
}

- (void)viewDidLoad{
    [super viewDidLoad];
    gameState = kStateRunning;
    rocksOnCurrent = CGPointMake(0, 0); 
    current = CGPointMake (0, kCurrent);

    [NSTimer scheduledTimerWithTimeInterval:1.0/60 target:self selector:@selector(gameLoop) userInfo:nil repeats:YES];

    /////Gesture code for the row controllers
    //Left Row Up
    UISwipeGestureRecognizer *con_leftUp = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipe_leftUp)];
    con_leftUp.numberOfTouchesRequired = 1;
    con_leftUp.direction = UISwipeGestureRecognizerDirectionUp;
    [self.con_left addGestureRecognizer:con_leftUp];

    //Left Row Down
    UISwipeGestureRecognizer *con_leftDown = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipe_leftDown)];
    con_leftDown.numberOfTouchesRequired = 1;
    con_leftDown.direction = UISwipeGestureRecognizerDirectionDown;
    [self.con_left addGestureRecognizer:con_leftDown];
    //Right Row Up
    UISwipeGestureRecognizer *con_rightUp = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipe_rightUp)];
    con_rightUp.numberOfTouchesRequired = 1;
    con_rightUp.direction = UISwipeGestureRecognizerDirectionUp;
    [self.con_right addGestureRecognizer:con_rightUp];
    //Right Row Down
    UISwipeGestureRecognizer *con_rightDown = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipe_rightDown)];
    con_rightDown.numberOfTouchesRequired = 1;
    con_rightDown.direction = UISwipeGestureRecognizerDirectionDown;
    [self.con_right addGestureRecognizer:con_rightDown];
}

-(void)gameLoop {
    if (gameState == kStateRunning){
        [self gameStatePlayNormal];
    } else if (gameState == kStateGameOver){

    }
}
//Extra functions, so that they are not all in the game loop
-(void)gameStatePlayNormal{
    rocksOnCurrent.y += current.y;

    rock1.center = CGPointMake(rock1.center.x, rock1.center.y + rocksOnCurrent.y);
    rock2.center = CGPointMake(rock2.center.x, rock2.center.y + rocksOnCurrent.y);
    rock3.center = CGPointMake(rock3.center.x, rock3.center.y + rocksOnCurrent.y);

}

-(void)viewDidUnload {
    self.bg = nil;
    self.player = nil;
    self.rock1 = nil;
    self.rock2 = nil;
    self.rock3 = nil;
}

//Apple does not requires this, it seems.
/*-(void)dealloc {
    [super dealloc];
    [bg release];
    [rock1 release];
    [rock2 release];
    [rock3 release];
}*/

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end

簡而言之,每當我激活手勢時,岩石就會回到原來的位置,就像重新開始一樣。 rockOnCurrent.y保持不變,因為每次我滑動時,岩石的速度似乎移動得更快。 任何幫助將不勝感激,謝謝。

我想到了。 在.xib文件中,在右上角有5個小標簽,而一直到左側(看起來像頁面)的小標簽是File Inspector。 我猜想當您啟動一個新的應用程序時會自動檢查“使用自動布局”。 這是造成問題的原因。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM