Monthly Archives: November 2013

Thể hiện dữ liệu dưới dạng UICollectionView

*  IOS 6 có rất nhiều cải tiến trong đó hệ thống liệt kê theo danh mục đã có bước chuyển biến mới khi có thêm công cụ giúp cho các lập trình viên có thể nhanh chóng tạo một danh sách cho phép người dùng lựa chọn.

– UICollectionView không những nhanh chóng, tiện lợi lại còn mang rất nhiều chức năng mới cho phép việc lập trình ứng dụng trở nên đơn giản và nhanh chóng hơn rất nhiều lần.

* Khái niệm chung:

– UICollectionView có cách sử dụng khá là giống với UITableView. Tuy nhiên UITableView quản lý và hiển thị dữ liệu trên một cột (1 column, dĩ nhiên là bạn có thể làm được nhiều thứ với 1 column này nhưng thực sự nó rất khó khăn). Với UICollectionVIews bạn có thể tùy biến nó một cách cực kỳ linh động. Tất cả đều phụ thuộc vào bạn, bạn làm nó hình vuông hay hình tròn hay mọi dạng mà bạn có thể nghĩ ra được. Mặc định, SDK IOS cung cấp cho bạn một UICollectionViewFlowLayout để bạn có thể tổ chức quản lý những đối tượng của bạn và một đầu đề, một kết ở cuối mỗi khu vực để bạn có thể thêm vào các ghi chú và tách từng khối với nhau

* Có 3 cách để sử dụng một UICollectionView thể hiện thông tin bạn cần:

+ Dùng Code để sinh ra toàn bộ UICollectionView thì sẽ không đụng tới các Tool của Xcode. Cách này không được trực quan cho lắm tuy nhiên nếu dùng một cách máy móc thì sau này bạn không cần thêm một dòng code nào để thể hiện nó mà chỉ cần truyển database tới mà thôi.

+ Dùng UIColllectionViewController để thể hiện thì bạn sẽ được tạo sẵn hầu như mọi thứ dành cho việc thể hiện dữ liệu. Bạn chỉ cần vài dòng code để đưa database vào mà thôi.

+ Dùng UICollectionView thêm vào trong một ViewController để thể hiện thông tin. Cách này là một nữa của những cách trên.

 

+ Làm việc với UICollectionView bạn sẽ tạo ra được những cách chọn rất tuyệt dành cho game/ ứng dụng của bạn đấy. Cụ thể từng loại thì những bài sau vậy 😀 (Hôm nay viết quá trời roài).

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 😀 )

Ưu điểm trong cách sử dụng hàm mới của Objective C

Ngay từ lúc mới chuyển sang sử dụng Xcode và Objective C, điều luôn khiến các lập trình viên bực mình là việc phải từ bỏ một thói quen khi sử dụng “dot”(.) để gọi các hàm trong ngôn ngữ khác như C++ hay .Net. Lúc đó cũng là lúc mình luôn thắc mắc là tại sao Objective không có một lựa chọn gọi hàm theo cách “bình thường” của các ngôn ngữ khác như vậy.

Nguyên nhân nằm ở cơ chế của chính loại ngôn ngữ này.

* Gọi hàm từ bộ nhớ – lkObj.doThis(): (Method Calling)

– Đây là cách gọi hàm “bình thường” của các ngôn ngữ từ trước đến nay. Cơ chế của nó chính là việc thực thi một phương thức hay một hàm bằng cách nhảy đến đia chỉ bộ nhớ và thực hiện một số chỉ định đã được định nghĩa trước (trong lúc dịch thuât – complite)

+ Ưu điểm: Việc thực thi diễn ra rất nhanh do các chỉ định đã được định nghĩa trước.

+ Nhược điểm: Mất đi tính cơ động do các hàm được tạo vào lúc run-time và được cố định vào bộ nhớ không thể thay đổi được. Cho dù bạn có sử dụng dynamic programming thì lúc run-time, hàm cũng phải được tạo ra trước sau đó mới có thể thực thi. Do đó chương trình luôn bị bó buộc vào việc chuẩn bị đầy đủ nguyên liệu trước khi sử dụng.

 

 

* Gửi thông tin thực thi – [lkObj doThis]: (Message Sending)

