Category Archives: Cấu trúc dữ liệu trong database

Thuật toán ngẫu nhiên trong GameplayKit (Phần 1)

I. Thuật toán ngẫu nhiên trong GameplayKit:

Đối với những trò chơi mà xác suất và cơ hội đóng vai trò chính thì thuật toán ngẫu nhiên chính là cốt lõi của cả trò chơi. Khi bạn chơi một trò chơi trên những bàn cờ (board games) thì những điểm của xúc xắc quyết định số nước đi của người chơi hay việc xào bài trong một trò chơi bài bạc như xí dzách, tiến lên. Những điều bất ngờ trong game tạo ra những điểm hấp dẫn dành cho game và thay đổi toàn bộ cách chơi nếu bạn thay đổi xác xuất trong game. Tính ngẫu nhiên có vẻ đơn giản nhưng thực sự để có được sự ngẫu nhiên tốt trong 1 game nó không dễ dàng chút nào.

Việc tạo ra tính ngẫu nhiên trong 1 game kích thích người chơi cố gắng hơn trong việc tiến tới mục tiêu. Việc có được viên kim cương với tỉ lệ 10 % sẽ rất hảo hứng vì nó cho người chơi một mục tiêu cụ thể hơn cho việc hạ gục một con boss trong trò chơi so với việc không biết gì về khả năng có thể có được viên kim cương đó. Tuy nhiên việc đánh hơn 50 lần vẫn không thể có được sẽ làm cho người chơi không còn niềm tin vào tỉ lệ này.

Chính từ những điểm này mà ta cần phải tập trung vào những điểm quan trọng trong việc tạo ra các ngẫu nhiên trong trò chơi.

+ Tính ngẫu nhiên: Một con số hay tỉ lệ ngẫu nhiên nghĩa là bạn không thể đoán ra được (dĩ nhiên là không phải trong tình trạng tỉ lệ 100 %). Tuy nhiên, một thuật toán ngẫu nhiên tốt là gì? Dĩ nhiên là nó khó đoán trước nhưng đó không phải là tất cả những gì có thể có của 1 thuật toán ngẫu nhiên tốt. Thuật toán ngẫu nhiên tốt phải bao gồm cả việc cân bẳng trong giới hạn của nó. Khi bạn ngẫu nhiên 10.000 số trong giới hạn 1-100 thì việc ra các số này phải có tỉ lệ tương đồng với nhau và không có số nào là không xuất hiện. Chu kỳ lặp lại của nó cũng cần phải khó đoán, trong 100 số thì không có sự lặp lại của những khối số.

+ Hiệu suất: Việc tạo ra một đoạn mã thực thi phức tạp để tạo ra tính ngẫu nhiên tốt nhất dĩ nhiên là tốt, tuy nhiên, nó phải đi kèm với hiệu suất tốt. Bạn không thể cho chạy một thuật toán phức tạp chỉ để cho ra 1 số trên mặt xúc xắc trong khi có hàng ngàn thứ khác đang cần xử lý.

+ Định luận: Một trò chơi chất lượng đòi hỏi cần phải được kiểm tra đầy đủ (Test), tuy nhiên với các thuật toán ngẫu nhiên thì việc điểm định hết tất cả các trường hợp trong game gần như là không thể. Một thuật toán ngẫu nhiên tốt sẽ duy trì những tình huống bất ngờ trong game dành cho người chơi. Thêm vào đó, nó cần được quan tâm đúng mức để có thể mở rộng ra khi cần thiết.

+ Tính độc lập: Những con số hay nguồn ngẫu nhiên phải độc lập so với kết quả gần nhất.

+ Tính ngẫu nhiên tương đồng: Những gì được ngẫu nhiên cần phải tương đồng với tất cả các kết quả được đưa ra.

  • Cách sử dụng Randomization trong game:

Toàn bộ những lớp ngẫu nhiên, tính ngẫu nhiên hoá trong GameplayKit đều thông qua giao thức GKRandom. Nó sử dụng thông qua các mô thức tối thiểu trong các giao diện. Chính vì vậy việc đầu tiên bạn cần là chọn ra cách thức ngẫu nhiên phù hợp với game của bạn, tất cả những gì còn lại hãy để cho GameplayKit làm dùm:

