30/09/2018, 16:19

Flappy Bird bằng Swift

Chào mọi người,

Mình viết game này khi làm quen với ngôn ngữ swift :D. Phải nói rằng flappy bird đã quá phổ biến và có thể coi việc clone game này là một thử thách thú vị khi bắt đầu với một ngôn ngữ lập trình mới. Nói cách khác, phương pháp tiếp cận này là vấp đến đâu thì học đến đấy :D.

Dưới đây là source code của game.

https://github.com/gg4acrossover/GGBird/tree/master/GGBird

Có 3 file chính trong game là GameViewController, GGScene và GGPipe. Đối tượng GGScene là quan trọng nhất, GameViewController chỉ có tác dụng chứa Scene. Tạo ra Scene như sau:

        var screen = self.view as SKView;
        self._scenePlay = GGScene(size: screen.bounds.size);
        screen.presentScene( self._scenePlay);

Scene sẽ chứa tất cả các đối tượng có trong game như ống nước, con chim. Nói qua một chút về cách đặt tên biến. Hầu hết những người mới bắt đầu học lập trình, sẽ chú trọng đến học câu lệnh nhiều hơn là cách trình bày. Tuy nhiên đây là một điều rất quan trọng nếu bạn muốn người khác không khó chịu khi đọc code của mình, hoặc là chính bạn cũng không hiểu gì sau một thời gian mới đọc lại. Tiếp theo đấy là comment đầy đủ. Điều này sẽ giúp code bạn trong sáng hơn. Hãy đặt tên rõ nghĩa và comment chi tiết :). Như trong source của mình, tên biến đều hầu hết có dấu “_” và biến let viết hoa toàn bộ.

Tiếp theo nói về chuyển động trong game. Mình làm cho con chim đứng yên (trên trục x) và background di chuyển. Ngày trước khi học vật lý phổ thông, chắc mọi người đều còn nhớ chuyển động là sự thay đổi vị trí với vật mốc. Giống như bạn ngồi trên xe thì cảm giác cái cột điện nó di chuyển vậy. Thế nên người chơi sẽ vẫn có cảm giác là con chim đang di chuyển vậy.

Nhưng con chim vẫn bay lên lượn xuống được nên ta cho nó di chuyển lên xuống theo trục y với vận tốc biến thiên, đi lên thì vận tốc giảm dần, đi xuống thì nhanh dần ( để làm chuyển động trông thật và mượt mà hơn).

var dy = self._bird.position.y + CGFloat(self._force) +
CGFloat(-9.8*self._startTime*self._startTime*0.5);
self._startTime! += 0.05;
/** bird move along axis Y **/
self._bird.position.y = dy;

Vấn đề tiếp theo là việc di chuyển background, bạn có thể xem trong link này, có hình minh họa rất dễ hiểu. Mình làm theo cách đó :D.

http://www.ibm.com/developerworks/vn/library/opensource/2013Q2/j-html5-game2/

Cuối cùng là check va chạm. Có nhiều cách để check va chạm trong game, cách đơn giản nhất mà cũng tốn hiệu năng nhất là kiểm tra bounding box. Bạn có thể xem chi tiết trong hàm isBirdCollisionWithPipe().
Có những cách khác tăng hiệu suất hơn như check va chạm giữa hình tròn với hình chữ nhật, hình chữ nhật với hình chữ nhật, v.v… Mọi người tự tìm hiểu thêm :). Giới thiệu với mọi người một blog khá hay có nói về vấn đề này. Mặc dù bây giờ không thấy bạn này viết nữa.

http://yinyangit.wordpress.com/category/game-dev/

Tất cả những yếu tố di chuyển và va chạm được đặt trong 1 game loop để tính toán là hàm update.

Còn một số vấn đề khác để hoàn chỉnh game này, tuy nhiên mình chỉ viết đến đây với mục đích là làm quen với swift thôi :D.

Nguyễn Minh Dũng viết 18:35 ngày 30/09/2018

Rất thú vị, Đạt nghe về Swift thấy rất máu. @crossover code bằng Swift thấy có gì đặc biệt không?

viết 18:25 ngày 30/09/2018

Có thể coi swift là một bản thu gọn của objective C. Swift đơn giản hơn, cú pháp nhìn trong sáng hơn so với người anh Objective C. Đặc biệt, người mới bắt đầu với IOS sẽ dễ dàng tiếp cận hơn. Đó là lý do mình học ngôn ngữ này.

Đinh Quốc Hân viết 18:24 ngày 30/09/2018

Đáng tiếc là có Mac mới coding đc

Nguyễn Minh Dũng viết 18:25 ngày 30/09/2018

@crossover Nghe xong muốn thử quá Mà bạn code cái này trên môi trường nào?

TTmagic viết 18:32 ngày 30/09/2018

nghe đồn phải có Mac mới chơi đc

viết 18:33 ngày 30/09/2018

@ltd mình code trên mac, nhưng có thể dùng hackintosh để tiếp xúc với swift.

Nguyễn Minh Dũng viết 18:22 ngày 30/09/2018

hackintosh cài trên máy ảo hay máy thật là tốt nhỉ, @crossover có kinh nghiệm vụ này không? Nếu là máy ảo thì Đạt sẽ cài rồi clone code của @crossover về chạy.

viết 18:31 ngày 30/09/2018

@ltd tốt nhất là cài trên máy thật, máy ảo không phải là biện pháp tối ưu. Tuy nhiên nếu mục đích chỉ là nghiên cứu học tập swift thì cài trên máy ảo là ok rồi.

Bài liên quan
0