こんにちは。

まーぶるです。

ずっとずっと更新が滞っております。
ほんとにすみません。

Macの環境ががらっと変わってしまって手を付けれずにていました。

MacをLionに何も考えず、アップデートした。
さらにXcodeを4にアップデートし、さらに4.2、4.2.1まであげてしまいました。
LionでXcodeをダウンロードすると無料でXcode4を利用できます。
Lion自体は2600円
最新OSなのにここはかなり良心的。すばらしい。

AppStoreからダウンロードしてインストールするとダウンロードファイルが消えてしまうらしく、
なんかもったいない。。、再ダウンロードすればいいんだけど、なにしろデカいので、
起動ディスクとしてLionを作って、MacのHDを一度前夫消して、
Lionをいちからクリーンインストールしたってわけです。

もしご要望があれば、起動ディスクの作成の仕方とかを記事にしますよ~

ちなみにXcodeはオール英語です(・・;)

ちょっとXcodeをいじくってみると

$無知の状態からiPhoneアプリ開発に挑んでみる-2011-11-20 3.09.04

上をご覧ください。

なんかおもいなと思いつつ、メモリ確認ソフトをみてみると、のこり19M。。
2G積んでるのに。
前の環境ではメモリ確認ソフトは入れていなかったけど、
どんなもんだったのだろうか?
これはXcode(シミュレータも)とChromeを立ち上げているだけ。

推奨環境は?さき調べろよって感じですよねぇ。
頻繁にメモリ解放ツールを使って耐えてけばいいのか?

みなさんどんな環境でやってるんだろう。
ぼくの環境がおかしいの?
どうにかならんもんかなぁ。

Xcode4はさまざまなところで、変更されまくり、
しょっぱなの新規プロジェクトの作成のところからすでに全然違う。
「View-based Application」がまずない。
「Single View Application」に変更されている。

まだ、これに関する書籍や情報が少ないのでなかなか調べられないのもキツいんですよね。

インターフェースビルダーがなくなっちゃいました。
というより、Xcodeに統合された様子。これによてメモリ食ってるのかなぁ。

また、メモリ管理にうれしい機能がついたようです。その名もARC
開発者がメモリの解放コードを書かなくても、自動でそれを行ってくれるようにコンパイルしてくれるとのことです。

あと、StoryBoard機能が新しく加わりました。
これはXcode上のGUIで同時に2画面並べて開発ができて、
ボタンを一個作って、そこから矢印をもう一つの画面へのばせば、コードなしでそれだけで、
画面遷移ができちゃいます。
直感的にできるのでこれもなかなかすばらしいと思います。

まだiphone開発の熱は全然さめていない(むしろ激アツ)のであります。

ちなみにiphoeはとりあえず、今の3GSでがんばっています。
お、重い。特に日本語をうつときいちいち引っかかる感じがする。
(予測変換とか、履歴を消せばマシになる)
5ーー早く出てほしーー。

それでは、このへんで、
みなさんおやすみなさい。






こんちは。(・ω・)/

iPhone5どーなるんでしょうかね。

ネットではいろんな情報が出回って、画像までもが閲覧できますが、
どれも信憑性がない。。
もちろん公式に発表されているものではなく、どちらかさんが予想したもんが、
一人歩きしてるんでしょうね。
まぁ噂だけで、ここまで盛り上がれるiPhoneはそれはそれですごいと思いますけどね。
期待されているんでrしょう。

アンドロイドにシェアを奪われつつありますが、巻き返しなるかどうか!
Appleがんばってくれよー。


さて、前回中途半端での実装で落ちてしまうところで終わってしまいました。

今日は一気にメソッドだけを載せますので、解説は次回ということで、、、許してください( p_q)

3つのメソッドです。

 最初に呼ばれる
 checkExplosion:
 画面のパネルを捜査していく
 checkExplosionFromLayerc:
 パネルを消した後に上のパネルを下に詰める
 finishExplosion:

上から順番に、

PlayViewController.mに追加してください。