+ Trong hầu hết các trường hợp, bạn sẽ cần một con số ngẫu nhiên đồng nhất trong 1 khoản giới hạn. Ví dụ như bạn cần 1 số nằm trong khoản giữa 1 tới 100. Như vậy thứ bạn cần là GKRandomDistribution.

+  Để tuỳ chính tính ngẫu nhiên nhưng vẫn mang tính đồng nhất giữa chúng, bạn có thể chọn những lớp phụ nằm trong GKRandomSource

+ Để có thể tuỳ chỉnh tính ngẫu nhiên (không còn đồng nhất) thì bạn cần phải dùng đến các lớp GKGaussianDistribution hay GKShuffledDistribution

+ Nếu bạn không cần sử dụng đến thuật toán ngẫu nhiên trong một khoảng hay một giới hạn nào đó thì bạn chỉ việc sử dụng trực tiếp GKRandomSource

+ Bạn chỉ việc sử dụng GKRandomSource để ngẫu nhiên một mảng (array) như ngẫu nhiên xào bài.

+ Bạn chỉ việc đưa mảng vào  arrayByShuffelingObjectsInArray:

+ Lệnh sẽ trả về một nhân bản với thứ tự ngẫu nhiên.

Swift Code – Biến và hằng số

Trong lập trình, việc đầu tiên một lập trình viên cần phải làm là bắt tay vào khai báo và định nghĩa các biến, sau đó chúng ta mới lưu trữ và sử dụng nó cho chương trình. Đối với Swift, biến cũng là một thành phần không thể thiếu.

Chúng ta sẽ bắt đầu với việc khai báo một biến trong Swift. Hãy xem một ví dụ:

var lapKanTitle: String = “LapKan Corp.”

Ở trên, ta vừa khai báo một biến tên lapKanTitle kiểu String và có giá trị khởi tạo là “LapKan Corp.”. Đây cũng là cách khai báo biến phổ biến nhất trong Swift!

Tiếp theo là một ví dụ khác:

let lapKanTitle: String = “LapKan Corp.”

Hai câu lệnh khá giống nhau, chỉ khác nhau ở từ khóa var và let. Vậy, sự khác biệt ở đây là gì? Trong câu lệnh thứ nhất, từ khóa var khai báo một biến và biến này có thể thay đổi giá trị, còn ở câu lệnh thứ hai, với từ khóa let ta có thể hiểu biến ở đây như là một biến Constants (hằng số) và giá trị của biến sẽ không thay đổi trong suốt chương trình!

Hãy xem một vài ví dụ khác:

let lapKanTitle: String = “LapKan Corp.”

var lkVersion: Double = 1.0

let lkLevel: Int = 1000

let lkIsAwesome: Bool = true

Ở trên, chúng ta có 3 hằng số và một biến thường!