– Objective C sử dụng một cơ chế hoàn toàn khác. Tất cả các hàm/ phương thức được lưu trữ trong một danh sách được gọi là Runtime Lookup Table) và được quản lý bởi Objective C Runtime. Mỗi đơn vị lưu trữ được định nghĩa với 2 thành phần: Tên của hàm và địa chỉ của hàm trên bộ nhớ.

– Hiểu một cách đơn giản thì khi một hàm được gọi theo cơ chế Message Sending, địa chỉ vùng nhớ của hàm sẽ được dò tìm trên Runtime Lookup Table, dựa vào tên hàm và tham số của nó, sau đó các chỉ thị bên trong hàm mới được gọi thực hiện.

– Do phải dò tìm memory location của hàm trước khi thực hiện, nên việc thực hiện sẽ chậm hơn so với cơ chế Method Calling, nhưng ngược lại, tính linh động cao, vì với một tên hàm & tham số, địa chỉ bộ nhớ của hàm có thể thay đổi bất kỳ lúc nào trên Runtime Lookup Table, điều này mở ra khả năng thay đổi chỉ định đã được định nghĩa sẵn trước đó của hàm là hoàn toàn có thể  với ngôn ngữ Objective-C.

+ Ưu điểm:

Enable something Impossible

Cơ chế này cho phép bạn làm những điều không thể làm trên các ngôn ngữ khác:

– Có thể gọi thực thi một phương thức khi đối tượng gọi thực hiện đang trỏ đến null: [null doThis]

– Gọi thực hiện bất kỳ phương thức nào của một đối tượng (ngay cả những phương thức hiện tại chưa được định nghĩa)

– Khi một phương thức của một đối tượng được gọi, nó có thể chấp nhận thực hiện hoặc từ chối và uỷ nhiệm cho các đối tượng khác thực hiện phương thức đó.

 

Làm hình nền cho UIView

Đây là một tong những cách khá là hay để có thể đưa một hình ảnh vào làm hình nền của một view.

UIGraphicsBeginImageContext(self.view.frame.size);

[[UIImage imageNamed:@"lkimage.png"] drawInRect:self.view.bounds];

UIImage *lkimage = UIGraphicsGetImageFromCurrentImageContext();

UIGraphicsEndImageContext();

self.view.backgroundColor = [UIColor colorWithPatternImage:lkimage];

* Chúng ta vẽ hình này lại bằng với kích thước của view. Sau đó mới dùng colorWithPAtternImage để add vào trong view như vậy hình luôn luôn vừa với view này.

* Đây là cách sử dụng Core Graphic để tạo ra một hình khác có kích thước bằng đúng với kích thước màn hình sau đó dùng nó để add vào pattern của chương trình. Như vậy bạn đã hoàn toàn đưa tấm hình vào background của ứng dụng mà không cần dùng các công cụ khó khăn nào khác.

* Ứng dụng chương trình không chỉ bạn có thể thêm background vào mà còn có thể sao lưu và điều chỉnh hình ảnh theo ý muốn nếu biết cách sử dụng Core Graphic sao cho hợp lý.

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 ^.^

Lập trình hướng đối tượng với Sprite Kit

Rất nhiều người khi mới bước vào lập trình IOS hay các ngôn ngữ khác đang nghĩ mình theo lập trình hướng đối tượng.

Tuy nhiên để hiểu được hướng đối tượng dùng để làm gì thì bạn chỉ có thể làm được nó sau ít nhất là 1-2 năm kinh nghiệm làm việc và nghiên cứu. Lập trình hướng đối tượng không phải là chia chương trình ra các đối tượng để dễ dàng quản lý không thôi mà nó có thể làm được những việc mà lập trình tuyến tính không thể làm được thì lúc đó mới có nghĩa là bạn đã hiều và thâm nhập vào lập trình hướng đối tượng.

* Những cấp độ của lập trình hướng đối tượng:

+ Viết được các lớp (Class) để sử dụng trong chương trình

+ Sử dụng được các Pattern để tái sử dụng và phát huy được khả năng của lập trình hướng đối tượng

+ Sử dụng được lập trình dynamic trong chương trình

+ Tạo ra các thư viện (Static Library) để tái sử dụng những lệnh và lớp đã viết trước đó

+ Tạo thành các bot có khả năng tự xử lý những tập lệnh đơn giản làm cho việc lập trình trở nên tự động hơn nhiều lần.

