こんちは。(・ω・)/

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へ