Cùng với sự ra đời của Swift, Apple cũng cho thêm 1 định nghĩa mới là “Type Inference” (Nói mới là Apple mới ra cho họ thôi, chứ cái này bên C # có lâu rồi, ngôn ngữ khác thì hem biết). Đại khái nó như thế này:

let lapKanTitle = “Swift” // inferred as String

var lkVersion = 1.0 // inferred as Double

let lkLevel = 1000 // inferred as Int

let lkIsAwesome = true // inferred as Bool

Cách khai báo mới này so với cách khai báo trước có gì khác nhau? Dễ dàng nhận thấy các biến đã được lược bỏ các kiểu dữ liệu như String, Double, Int, Bool. Đây chính là Type Inference mà ta đã nhắc tới ở trên. Điều này có ý nghĩa gì? Chúng ta có khả năng khai báo các biến tự do hơn trước nhiều. Nhiều lúc khi sử dụng, Swift sẽ có lựa chọn đúng hơn cho kiểu dữ liệu giúp chúng ta tiết kiệm được bộ nhớ cho việc sử dụng kiểu biến hay nếu chúng ta có thay đổi một kiểu biến ở đâu đó thì chương trình vẫn tối ưu hoá và chạy đúng. Nó khôn chỉ tiết kiệm được thời gian, công sức mà còn rút ngắn được code viết ra.

Thế thì tại sao Swift vẫn hỗ trợ việc khai báo có chứa kiểu dữ liệu như trên, đó là vì có những lúc chúng ta buộc phải sử dụng đúng kiểu dữ liệu để chương trình chạy được. Swift không phải vạn năng để lúc nào cũng hiểu được chính xác lập trình viên nghĩ gì (thật ra có lẽ chính lập trình viên cũng éo hiểu lúc đó nghĩ gì) nên vẫn có những lúc mà chúng ta cần định nghĩa chính xác thứ mà bạn muốn.

Lời khuyên cho lập trình viên là: Hãy sử dụng tối đa lợi thế không cần khai báo biến để giúp cho bạn tiết kiệm thời gian, công sức và dễ dàng bảo trì code trong tương lai.

Lập trình trí tuệ nhân tạo dành cho các nhân vật (AI)

Một game sinh ra không phải bao giờ cũng chỉ có những hành động đơn giản được lập trình trước mà còn có thể tuỳ theo tình huống mà các đối tượng có những cách phản ứng hợp lý hơn gây khó khăn và tạo hứng thú cho người chơi. Bạn đâu muốn chơi một trò chơi mà những nhân vật của máy chỉ biết lao đầu vào bạn để chết đúng không?

Sau đây là phương pháp để tạo trí tuệ nhân tạo với Sprite-Kit. 

Đầu tiên bạn phải hiểu rằng, từng nhân vật bạn tạo ra là một đối tượng được điều khiển hoàn toàn riêng biệt trong Sprite-Kit. Bạn có thể add một phần điều khiển vào trong từng đối tượng này để nó có thể tránh né những viên đạn hay đuổi theo người chơi nhằm làm game thực và khó khăn hơn.

Tuy nhiên tạo ra 100 loại quái vật bạn phải ép để viết 100 loại trí tuệ nhân tạo khác nhau là việc làm hết sức nhảm nhí. Chúng ta cần tách riêng giữa nhân vật trong game và trí tuệ nhân tạo của nó, làm như vật bạn không chỉ có thể đưa bất kì trí tuệ nhân tạo (AI) cho các loại quái vật mà còn có thể thay đổi nó một cách dễ dàng. Ngoài ra việc bảo trì và sửa chữa những lỗi trong đó cũng nhẹ nhàng hơn rất nhiều so với việ ép tất cả vào trong cùng một lớp (class) nhân vật.

* Về các bước, bạn cần hiểu nó như sau:

Chúng ta sẽ chia ra làm những lớp sau để quản lý chương trình dễ dàng:

+ LKCharacterNode: là lớp cơ sở nhất của nhân vật, đây là nguồn của mọi nhân vật từ các nhân vật anh hùng (do bạn điều khiển), các loại quái vật (do máy điều khiển) đều bắt đầu từ đây.

+ LKHeroCharacter: là lớp nhân vật do người chơi điều khiển (có thể không chỉ có một vì chúng ta có thể phát triển những game multiplayer có nhiều người chơi) => Từ đây bạn có thể phát triển thành những lớp nhân vật hoàn toàn khác biệt như Chiến binh (Warrior), Pháp sư (Wizard) hay Cung thủ (Ranger) tuỳ vào game của bạn. Đây chính là đối tượng mà các quái vật tìm và tiêu diệt.

+ LKEnemyCharacter: Đây chính là đối tượng cần đến trí tuệ nhân tạo được lập trình bởi các lập trình viên. Đối với những trí tuệ nhân tạo (AI), ta chỉ cần tạo ra sau đó để chúng lên bản đồ lập tức AI sẽ điều khiển những đối tượng này và chúng sẽ tự biết làm những gì để tiêu diệt các anh hùng của chúng ta. Hay đơn giản hơn, trí tuệ nhân tạo sẽ điều khiển các quái vật này đi theo những đường mà người chơi không đoán trước được để làm cho màn chơi trở nên lý thú hơn.

* Ta sẽ đi sâu vào code hơn nữa để hiểu hơn về cách tạo trí tuệ nhân tạo này:

+ LKCharacterNode: sẽ bao gồm những thuộc tính mà bạn cần để chương trình chạy tốt ví dụ như isDead, isStun, lkHealth và những thuộc tính mà bạn cần. Trí tuệ nhân tạo cũng có thể lấy các thuộc tính này ra để xem xét những hành động của đối tượng ví dụ như khi thấy số lượng máu quá thấp nó sẽ tự động chạy trốn hay hành động như thế nào là tuỳ theo ý bạn. Phần này, mỗi người có những thuộc tính cần thiết hay khộng và mỗi game mỗi khác nên tôi sẽ không đi sâu vào nó.

+

+ LKEnemyCharacter: Đây là phần chính của hướng dẫn. Việc đính kèm một trí tuệ nhân tạo sẽ nằm ở đây.

Trong file hedader bạn sẽ cần có những dòng code sau:

#import “LKCharacterNode.h”

@class LKArtificialIntelligence;

@interface LKEnemyCharacter : LKCharacterNode

@property (nonatomic) LKArtificialIntelligence * lkIntelligent;

@end

Bạn kết nối giữa lớp LKArtificialIntelligence với lớp LKEnemyCharacter làm cho 2 lớp này cùng có thể sử dụng và gọi lẫn nhau. Lớp AI giờ là một phần của lớp LKEnemyCharacter và được sử dụng và làm bất cứ thứ gì trong lớp này. Vậy là ta có thể điều khiến chính lớp LKEnenmyCharacter bằng lớp AI này.

Trong file .m ta có những dòng code sau:

#import “LKEnemyCharacter.h”

#import “LKArtificialIntelligence.h”

 

@implementation LKEnemyCharacter

#pragma mark – Loop Update

– (void)updateWithTimeSinceLastUpdate:(CFTimeInterval)interval {

[super updateWithTimeSinceLastUpdate:interval];

[self.lkIntelligent updateWithTimeSinceLastUpdate:interval];

}

}