Chỉ khi nào phát huy được những thứ này thì bạn mới có thể gọi là lập trình hướng đối tượng. Những bài sau LapKan Corp sẽ đi sâu vào phát triển từng chủ đề để bạn có thể hiểu được những khái niệm trên.

Vì sao không nên chọn Window Phone làm nơi phát triển?

Microsoft là một trong những công ty công nghệ có bề dày lớn trong lịch sử của ngành công nghệ thông tin. Nó đã phát triển ngay từ những ngày đầu khi ngành công nghệ thông tin thực sự đi vào đời sống của người dân chứ không còn là những máy móc lạ lẫm trong phòng tí nghiệm.

Chính điều này lại đang là thứ cản trở sự thành công của Microsoft. Do là một trong những công ty hiếm hoi trong thời đại công nghệ thông tin thời gian đầu, Microsoft tạo thành những chuẩn mực mà người khác xem và đánh giá. Chưa từng có ai bán phần mềm trước đó, Microsoft ra và bán hệ điều hành DOS và sau đó là Window với giá cắt cổ nhưng vì không có sự so sánh nào khác nên việc mắc rẻ người dùng không thể nào phán đoán được. Và khi Microsoft thành công, giá đó tạo thành giá chuẩn trong thời đại công nghệ thông tin. Những gì bán rẻ hơn Microsoft thì mặc nhiên được coi là giá rẻ và tương tự với các sản phẩm mắc hơn. Điều đó khiến cho Microsoft nghĩ rằng mình là người khống chế thị trường. Và họ đã làm như thế thật. Những bản cập nhật với chức năng kém cỏi vẫn được bán với giá cao ngất ngưỡng.

Apple sau khi Steve Jobs quay lại đã trở thành người đi đầu trong việc phát triển di động. Microsoft với sự tự kiêu quá đỗi nhận xét rằng chưa tới lúc và cũng không cần vội vàng do đang thống lĩnh thị trường. Họ vẫn ngồi yên nhìn Apple với cặp mắt khinh thường một công ty từ thành công đến sắp phá sản. Tuy nhiên họ đã lầm, Steve Jobs đã chứng minh tầm nhìn của mình là đúng và Microsoft đã sai lầm khi không chú ý đến mảng di động.

Sau những thành công vang dội của Iphone và Ipad, Microsoft nhận ra rằng mình đang bị tuột lại phía sau. Lúc đó họ mới cuống cuồng lập ra kế hoạch với Window RT và Window 8 tấn công vào thị trường di động. Tuy nhiên với sự tự kiêu vốn có họ vẫn tưởng rằng mình đang đứng đầu thị trường khi tung ra Window RT giá rẻ nhưng thiếu tính năng và Window 8 Pro với giá cắt cổ vượt qua cả Apple nổi tiếng với sản phẩm cao cấp. Chính điều này làm cho họ không thể đi sâu chút nào vào thị trường di động vốn đang khá nhiều kẻ mạnh.

Tuy nhiên sai lầm sâu xa của Microsoft không phải ở những điều trên, họ sai lầm từ phần gốc rễ chứ không phải là phần ngọn. Ứng dụng và game không phải được tạo ra một cách tự nhiên hay từ chính công ty phát triển như Apple, Microsoft, người làm nó đa dạng chỉ có thể là các lập trình viên bên ngoài. Apple đưa ra một sản phẩm cực tốt để làm gốc. Ngay sau đó đưa ra công cụ để thu hút lập trình viên hoàn toàn miễn phí. Những người thử và xem xét xem có nên tham gia vào thị trường này hay không rất nhiều. Microsoft thì không hề như vậy. Những công cụ để giúp lập trình viên tạo ra phần mềm được bán với giá cắt cổ. Chính nó giúp cho việc hiu quạnh của cái Window Phone càng trở nên nghiêm trọng hơn.

Những người ngoài nhìn vào Apple và nói rằng máy Mac giá cao thật là những người thiểm cận. Cái chính của Apple là chỉ lấy tiền từ người dùng và cho người dùng sự lựa chọn, còn đối với lập trình viên thì họ trả tiền. Còn với Microsoft, họ lấy tiền từ cả 2 và làm người trung gian để lấy thêm tiền nữa. Thế bạn muốn làm việc cho ai, lũ cướp của lập trình viên như Microsoft hay người đưa tiền cho lập trình viên như Apple