NSTimer 的問題請教

大家午安

以下是我的一小段程式 :

BOOL bJobDone = NO ;
bBrickDropDone = NO ; //global var here !!
NSTimer* timer = nil ;

while(bJobDone==NO)
{
if(timer == nil)
{
timer = [NSTimer scheduledTimerWithTimeInterval:0.3
target:self
selector:@selector(dropBrick:)
userInfo:nil
repeats:YES];
}
if(bBrickDropDone==YES)
{
bBrickDropDone = NO ;
[timer invalidate] ;
timer = nil ;

if([self MarkBrickBomb]==YES)
{
bJobDone = NO ;
[self dealBomb] ;
if([self AllClean]==YES)
{
bJobDone = YES ;
igameidx = igameidx + 1 ;
}
}else
{
bJobDone = YES ;
}
}//if(bBrickDropDone==YES)

}//while bJobDone==NO


我覺得在 while loop 用 0.3 秒呼叫一次 dropBrick 然後檢查 bBrickDropDone flag
這種寫法不好 , 請問可否有更好的建議 ?

之所以 0.3 秒呼叫一次 dropBrick 是希望可以 switch UIIMageView 達到動畫的感覺 ,
全部 switch 完畢後 bBrickDropDone = YES , 但是 while loop 還是可能再設為 NO ,
然後一直到 bJobDone=YES 跳出迴圈 , 請問 上述程式中 , NSTimer 這部份
是否能改為 0.3 秒一次呼叫 dropBrick , 但是不要一直檢查 bBrickDropDone flag =yes ,
而是 像是 callback 之類的 , 做完通知再通知迴圈往下進行 ?

2011-09-19 17:13 發佈
文章關鍵字 NSTimer 問題
barfatchen wrote:
timer = [NSTimer scheduledTimerWithTimeInterval:0.3
selector:@selector(dropBrick:)

即然都使用Timer了,為什麼不在dropBrick裡頭去判斷就好??
這樣會造成CPU100%,迴圈變成怪異的地方。
(原來一秒跑3~4次dropBrick,額外還有一個回圈不停的跑 while bJobDone==NO )

在dropBrick裡頭判斷是不是要換下一個,如果到最後一個了,再停掉timer。
callback? 不需要吧,一樣在最後一個停掉timer時,呼叫你想處理的funtion就好了。

做遊戲,timer應該是不會去停的,只有在退出遊戲時才會停timer。

applicationDidFinishLaunching (程式初始,初始timer)
dropBrick (主迴圈、遊戲判斷)

網路上有很多遊戲的範例程式,建議多多參考。
王牌大騙子 wrote:
即然都使用Timer...(恕刪)


謝謝您的指教!!....如果我不使用 while 的話,有點關卡不知如何解決!!

例如,當 TouchesEnded 我開始要處理一些 UIImageView 的 switch ,
-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
if(bValidView == YES)
{
[self doMainJob] ;
}
}

-(void) doMainjob
{
timer = [NSTimer scheduledTimerWithTimeInterval:0.3
target:self
selector:@selector(dropBrick:)
userInfo:nil
repeats:YES];
}

-(void) dropBrick:(NSTimer*) timex
{
//把所有UIImageView 位置互換完之後, [timex invalid] , timex=nil ;
//有需要碰撞條件時 , 再此呼叫碰撞, said doCollision
//如沒有需要碰撞條件時, do nothing !!
}

-(void) doCollision
{
if(all destroyed)
//下一關
else
// dropBrick <== My Question here
}


以上是我的問題所在, 如揚棄我的第一個 while loop 作法 ,
在這理我可以想到的,就是在 doCollision (My Question here)這個地方 , 再重新 initial 一個 timer 呼叫 dropBrick , 而 dropBrick 裡面不管要不要呼叫 doCollision 之前,都會呼叫 [timex invalid] , timex=nil ;
不過我覺得這樣做有點怪 , 但是我也只能想到這個了 ...





王牌大騙子 wrote:
這個網站的範例程式碼...(恕刪)


謝謝 我參考一下!!
內文搜尋
X
評分
評分
複製連結
Mobile01提醒您
您目前瀏覽的是行動版網頁
是否切換到電腦版網頁呢?