@end

Đây là phần điều khiển của AI được gắn vào trong đối tượng Enemy. Bạn sẽ gọi lệnh Update này để chương trinh điều khiển. Dòng code super để làm những việc điều khiển bạn đã viết trên LKCharacterNode. Còn dòng intelligent mới thực sự là dòng lệnh bạn cần để AI điều khiển đối tượng.

Thế là chương trình sẽ có phần điều khiển dành cho AI. Giờ thứ bạn cần là một AI để đối tượng hoạt động theo ý muốn của bạn.

* Phần AI: 

– AI là một đối tượng được đính kèm trong LKCharacterNode. Trong đối tượng,

* Đây là phần code tong AI header:

@class LKCharacterNode;

@interface LKArtificialIntelligence : NSObject

@property (nonatomic, weak) LKCharacterNode *character;

@property (nonatomic, weak) LKCharacterNode *target;

– (id)initWithCharacter:(LKCharacterNode *)character target:(LKCharacterNode *)target;

– (void)clearTarget:(LKCharacterNode *)target;

– (void)updateWithTimeSinceLastUpdate:(CFTimeInterval)interval;

@end

+ Như đã giải thích ở trên @class sẽ làm cho lớp này nằm trong một lớp khác và trở thành một phần của lớp kia. AI cần có đối tượng để có thể đưa ra hành động hợp lý, nó cũng cần phải biết đối tượng nó được đính kèm là đối tương nào nên 2 đối LKCharacterNode chính là 2 đối tượng đó. Ngoài ra thì AI không tự khởi tạo mà nó được khởi tạo bới lập trình viên nếu muốn nên nó cũng kèm them một lệnh init. Lệnh update để điều khiển đối tượng đi theo quỹ đạo cần thiết.

 

