2013-09-28 183 views
5

Tôi có đoạn mã sau:Trình tự SKAction có thực sự chờ cho đến khi hành động kết thúc không?

-(void)aggravatedSeek:(SKSpriteNode *)target{ 
    _isAggravated = YES; 

    SKAction *action = [SKAction runBlock:^{ 
     double randTime = 0.2; 
     NSLog(@"%f", randTime); 
     [self moveToSpriteNode:target withTimeInterval:randTime]; 
    }]; 

    //SKAction *repeatAction = [SKAction repeatAction:action count:6]; 
    SKAction *rep = [SKAction sequence:@[action, action, action, action, action]]; //Test Sequence 

    [self runAction:rep completion:^{ 
     [self runAction:blackColorAction]; 
     _isAggravated = NO; 

    }]; 
} 

Tôi muốn hành động của tôi thực sự chờ đợi cho đến khi hành động trước đó được thực hiện. Có nghĩa là, hành động của tôi cần phải được sắp xếp theo thứ tự sao cho hành động rep không lặp lại hành động action cho đến khi đối tượng HOÀN THÀNH di chuyển. Hiện tại, có vẻ như đầu ra ngay lập tức chạy tất cả các hành động và không sắp xếp chúng như mong muốn. Tôi đã đọc tài liệu và những gì tôi có bây giờ là những gì họ nói để làm ...

Trả lời

4

Hành động runBlock: là một loại hành động cháy một lần. Nó sẽ chạy khối chính xác một lần, sau đó hành động "kết thúc" ngay lập tức sau đó.

Điều bạn muốn là hành động nào đó không được thiết kế để xử lý. Chúng chạy một lần, hoặc trong một khoảng thời gian nhất định (thời gian). Họ không, tuy nhiên, chạy cho đến khi một số điều kiện tùy ý được đáp ứng - có thể đúng ngay lập tức, có thể trở thành sự thật cuối cùng hoặc có thể không bao giờ trở thành sự thật. Kiểu này làm mất hiệu lực tất cả các hành động tính năng thời gian biến có khả năng (tức là tỷ lệ thuận với quy mô thời gian).

Những gì bạn có thể làm là phát hành chuyển động "moveToSpriteNode" dưới dạng tác vụ và kiểm tra riêng phương thức cập nhật xem liệu sprite đã đến nút hay chưa. Nếu vậy, bạn sẽ chạy hành động chuyển động tiếp theo (không sử dụng chuỗi).

Dễ dàng hơn bạn chỉ có thể dựa vào hành động di chuyển để kết thúc có nghĩa là sprite đã đến nút đích. Sau đó, điều đó sẽ kích hoạt hành động di chuyển tiếp theo trong chuỗi. Nếu bạn muốn chạy một khối hoàn thành tại mỗi mục tiêu, chỉ cần lên lịch hành động di chuyển tiếp theo từ bên trong khối hoàn thành.