- (BOOL)checkExplosionFromLayer:(CALayer *)baseLayer
{
NSString *layerName = baseLayer.name;
CGPoint panelPos = baseLayer.position;
int px = (panelPos.x - 59) / (42 + 1);
int py = (panelPos.y - 53) / (42 + 1);

int count = 1;
for (int x = px-1; x >= 0; x--) {
CALayer *aLayer = [backView.layer
hitTest:CGPointMake(59 + (42 + 1) * x, panelPos.y)];
if (![aLayer.name isEqualToString:layerName]) {
break;
}
count++;
}
for (int x = px+1; x < 6; x++) {
CALayer *aLayer = [backView.layer
hitTest:CGPointMake(59 + (42 + 1) * x, panelPos.y)];
if (![aLayer.name isEqualToString:layerName]) {
break;
}
count++;
}
if (count >= 3) {
return YES;
}

count = 1;
for (int y = py-1; y >= 0; y--) {
CALayer *aLayer = [backView.layer
hitTest:CGPointMake(panelPos.x, 53 + (42 + 1) * y)];
if (![aLayer.name isEqualToString:layerName]) {
break;
}
count++;
}
for (int y = py+1; y < 6; y++) {
CALayer *aLayer = [backView.layer
hitTest:CGPointMake(panelPos.x, 53 + (42 + 1) * y)];
if (![aLayer.name isEqualToString:layerName]) {
break;
}
count++;
}
if (count >= 3) {
return YES;
}

return NO;
}



- (BOOL)checkExplosion
{
// 初回のチェック時には起点のパネルからの連なりをチェックする
if (movingLayer1) {
if (![self checkExplosionFromLayer:movingLayer1] &&
![self checkExplosionFromLayer:movingLayer2])
{
return NO;
}
movingLayer1 = nil;
movingLayer2 = nil;
}

NSMutableArray *tempList = [[NSMutableArray alloc] init];

for (int y = 0; y < 6; y++) {
NSString *currentName = nil;
for (int x = 0; x < 6; x++) {
CALayer *aLayer = [backView.layer
hitTest:CGPointMake(59 + (42 + 1) * x, 53 + (42 + 1) * y)];
NSString *layerName = aLayer.name;
if ([layerName isEqualToString:currentName]) {
[tempList addObject:aLayer];
} else {
currentName = layerName;
if ([tempList count] >= 3) {
[deletingLayers addObjectsFromArray:tempList];
}
[tempList removeAllObjects];
[tempList addObject:aLayer];
}
}
if ([tempList count] >= 3) {
[deletingLayers addObjectsFromArray:tempList];
}
[tempList removeAllObjects];
}

for (int x = 0; x < 6; x++) {
NSString *currentName = nil;
for (int y = 0; y < 6; y++) {
CALayer *aLayer = [backView.layer
hitTest:CGPointMake(59 + (42 + 1) * x, 53 + (42 + 1) * y)];
NSString *layerName = aLayer.name;
if ([layerName isEqualToString:currentName]) {
[tempList addObject:aLayer];
} else {
currentName = layerName;
if ([tempList count] >= 3) {
[deletingLayers addObjectsFromArray:tempList];
}
[tempList removeAllObjects];
[tempList addObject:aLayer];
}
}
if ([tempList count] >= 3) {
[deletingLayers addObjectsFromArray:tempList];
}
[tempList removeAllObjects];
}

CABasicAnimation *anime1 =
[CABasicAnimation animationWithKeyPath:@"transform.scale"];
anime1.duration = 0.3;
anime1.fromValue = [NSNumber numberWithFloat:1.0f];
anime1.toValue = [NSNumber numberWithFloat:1.5f];

CABasicAnimation *anime2 =
[CABasicAnimation animationWithKeyPath:@"opacity"];
anime2.duration = 0.3;
anime2.fromValue = [NSNumber numberWithFloat:1.0f];
anime2.toValue = [NSNumber numberWithFloat:0.0f];

for (CALayer *aLayer in deletingLayers) {
aLayer.opacity = 0.0f;
[aLayer addAnimation:anime1 forKey:nil];
[aLayer addAnimation:anime2 forKey:nil];
}

[tempList release];

if ([deletingLayers count] > 0) {
[NSTimer scheduledTimerWithTimeInterval:0.3 target:self
selector:@selector(finishExplosion:) userInfo:nil repeats:NO];
return YES;
} else {
state = PlayStateChoose;
return NO;
}
}