(Phê rồi từ từ update tiếp, để xem có ai hứng thú không chứ viết bài không ai coi buồn lắm 😀 )

Làm quen với hệ thống vật lý trong Sprite Kit!!

Hệ thống engine vật lý trong Sprite Kit sử dụng engine vật lý Box 2D. Tuy nhiên nó được Apple đưa thẳng vào trong framework Sprite Kit nên bạn sẽ không biết hoặc không thể can thiệp bất cứ thứ gì vào trong hệ thống vật lý này.

Điều này cũng có thêm một ý nghĩa khác chính là nếu Apple có thay thế Box2D bằng một engine vật lý khác mạnh mẽ hơn thì bạn cũng không thể nào biết được.

* Đầu tiên ta cần phải hiểu rõ về những điều cơ bản trong hệ thống vật lý này. Đối với Sprite Kit, bạn chỉ cần viết code quy định những thuộc tính của các đối tượng phần còn lại cứ giao cho engine vật lý của Sprite Kit làm việc. Bạn không cần phải làm thêm gì cả để cho hệ thống chạy. Điều này đem lại một ưu điểm là tất cả các game điều có điều bất ngờ mà ngay cả người lập trình ra nó cũng không thể đoán trước được.

– Bạn quy định cần phải làm tất cả những bước như thế này để chiến thắng màn chơi nhưng nhờ tính chất tương tác giữa các đối tượng mà thậm chí người chơi không cần phải làm nhiều đến thế nhưng vẫn đạt được mục đích. Điều đó khiến cho game có nhiều tình huống bất ngờ xảy ra và làm cho game trở nên thú vị hơn.

1. Đầu tiên bạn cần biết về các đối tượng vật lý:

– Các đối tượng muốn bị ảnh hưởng bởi các nguyên tắc vật lý trong môi trường của Sprite Kit cần phải có một cơ thể (physicalBody) thì Sprite Kit mới biết phải làm gì với các đối tượng này.

– Có 2 loại physicalBody:

+ Dynamic Body: là một loại đối tượng vật lý chịu tác động hoàn toàn bởi các luật vật lý trong ứng dụng và có thể có các hình dạng khác nhau tuỳ vào lập trình viên định nghĩa

+ Static Body là đối tượng vật lý không chịu tác động bới các nguyên tắc vật lý tuy nhiên nó lại tương tác với các đối tượng vật lý khác ví dụ như phần bao bên ngoài game để các đối tượng không bị rớt ra khỏi màn hình bởi trọng lực.

2. Các lực trong Sprite Kit:

– Lực trong Sprite Kit có 2 loại:

+ Force: Lực này tác động lên toàn bộ đối tượng và từ từ

+ Impact: Là lực tác động trực tiếp lên đối tượng và có tác động ngay lập tức

 

=> Từ từ viết tiếp hôm nay hơi bị phê roài 🙂 will be continues in next day ^.^

Kiểm tra SKSpriteNode nào được chạm trong game

Trên scene khi chúng ta cần bắt một touch vào scene xem có chạm vào Node nào không thì ta dùng
NSArray * nodes = [self nodesAtPoint:[touch location]];

Sprite-Kit có chức năng để xem bạn có chạm vào các đối tượng trên màn hình hay không bằng cách cho bạn được check xem trong những node được chạm phải có cái nào giống như bạn cần hay không bằng các chạy một vòng lặp For trong NSArray mà chương trình trả về.

* Đối với các trường hợp cụ thể hơn, khi ta muốn touch này chỉ chạm vào trong lá bài trong game thì mới thực hiện những hành động này thì bạn hãy sử dụng touchBegin và xem xét những node mà người sử dụng chạm vào trong game:

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
NSArray * nodes = [self nodesAtPoint:[touch locationInNode:self]];

for (SKNode * node in nodes) {
if ([node.name isEqual: @”gameCard”]){
[node runAction:[SKAction moveTo:CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame)) duration:.5f]];
}
}
}

Đối với một node duy nhất thì việc kiểm tra còn dễ dàng hơn nữa bằng cách gọi trực tiếp node được chạm trong chương trình:

