-->

  • Learning Construct 2 - Chương 3 - Phần 3



    Bài 3. Học về hệ ngẫu nhiên

    Tôi đã định nghĩa hệ ngẫu nhiên ở đầu chương này và bây giờ tôi sẽ thảo luận về nó. Chúng ta sẽ tạo những trở ngại một cách ngẫu nhiên trên mặt đất. Đầu tiên ta phải làm cho mặt đất di chuyển.

    1. Mặt đất cuộn trở lại


    Để di chuyển mặt đất, trước hết ta cần khiến nó di chuyển theo 1 hướng vào tất cả thời điểm; để làm điều này, chúng ta cần sử dụng một hành vi chuyển động. Chúng ta cần sử dụng một hành vi khác với hành vi 8 direction; để khiến 1 object di chuyển theo 1 hướng ta sẽ dùng hành vi Bullet. Thêm hành vi này vào object groundDirt giống như ta thêm hành vi 8 direction vào object bluePlane. Không vấn đề gì khi có 2 phiên bản của object groundDirt, nó sẽ được thêm vào tất cả phiên bản của object này.

    Bây giờ mặt đất sẽ tự di chuyển, chính vì vậy chúng ta sẽ khiến nó di chuyển về hướng mà chúng ta muốn. Đầu tiên chúng ta sẽ thiết lập thuộc tính Set angle từ thuộc tính của hành vi Bullet thành No bởi vì mặt đất không thay đổi góc khi di chuyển, nếu bạn test game bây giờ, mặt đất sẽ di chuyển sang bên phải, điều này là vì góc của sự chuyển động của hành vi Bullet theo góc của sprite. Chúng ta muốn giữ góc của mặt đất ở 0o nhưng thay đổi chuyển động của góc của hành vi Bullet sang trái thì nó là 180o. Vì vậy, đến event sheet và thêm code sau đây:




    Điều này sẽ khiến mặt đất di chuyển sang bên phải nhưng nó sẽ không cuộn trở lại. Để khiến nó cuộn trở lại chúng ta phải tạo ra một mặt đất mới khi mà mặt đất tạo ra cuối cùng đạt tới một vị trí nơi mà chúng ta cần tạo ra mặt đất mới. Để dễ hiểu hơn, hình dưới đây biểu thị vị trí mà tôi đang nói tới, nhìn vào mặt đất được lựa chọn, cái mà gần bên phải nhất đang chạm vào đường viền trò chơi.




    Kiểm tra các thuộc tính của groundDirt ở thanh Properties, vị trí X mà ta muốn có là 450, vì vậy chúng ta muốn tạo ra object mặt đất mới khi mà object cuối cùng dẫn đến vị trí này. Câu hỏi đặt ra là chúng ta biết đó là đối tượng mặt đất được tạo ra cuối cùng như thế nào? Câu trả lời đó là sử dụng biến thực thể. Tạo một biến thực thể tên là theLastOne với loại Boolean cho đối tượng mặt đất.

    Bây giờ, chúng ta có 2 đối tượng groundDirt trong layout. Thay đổi giá trị của biến thực thể theLastOne của đối tượng bên phải là true. Bây giờ, khi vị trí x của groundDirt object cùng với giá trị true của biến thực thể theLastOne là 450 hoặc nhỏ hơn, chúng ta sẽ tạo 1 object groundDirt mới. Sau đó chúng ta sẽ thay đổi giá trị của theLastOne thành false để nó không tạo object groundDirt khác. Dòng code như sau:


    Mã này sẽ tạo ra 1 mặt đất mới tại vị trí mà ta muốn, đó là (1220,448) (tọa độ này bạn nên chỉnh cho chính xác để không bị lệch). Đừng quên thiết lập góc của hành vi Bullet thành 180 nếu không đối tượng ground được tạo mới sẽ di chuyển sang phải thay vì sang trái. Bây giờ, tôi muốn giải thích một chút về cách C2 chọn mục tiêu cho những hành động của nó trong event sheet.

    2. Chọn đối tượng cho hành động


    Trong đoạn code trước, chúng ta đã thay đổi giá trị của biến thực thể của object groundDirt được gọi là thelastOne 2 lần; đầu tiên ta đặt nó là false, sau đó ta đặt lại là true. Điều này là bởi vì khi chúng ta thay đổi giá trị của theLastOne lần đầu, không có bất kì đối tượng groundDirt nào trong event này. Đối tượng groundDirt được dùng phù hợp với những điều kiện được viết trong event này (một thứ với giá trị theLastOnetrue và vị trí X =< 45).

    Sau đó, chúng ta đã viết một action để tạo đối tượng groundDirt tại vị trí mà chúng ta muốn..Như bạn thấy, ngoài việc chỉ thay đổi giá trị của biến thực thể, chúng ta cũng có thể thay đổi góc chuyển động của hành vi Bullet và hành vi Bullet được thay đổi từ một đối tượng groundDirt.


    Đây là thông tin cơ bản về việc chọn đối tượng trong C2. Có nhiều thứ hơn nhưng tôi sẽ giải thích dần khi ta cùng làm game. Tiếp theo, chúng ta sẽ tạo những chướng ngại vật ngẫu nhiên.




    WAITING FOR LUV
    Bạn có muốn cải thiện khả năng thiết kế đồ họa của mình? Chắc hẳn các bạn cũng biết, nếu các dòng code là linh hồn của một trò chơi, thì đồ họa chính là bộ mặt của trò chơi đó. Đồ họa đẹp, dễ nhìn sẽ khiến trò chơi của bạn tăng tỉ lệ hấp dẫn người xem đến 90%. Hiện tại có hai công cụ hỗ trợ thiết kế đồ họa game tiện nhất mà mình biết, đó là Photoshop và Illustrator. Mình sẽ cố gắng tìm kiếm và chia sẻ các đồ họa game miễn phí cho các bạn tại blog này; tuy nhiên, một trò chơi mà 100% do chính mình tạo ra vẫn hơn là đi cóp nhặt hình ảnh từ nơi khác đúng không nào. Tiện đây, mình có chia sẻ một khóa học thiết kế đồ họa Game 2D cho Mobile. Các bạn có thể tham khảo dưới đây để được giảm 40% học phí nhé.


    3. Tạo những chướng ngại vật ngẫu nhiên


    Đầu tiên, hãy tạo 1 rock object mới trong Obstacles layer; tôi sẽ sử dụng sprite viên đá từ asset flippy plane. Thêm hành vi Bullet vào nó, giống như bạn làm với chướng ngại vật mặt đất và thiết lập thuộc tính Set angle để nó không quay lại. Bây giờ, hãy đặt nó ngoài màn hình vì chúng ta không muốn nó xuất hiện ngay trên màn hình. Thay vào đó, ta muốn nó xuất hiện khi chúng ta tạo một ground object mới.

    Khi ta tạo một object ở một vị trí ngẫu nhiên, chúng ta cần nhớ tọa độ của vị trí đấy. Đầu tiên, tọa độ Y luôn luôn phải là 360 vì chúng ta không muốn một tảng đá cứ bay lơ lửng. Thứ hai, tọa độ X  phải bắt đầu từ bên trái của sprite ground object tới phần bên phải.

    Để tạo ra một giá trị ngẫu nhiên, C2 có một biểu tượng được cài sẵn được gọi là random (), có thể được sử dụng để tạo ra một giá trị hoàn toàn ngẫu nhiên hoặc một giá trị ngẫu nhiên giữa hai giá trị. Để tạo một khoảng giữa hai giá trị, ta cần nhập hai giá trị đó vào dấu ngoặc, và biểu tượng sẽ tự chọn giá trị ngẫu nhiên. Phần bên trái của object groundDirt khi được mã hóa sẽ được tính bởi groundDirt.X – groundDirt.Width / 2 và phần bên phải được tính bởi groundDirt.X + groundDirt.Width / 2 (groundDirt tương ứng với tên đối tượng mà bạn đặt, ở đây sprite3 của tôi tương ứng với groundDirt). Chúng ta sẽ thay đổi dòng mã mới nhất và viết như sau:


    VÌ vậy, chúng ta sẽ thêm 2 action mới: một là ngẫu nhiên tạo ra rock object và cái khác là di chuyển tọa độ Z (để rock xuất hiện bên dưới groundDirt) của rock object xuống dưới layer. Chúng tôi đã di chuyển đối tượng rock bởi nhìn nó tốt hơn theo cách đó.



    Nếu bạn test bây giờ, bạn sẽ thấy những tảng đá được tạo ngẫu nhiên, và bạn có thể tap vào màn hình để bay qua chúng. Tuy nhiên, bạn vẫn chưa va chạm với những tảng đá; chúng ta muốn những chướng ngại vật sẽ ngăn chặn sự di chuyển khi máy bay va chạm với chúng và khiến máy bay rơi xuống đất. Để khiến những chướng ngại vật dừng sự di chuyển, chúng ta sẽ vô hiệu hóa hành vi di chuyển.



    Điều này sẽ làm mọi thứ dừng lại, nhưng chúng ta cũng muốn làm cho máy bay rơi xuống. Máy bay không thể đập cánh khi người chơi chạm vào màn hình, bời vì họ đã thua. Chúng ta sẽ thêm hành vi Bullet tới bluePlane object, nhưng chúng ta sẽ cài đặt thuộc tính Initial State thành Disable để khiến thuộc tính này không hoạt động theo mặc định. Đừng quên thiết lập Set angle thành No, và ở hành vi này, hãy thiết lập thuộc tính tốc độ thành 200 để khiến nó chậm hơn. Để làm máy bay rơi xuống, chúng ta chỉ cần kích hoạt hành vi Bullet. Đừng quên thiết lập góc của sự di chuyển thành 60 để máy bay khi rơi xuống sẽ chúi xuống.




    Nếu bạn test thử game bây giờ, máy bay sẽ đi xuống sau khi đâm vào những trở ngại. Tiếp theo, chúng ta sẽ thêm bộ sưu tập để game của chúng ta thú vị hơn.


    Bài 4. Thêm bộ sưu tập (collectibles)

    Bộ sưu tập là những thứ như tiền xu hay những gì người chơi có thể thu thập trong game. Những bộ sưu tập này thường thêm nhưng gì đó như tiền hoặc điểm. Trong trò chơi của chúng ta, bộ sưu tập cũng được sắp xếp ngẫu nhiên. Đầu tiên, tạo một star game object mới với 1 sprite từ starGold trong tệp Tappy Plane và đặt nó vào Collectibles layer. Cho nó một hành vi Bullet và đặt nó bên ngoài màn hình.

    Chúng ta sẽ tạo các bộ sưu tập mới mỗi vài giây thay vì mỗi lần game tạo object mới, giống như rock object. Để tạo những bộ sưu tầm, viết những code sau đây:




    Chúng ta muốn cho thấy những bộ sưu tập này sẽ được gì. Chính vì vậy, hãy tạo một text object mới, đặt tên nó là scores và đặt nó ở HUD layer. Đặt nó ở phía trên bên trái màn hình, đây là nơi các đối tượng trong layer HUD thường được đặt nhưng nó có thể đặt nơi khác. Bây giờ, khi người chơi lấy được bộ sưu tập, chúng ta muốn nó biến mất và thêm điểm số. VÌ vậy, hãy tạo ra một biến toàn cầu (global variable) được gọi là score với type là number, trông như sau:



    Bây giờ thêm dòng code sau:


    Action trên sẽ thiết lập dòng chữ của scores object thành dòng chữ scores: được theo sau bởi giá trị của biến toàn cầu scores. Kí hiệu & có thể sử dụng để tham gia text với 1 biến cho văn bản động. Nếu bạn test game bây giờ, bạn sẽ thấy số sao được tạo ngẫu nhiên, và thu thập chúng sẽ làm tăng điểm số. Nó đã bắt đầu trông giống 1 trò chơi, có lẽ chỉ thiếu màn hình start menu. Nếu các ngôi sao di chuyển qá nhanh, bạn có thể thay đổi thuộc tính tốc độ của chúng ở hành vi Bullet. Hãy nhớ thay đổi tốc độ của groundDirt object và rock cùng một giá trị; nếu không, sự di chuyển của những ngôi sao sẽ bị lệch.


    Bài 5. Hoàn chỉnh code


    Wew, chúng ta đã hoàn thành trò chơi đầu tiên của mình, điều này thật là tuyệt. Tuy nhiên, còn một vài thứ vẫn chưa xong. Trong một trò chơi lặp lại ngẫu nhiên, bất kì object nào đã được tạo cần phải được hủy tại cùng 1 thời điểm. Nếu không, những object đó sẽ làm tốn bộ nhớ. Khi mà càng nhiều object được tạo, bộ nhớ sẽ càng nặng.

    Chính vì vậy, hãy hủy những object đó; đầu tiên, chúng ta hủy những tảng đá. Thêm một event mới. Chúng ta sẽ so sánh tọa độ X của tảng đá và nếu nó nhỏ hơn -100; nếu đúng, hãy thực hiện action này:




    Điều này sẽ tiêu hủy tảng đá, chúng ta sẽ làm tương tự như vậy với mặt đất, nhưng thay vì -100, chúng ta sẽ để tọa độ X là -400. Sau khi so sánh tọa độ X với tọa độ này, thêm action như sau:


    Tiếp theo là những ngôi sao, kích thước của nó nhỏ hơn nên ta sẽ hủy nó khi tọa độ X nhỏ hơn -20:


    Giờ thì chúng ta đã hủy xong những object đã đi qa ở bên trái màn hình. Các bạn có thể trải nghiệm lại trò chơi mà mình đã làm. Không quá khó phải không nào ^^.


    Tổng kết


    Trong chương này, chúng ta đã tạo được thiết kế của Flappy Bird và bạn đã làm được một game tương tự, tuy chưa hoàn chỉnh lắm. Bạn đã học được về sprite game object một cách chi tiết hơn, bạn cũng được học về 2 hành vi chuyển động và cách vận dụng chúng trong thanh Properties và trong code.

    Bạn đã học được về hệ ngẫu nhiên và cách sử dụng nó. Bạn học được về những hành vi chuyển động thứ mà chúng ta dùng để di chuyển những object và học cách sử dụng biến thực thể trong game.

    Còn một điều nữa, nếu bạn kiểm tra event sheet, bạn sẽ thấy chúng ta đã ngừng tất cả các object khác khi mà máy bay chạm vào tảng đá để khiến trò chơi như dừng lại. Tuy nhiên, chúng tôi không làm cho tảng đá và các đối tượng khác dừng lại khi bạn chạm vào mặt đất. Bạn có thể tự làm không? Hãy để cmt ở construct2vn.ga nhé.

    Nếu bạn muốn tham khảo thêm về các event và cách hoạt động của chúng thì hãy tham khảo thêm ở các tài liệu trên www.construct2vn.ga như Construct 2 manual và các tài liệu còn lại, chúc các bạn một ngày vui vẻ <3.


    Bản dịch do construct2vn.ga thực hiện
    Ai sao chép hay chia sẻ hãy ghi nguồn và đưa link www.construct2vn.ga vào đầu bài chia sẻ nhé


  • DONATE TINH THẦN CHO BLOG TẠI ĐÂY

    Nếu các bạn thấy blog có ích hãy ủng hộ blog hàng ngày tại đây. Chỉ cần thi thoảng chơi game và tìm bug cho tụi mình là được. Đây là ủng hộ tinh thần, không phải tiền mặt, vật chất và không bắt buộc. Xin chân thành cảm ơn ahihi. Chúc các bạn một ngày zui zẻ.

    TELEPHONE

    02273 7x2 xxx
    02273 xxx 27x

    MOBILE

    0162 x15 xx33