大家真是太捧場了! 昨天才擠到家庭類遊戲第二名了,沒想到才過一天,下載排名就衝到家庭類和模擬類遊戲的雙料冠軍了.....希望有機會拚進app store總排行的前十名(現在是第20名)....
2012年3月19日 星期一
2012年3月8日 星期四
樂田麵包屋(遊戲)上架了
先來說說當初怎麼會有這個遊戲好了。最初的想法是樂田這家麵包店想做一個iphone app來介紹他們的經營理念,就像是其它企業的app一樣,你點進去就介紹公司理念,像是什麼“我們的理念是先求不傷身體,再講求療效”之類的話,接下可能有些產品介紹,什麼我們的麵粉是從長白山的天山雪蓮旁的千年小麥粹練而成之類的講產品是由什麼珍貴的食材做出來的....最後可能頂多再加個facebook按讚的功能。
後來我就拿出我女兒最愛的cooking mama給樂田看說“如果能做得像這樣,把做麵包的過程變成一個遊戲就很酷了。沒想到這個無心的idea,就這樣的讓大家無異議的一致通過了。所以在同樣的預算下,幫自已原本2個月的工作,搞了半年才完成......
雖然說這只是一個遊戲,但是當初我們在討論這個遊戲的定位時,給了它一個很大的使命,就是讓玩家可以在遊戲的過程中,除了能夠獲得烘焙過程的知識外,更能瞭解到如何去品嚐到麵包的最佳風味。
先來介紹一下這是個怎麼樣的遊戲。即然是從cooking mama來的idea, 那當然先要選擇你要做的麵包。每一款麵包玩家都可以選擇是要先練習烘焙,還是直接挑戰開始烘焙。這2個的不同在於練習烘焙是有包含提示的,正式烘焙就是沒有提示的。而且練習是可以一直重覆練習同一個步驟直到熟練為止,正式烘焙就是失敗了也沒辦法重來,直接進入下一步驟。
在這裡我先不一一介紹每個關卡的過關方式,留點驚喜讓各位玩家自已去發掘應該會更有樂趣。
這個遊戲最特別的是,當你過關後,你可以到任何一個樂田麵包屋的門市,拿著你的iphone去兌換你完成的那一顆麵包。所以兌換麵包前,有一些需要注意的事項。當你通過所有關卡後,會出現選擇兌換麵包的“保存方式”的選擇畫面(如下):
為什麼不是過了關就可以直接到門市換麵包,而要選擇保存方式呢?這是我們希望透過這個遊戲來讓玩家能養成怎麼去品嚐麵包最佳風味的習慣。
所以,如果你在2天內可以直接去門市兌換麵包,那就選擇”常溫保存“,如果這2天不方便去換,那就選擇”冷藏保存“,可以多保存一天。
但是如果你選擇的是”冷藏保存“,那要記得要去兌換的當天,要先“回烤”,也就是按右下角那個有笑臉而且有寫”冷藏保存中,回烤並兌換“按鍵,它會自動跳到”回烤“那個關卡,設定好回烤的溫度,把麵包烤一下才會更好吃哦。
希望大家都會喜歡這個遊戲。如果有任何的卡關或是在遊戲過程中有發現任何的bug, 或是有任何的建議也請告訴我。可以讓我持繼的改進,讓這個遊戲更好玩。最後,別忘了,過關可以到下列門市換免費的麵包哦!
2012年3月1日 星期四
NSDateFormatter設定日期格式
日期常常會因不同的需求,以不同的型態出現,在iOS雖然會依你iphone/ipad上設定的國別自動調整日期習慣的顯示方式(例如台灣格式是年/月/日,美國格式就變成月/日/年), 但是有時侯你還是有需要自已設定成需要的格式。在這裡示範樂田麵包屋裡兌換商品畫面裡2個日期的實作:
首先,先講右邊圓形郵戳的實作:
先在.h宣告一個UILabel來讓日期顯示在畫面上
首先,先講右邊圓形郵戳的實作:
先在.h宣告一個UILabel來讓日期顯示在畫面上
IBOutlet UILabel *todayDate;//宣告一個UILabel叫todayDate
接下來在.m裡設置一個getDate這個程序來格式化這個日期
- (void)getDate{
NSDate *date = [NSDate date]; //先取得現在的日期時間
NSDateFormatter *form = [[NSDateFormatter alloc] init]; //宣告一個NSDateFormatter用來格式化日期
[form setDateFormat:@"yyyy.MM.dd"]; //把日期顯示的格式設成“yyyy.MM.dd"各代表的意義請參照下面列表
NSString *dateStr=[form stringFromDate:date]; //將格式化後的日期格式設成dateStr這個字串中
todayDate.text = dateStr; //設定todayDate這個label的文字為dateStr這個字串的值
}
日期格式代表意義
﹣﹣﹣﹣﹣﹣﹣﹣﹣﹣﹣﹣﹣﹣
﹣﹣﹣﹣﹣﹣﹣﹣﹣﹣﹣﹣﹣﹣
yyyy = 年(4位數), yy = 年(最後2位數),MM = 月(1~12),MMM = 月(英文縮寫),MMMM = 月(英文完整)
K = 時(12小時制),H = 時(24小時制),mm = 分,ss = 秒,aa = 午前/午後(AM/PM)
dd = 日,EEE = 星期(英文縮寫),EEEE = 星期(英文完整)
﹣﹣﹣﹣﹣﹣﹣﹣﹣﹣﹣﹣﹣﹣﹣﹣﹣﹣
接下來說明左側的“賞味期限”的日期格式,賞味期限的日期是今天後的2天。一樣先在.h宣告一個UILabel
IBOutlet UILabel *remainDate; //宣告一個UILabel叫remainDate
接下來在.m裡設置一個getRemainDate這個程序來格式化這個日期
- (void)getRemainDate{
NSDate *date = [NSDate date]; //一樣先取得日期的日期
//設定一個reserveDate是今天的日期加上2天,但是NSDate都是以秒處理,所以先算出2天一共是(2*24*60*60)秒, 用dateByAddingTimeInterval把算出來的秒數加到date這個我們剛取得的現在的日期中
NSDate *reserveDate = [date dateByAddingTimeInterval:(2*24*60*60)];
NSDateFormatter *form = [[NSDateFormatter alloc] init];//宣告一個NSDateFormatter用來格式化日期
[form setDateFormat:@"MM/dd"];//把日期設為月/日的格式
remainDate.text = [NSString stringWithFormat:@"%@",[form stringFromDate:reserveDate]];//跟上面例子最後2行一樣的功能,只是縮寫成一段就是變這個樣子
}
至於右邊郵戳怎麼轉15度角,請參考UIView 同時移動、旋轉、放大的作法
2012年2月2日 星期四
2012年1月31日 星期二
『向下拉』提示動畫實作
在遊戲的進行中,雖然讓玩家自行摸索過關的技巧是玩遊戲的一種樂趣,但是我們又不希望玩家卡在一個關卡後,就失去了繼續玩下去的興緻了,所以在樂田麵包屋遊戲中,有很多的操作需要有提示才能讓玩家可以順利的過關。這裡示範一個向下拉動畫的實作。
要完成這樣的一個動畫,可以有2種不同的方法,你可以用setAnimation的方法,也可以用animationImages的方法,如果用setAnimation的方法只要準備2張圖片,一張是向下的箭頭,另一張是手指,然後將箭頭的圖片固定,使用setAnimation的方法讓手指的圖片移動y座標,這樣就可以產生手指向下滑動的動畫。
但是我們今天示範另一個用animationImages的作法:首先,如上圖準備5張分格的圖,分別命名為dragDown_1.png到dragDown_5.png。然後在.h宣告一個
UIImage *dragDown
接著在.m實作dragDownTip的程序
- (void)dragDownTip{
dragDown.hidden = NO;
dragDown.animationImages = [NSArray arrayWithObjects:
[UIImage imageNamed:@"dragDown_1.png"],
[UIImage imageNamed:@"dragDown_2.png"],
[UIImage imageNamed:@"dragDown_3.png"],
[UIImage imageNamed:@"dragDown_4.png"],
[UIImage imageNamed:@"dragDown_5.png"], nil];
[dragDown setAnimationRepeatCount:3];
dragDown.animationDuration = 1.5;
[dragDown startAnimating];
}
當要執行動畫的時侯, 只要下指令:
[self dragDownTip];
就可以了。真是比setAnimation麻煩多了...當初我怎麼沒想到要用setAnimation的方法呢?真是不經一事,不長一智...
2012年1月27日 星期五
『樂田麵包屋』過關畫面分解
在樂田麵包屋遊戲中,每一次過關的時侯,都會有一段6秒鐘的過關畫面。雖然只有短短的6秒鐘,但是裡面包含了不算簡單的工作。在此將這些動作分解讓大家瞭解一下。
這個畫面雖然只包含了4個元素(從上圖左手邊的objects可以看得出來),一張背景,一個小廚師的圖,一個獎牌,和小廚師身邊的星星。
實際上這6秒的畫面包含了以下的畫面:
1張背景
2張小廚師
這個畫面雖然只包含了4個元素(從上圖左手邊的objects可以看得出來),一張背景,一個小廚師的圖,一個獎牌,和小廚師身邊的星星。
實際上這6秒的畫面包含了以下的畫面:
1張背景
2張小廚師
- (void)chefAnimate{
animationChef.animationImages = [NSArray arrayWithObjects:
[UIImage imageNamed:@"chef_verygood1.png"],
[UIImage imageNamed:@"chef_verygood2.png"],
nil];
[animationChef setAnimationRepeatCount:10];
animationChef.animationDuration = 1.5;
[animationChef startAnimating];
}
5張獎牌不同光澤
- (void)verygoodAnimate{
animationVerygood.animationImages = [NSArray arrayWithObjects:
[UIImage imageNamed:@"medalVerygood1.png"],
[UIImage imageNamed:@"medalVerygood2.png"],
[UIImage imageNamed:@"medalVerygood3.png"],
[UIImage imageNamed:@"medalVerygood4.png"],
[UIImage imageNamed:@"medalVerygood5.png"],
[UIImage imageNamed:@"medalVerygood1.png"],nil];
[animationVerygood setAnimationRepeatCount:10];
animationVerygood.animationDuration = 1;
[animationVerygood startAnimating];
}
1張閃爍不停的星星
- (void)starAnimation{
starImage.alpha = 0;
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:0.5];
[UIView setAnimationCurve:UIViewAnimationCurveEaseOut];
starImage.alpha = 1.0;
[UIView commitAnimations];
}
2012年1月24日 星期二
用presentModalViewController跳到另一個畫面
//如果是要從一個畫面(nib)跳到另一個畫面的方法,須指定要跳到的畫面,在這裡就是storeInfoViewController
- (IBAction)gotoStoreInfo:(id)sender {
storeInfoViewController *storeView = [[storeInfoViewController alloc] initWithNibName:nil bundle:nil];
[self presentModalViewController:storeView animated:YES];
}
//如果要回到剛才跳回來的畫面, 不需要指定要回到的畫面,反正它會自已回到剛才來的地方
- (IBAction)backToMenu:(id)sender {
menuViewController *menuView = [[menuViewController alloc] initWithNibName:nil bundle:nil];
[self presentModalViewController:menuView animated:YES];
}
2012年1月20日 星期五
用NSTimer讓程式慢個幾秒再做事
//在.h先宣告
NSTimer *delayTimer; //宣告一個NSTimer叫delayTimer(自已隨便取)
//在.m實作
delayTimer = [NSTimer scheduledTimerWithTimeInterval:1.5f //在1.5秒後再去執行stopShakeSalt這個程序
target:self
selector:@selector(stopShakeSalt)
userInfo:nil
repeats:NO];
2012年1月13日 星期五
用AVAudioPlayer播放音效
在.h的宣告部份
#import <AVFoundation/AVFoundation.h> //先import AVFoundation後才能使用這個功能
AVAudioPlayer *titleBGM; //宣告一個新的聲音叫titleBGM(自已隨便取)是屬於AVAudioPlayer型式
- (void) playBGM; //宣告播放playBGM的功能
在.m的實作部份
//在init的時侯先設定titleBGM要播放音效檔
-(id)init{
if (self = [super init]) {
//下面紅字這一段是設定titleBGM
NSBundle *bundle = [NSBundle mainBundle];
NSString *path = [bundle pathForResource:@"menu" ofType:@"wav"];
NSURL * url = [NSURL fileURLWithPath:path];
titleBGM =[[AVAudioPlayer alloc] initWithContentsOfURL:url
error:nil];
self->titleBGM.delegate = self;
}
return self;
}
//實作playBGM
- (void) playBGM{
[titleBGM play];
}
//播放的使用方法
[titleBGM play];
2012年1月10日 星期二
用systemSoundID播放音效
在.h的宣告部份
#import <AudioToolbox/AudioToolbox.h> //先import AudioToolbox後才能使用這個功能
SystemSoundID magicSound; //宣告一個新的聲音叫magicSound(自已隨便取)是屬於SystemSoundID型式
-(void)playMagicSound; //宣告播放magicSound的功能
在.m的實作部份
//在init的時侯先設定magicSound要播放音效檔
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
//下面紅字這一段是設定magicSound
NSURL *magicUrl = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"magic-chime" ofType:@"wav"]];
OSStatus magicError = AudioServicesCreateSystemSoundID((__bridge CFURLRef)magicUrl, &magicSound);
if(magicError){
NSLog(@"error:%ld",magicError);
}
}
return self;
}
//實作playMagicSound
-(void)playMagicSound{
AudioServicesPlaySystemSound(magicSound);
}
//播放的使用方法
[self playMagicSound];
2012年1月6日 星期五
用setAnimation呈現動畫
- (void)showLines{
lines.hidden = NO; //設定原本是隱藏
CGPoint Lpos = lines.center;
Lpos.y = -12.0f; //原本的位置是y座標在-12
lines.center = Lpos;
//這裡以上是動以前的位置
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:1];
[UIView setAnimationCurve:UIViewAnimationCurveEaseOut];
//這裡以下是預計要動的目的地
Lpos.y = 10.0f; //讓要移動的物件從-12移到y座標10, 也就是垂直往下移動
lines.center = Lpos;
[UIView commitAnimations]; //執行移動的指令
}
2012年1月3日 星期二
用animationImages呈現動畫
-(void)showGood{
chefAnimation.animationImages = [NSArray arrayWithObjects:
[UIImage imageNamed:@"chef_good1.png"], //動畫由哪些圖片組成
[UIImage imageNamed:@"chef_good2.png"],
[UIImage imageNamed:@"chef_good2.png"],
[UIImage imageNamed:@"chef_good2.png"],
[UIImage imageNamed:@"chef_good2.png"],
nil];
[chefAnimation setAnimationRepeatCount:3]; //動畫重覆播放的次數
chefAnimation.animationDuration = 3; //動畫每一輪的時間(秒)
[chefAnimation startAnimating]; //開始執行動畫
}
訂閱:
文章 (Atom)

