SKNode * node = [self nodeAtPoint:[[touches anyObject] locationInNode:self]];
if ([node.name isEqualToString:@”gameCard”]){
[node runAction:[SKAction moveTo:CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame)) duration:.5f]];
}

Thế là bạn có thể check xem sự kiện chạm có cần phải xử lý những gì không?

Hướng dẫn cơ bản về Sprite Kit

Đây là hướng dẫn cơ bản giúp bạn có thể có cái nhìn đầu tiên về Sprite Kit.

 

* Điều kiện để bắt đầu:

– Bạn cần phải có:

+ Xcode 5: Xcode là công cụ phải có để bắt đầu làm việc. Đối với Sprite Kit, chúng ta cần phải có Xcode 5 để có được Sprite Kit và hỗ trợ IOS 7. Chuyện này khá là đơn giản nếu bạn sở hữu một máy Mac, Bạn chỉ việc lên AppStore dành cho Mac và download về phiên bản mới nhất vì Apple đã chính thức phát hành Xcode miễn phí vào ngày 20-09-2013.

+ IOS 7: Đây là phiên bản thấp nhất mà Sprite Kit được tích hợp nên bạn cần phải cập nhật IOS 7 cho các iDevices của bạn để bắt đầu làm việc với Sprite Kit.

 

* Các kiến thức cần phải có:

– Lập trình với Sprite kit bạn cần phải hiểu rõ được cấu trúc của nó:

+ Đối với Sprite Kit, chương trình sẽ được chia thành các cảnh (scene) để xử lý những tác vụ nằm trong cảnh đó. Mỗi cảnh lại chứa những đối tượng game (Sprite) được xử lý trong scene.

+ Mỗi đối tượng dù là gì đi nữa vẫn là một sprite để dễ quản lý:

 

– Sprite sử dụng cho những trường hợp sau:

+ Những đối tượng game (character, monster, items,…)

+ Chữ

+ Hình thể phức tạp

+ Video

 

* Bắt đầu:

 

– Đầu tiên dĩ nhiên phải tạo một project mới để làm việc. Với Xcode 5, mọi thứ được làm lại với phong cách phẳng (Flat Design) của Apple nhìn rất gọn nhẹ và đơn giản.

– Bạn sẽ có được một Project như sau:

Image

– Hãy tập trung vào những thứ sau để hiểu rõ chương trình:

+ LKViewController:

 

– (void)viewDidLoad

{

   [super viewDidLoad];

 

   // Setting dành cho view của chương trình

   SKView * skView = (SKView *)self.view;

   skView.showsFPS = YES;

   skView.showsNodeCount = YES;

   skView.multipleTouchEnabled = NO;

   // Tạo scene và set mode cho scene

   SKScene * scene = [LKMyScene  sceneWithSize:skView.bounds.size];

   scene.scaleMode = SKSceneScaleModeAspectFill;

   // Hiển thị scene trên view

   [skView presentScene:scene];

}

 

=> Một view của chương trình thường sẽ hoàn toàn trống như thế. Chúng ta cần phải tạo ra một cảnh game (Scene) để thêm vào các đối tượng và bắt đầu một game. Ở đây, chúng ta sẽ ép view của viewController thành một SKView để bắt đầu game.

=> showFPS và showNodeCount chỉ được hiển thị khi bạn đang làm việc với chương trình để xem các biểu hiện của chương trình. Khi phát hành chính thức bạn cần phải bỏ nó đi.

 

+ LKMyScene.m:

 

-(id)initWithSize:(CGSize)size {

   if (self = [super initWithSize:size]) {

       /* Thêm vào dòng chữ tiêu đề trong lúc khới tạo chương trình */

       self.backgroundColor = [SKColor colorWithRed:0.15 green:0.15 blue:0.3 alpha:1.0];

       SKLabelNode *myLabel = [SKLabelNode labelNodeWithFontNamed:@”Chalkduster”];

       myLabel.text = @”Lapkan Tutorial!”;

       myLabel.fontSize = 30;

       myLabel.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame));

       [self addChild:myLabel];

   }

   return self;

}

 