- (void)finishExplosion:(NSTimer *)timer
{
for (CALayer *aLayer in deletingLayers) {
[aLayer removeFromSuperlayer];
}
[deletingLayers removeAllObjects];

BOOL hasDropped = NO;

for (int x = 0; x < 6; x++) {
int count = 0;
for (int y = 0; y < 6; y++) {
CALayer *aLayer = [backView.layer hitTest:
CGPointMake(59 + (42 + 1) * x, 53 + (42 + 1) * y)];
if ([aLayer.name hasPrefix:@"panel"]) {
count++;
}
}

int y = 5;
for (int i = 0; i < count; i++) {
while (y >= 0) {
CALayer *aLayer = [backView.layer hitTest:
CGPointMake(59 + (42 + 1) * x, 53 + (42 + 1) * y)];
y--;
if (aLayer && [aLayer.name hasPrefix:@"panel"]) {
CGPoint targetPos = CGPointMake(
59 + (42 + 1) * x, 53 + (42 + 1) * (5-i));
if (!CGPointEqualToPoint(aLayer.position, targetPos)) {
aLayer.position = targetPos;
hasDropped = YES;
}
break;
}
}
}
}

if (hasDropped) {
[NSTimer scheduledTimerWithTimeInterval:0.3 target:self
selector:@selector(checkExplosion) userInfo:nil repeats:NO];
} else {
state = PlayStateChoose;
}
}


さて次回は気合いを入れていかないとねーーヽ(;´ω`)ノ


という事でまた次です!
下のクリックすうがぼくのやる気?につながるので、

応援よろしくお願いします!
にほんブログ村 IT技術ブログ iPhoneアプリ開発へ


にほんブログ村 携帯ブログ iPhoneへ


暑い!

でも節電節電ーヽ(;´ω`)ノ

今日はパネルを消すとかそういうのをやっていきます。

以前の回に後回しにしてたところで、パネルが消せるかの判定をするやつですね。

PlayViewController.hへ変数とメソッドを追加しましょう。


  


@interface PlayViewController : UIViewController {

IBOutlet UIImageView *backView;
IBOutlet UIImageView *frontView;
IBOutlet UILabel *scoreLabel;
IBOutlet UILabel *timeLabel;

PlayState state;
BOOL isFinished;

CALayer *movingLayer1;
CALayer *movingLayer2;

NSMutableSet *deletingLayers;
}

- (BOOL)swapLayers;
- (BOOL)checkExplosion;

@end


deletingLayers という変数と、
checkExplosion というメソッドです。

deletingLayersは削除するパネルを格納しておくためのもので、
checkExplosionはパネルが3つ並んで消せるかどうかチェックし、消せるならそのアニメーションを表示します。

では、これを初期化するために、PlayViewController.mのviewWillAppear:メソッドにNSMutableSetを確保しておきます。
 
- (void)viewWillAppear:(BOOL)animated{
srand((unsigned)time(NULL));
state = PlayStateChoose;
isFinished = NO;

deletingLayers = [[NSMutableSet alloc] init];

for(int y = 0; y < 6; y++){

 :


でこれを解放するための、viewDidDisappear:メソッドを追加しておきましょ。

- (void)viewDidDisappear:(BOOL)animated {
[deletingLayers release];
}


NSMutableSetというのは、動的に数や内容を変更できるオブジェクトの集合らしいです、(・・;)

はい、それでは肝心の判定メソッドを呼び出す後回しにしていたところを修正します。
finishChange:メソッドです。

- (void)finishChange:(NSTimer *)timer {
if (![self checkExplosion]) {
// 消せない場合、交換したパネルを元に戻す
CGPoint panelPos1 = movingLayer2.position;
CGPoint panelPos2 = movingLayer1.position;
movingLayer1.position = panelPos1;
movingLayer2.position = panelPos2;
movingLayer1 = nil;
movingLayer2 = nil;

state = PlayStateChoose;
}


はい、準備が整いました。

ここで実行しても動作はしますが、パネルを交換すると落ちます!
だってメソッドの実装部分がないもんね。

では、次回からはがっつりメソッドの中身を書いていきたいと思います!!

それにしても暑い。

ダイソンの羽の無い扇風機が気になっているところ、
でもバカ高いので、「ダイソンじゃない羽の無い扇風機」が結構出ている!
価格も安い!ヽ(゚◇゚ )ノ
、、、ま、羽があるほうでいいか。。。



応援よろしくお願いします!
にほんブログ村 IT技術ブログ iPhoneアプリ開発へ


にほんブログ村 携帯ブログ iPhoneへ