=> Khởi tạo Scene với dòng tiêu đề sẵn có.

 

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {

   for (UITouch *touch in touches) {

       CGPoint location = [touch locationInNode:self];

       int i = arc4random() % 6;

       SKSpriteNode *sprite = [SKSpriteNode spriteNodeWithImageNamed:  [NSString stringWithFormat: @”Ipod_stars_0%i.png”, i]];

       sprite.size = CGSizeMake(50, 50);

       sprite.name = @”star”;

       sprite.position = location;

       SKAction *action = [SKAction rotateByAngle:M_PI duration:1];

       [sprite runAction:[SKAction repeatActionForever:action]];

       [self addChild:sprite];

   }

}

 

=> Mỗi khi có một sự kiện chạm vào màn hình thì sẽ ngẫu nhiên sinh ra một ngôi sao có màu khác nhau.

 

Lệnh cập nhật dành cho scene (update):

 

-(void)update:(CFTimeInterval)currentTime {

   [self enumerateChildNodesWithName:@”star” usingBlock:^(SKNode *node, BOOL *stop)

    {

        node.position = CGPointMake(node.position.x – 5, node.position.y);

    }];

}

 

=> Chương trình sẽ tự động cho ngôi sao bay sang trái sau mỗi frame được tạo.

Image

* Kết luận:

– Vậy chúng ta có thể làm ra một chương trình mà khi chạm vào màn hình sẽ tạo ra một ngôi sao có màu sắc ngẫu nhiên và di chuyển về phía bên trái của màn hình.

– Ở những phần sau, tôi sẽ nâng cấp chương trình lên với khả năng tuỳ biến cao hơn.

Source Code: https://docs.google.com/file/d/0B38uO5_VDZL4bEt4Q1E3cE01bTg

Các code thông dụng dành cho IOS (Phần tiếp theo)

Sau đây là những đoạn code mà bạn sẽ sử dụng rất thường xuyên do đó chúng ta sẽ sử dụng code của C++ nhằm tăng hiệu quả cũng như sử dụng chúng dễ dàng hơn so với việc phải code những dòng lệnh dài bằng Objective-C.

+ Chuyển giá trị từ chuỗi thành các kiểu dữ liệu khác:

#define StrToInt(str) [str intValue]
#define StrToInteger(str) [str integerValue]
#define StrToFloat(str) [str floatValue]

+ Chuyển giá trị từ những thứ khác về chuỗi:

#define IntToStr(int) [NSString stringWithFormat:@”%d”, int]
#define Int32ToStr(int) [NSString stringWithFormat:@”%ld”, int]
#define Int64ToStr(int) [NSString stringWithFormat:@”%lld”, int]
#define FloatToStr(float) [NSString stringWithFormat:@”%f”, float]

+ Gắn màu cho những đối tượng:

#define RGB(r, g, b) [UIColor colorWithRed:r/255.0 green:g/255.0 blue:b/255.0 alpha:1]

#define RGBA(r, g, b, a) [UIColor colorWithRed:r/255.0 green:g/255.0 blue:b/255.0 alpha:a]

#define UIColorFromHex(hexValue) [UIColor colorWithRed:((float)((hexValue & 0xFF0000) >> 16))/255.0 green:((float)((hexValue & 0xFF00) >> 8))/255.0 blue:((float)(hexValue & 0xFF))/255.0 alpha:1.0]

#define UIColorFromHexAlpha(hexValue, a) [UIColor colorWithRed:((float)((hexValue & 0xFF0000) >> 16))/255.0 green:((float)((hexValue & 0xFF00) >> 8))/255.0 blue:((float)(hexValue & 0xFF))/255.0 alpha:a]

+ Kiểm tra loại máy sử dụng:

#define IS_IPHONE ([[[UIDevice currentDevice] model] isEqualToString:@”iPhone”])

#define IS_IPOD ([[[UIDevice currentDevice] model] isEqualToString:@”iPod touch”])

#define IS_IPAD (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)