11/08/2018, 22:47

MummyMaze game với Unity 2d (phần 2)

Hệ thống Enemies a. Tổng quan các loại enemy trong game Sẽ có 4 loại enemy trong game: loại 1: có thể di chuyển 2 ô trên ma trận bàn chơi đuổi theo người chơi, và ưu tiên di chuyển theo hàng ngang trước. Loại 2: có thể di chuyển 2 ô trên ma trận bàn chơi đuổi theo người chơi, ...

  1. Hệ thống Enemies

a. Tổng quan các loại enemy trong game

Sẽ có 4 loại enemy trong game:

  •   loại 1: có thể di chuyển 2 ô trên ma trận bàn chơi đuổi theo người chơi, và ưu tiên di chuyển theo hàng ngang trước.
    
  •   Loại 2: có thể di chuyển 2 ô trên ma trận bàn chơi đuổi theo người chơi, và ưu tiên di chuyển theo hàng dọc trước.
    
  •   loại 3: có thể di chuyển 1 ô trên ma trận bàn chơi đuổi theo người chơi, và ưu tiên di chuyển theo hàng ngang trước.
    
  •   Loại 4: có thể di chuyển 1 ô trên ma trận bàn chơi đuổi theo người chơi, và ưu tiên di chuyển theo hàng dọc trước.
    

Khi 1 enemy 3 hoặc 4 di chuyển vào ô có enemy loại 1 hoặc 2, thì enemy loại 3,4 sẽ bị phá huỷ.

Khi enemy 1,2 di chuyển vào ô có chứa đồng loại, 1 trong 2 con sẽ bị phá huỷ.

b. Animation cho Enemy

Chúng ta sẽ tạo hệ thống anim cho các enemy giống như tạo anim cho player. Enemy với các anim như sau: Idle, walking, movebackward, moveforward, attack ( khi enemy bắt được người chơi).

Ví dụ với Enemy1:

Screen-Shot-2014-10-26-at-9.16.13-AM-300x237.png

c. Enemy Ai

Trong class PlayerAction, chúng ta cần có 1 mảng gameObject enemies[], lưu các enemy có trong level hiện tại. Khi player thực hiện xong nước đi của mình, chúng ta sẽ gọi đến hàm letNemeyMove, cho phép tất cả enemies trong màn chơi hiện tại thực hiện nước đi của mình cùng 1 lúc. Và để làm được điều này, chúng ta cần có 1 Class EnemyAction, và hành động của từng enemy sẽ là 1 subclass của class này. Làm như vậy sẽ tạo điều kiện dễ dàng để gọi hành động của enemy.

Screen-Shot-2014-10-26-at-11.31.01-AM-300x169.png

Phần thực hiện action cho enemy khá đơn giản: tại mỗi nước đi của enemy ( ví dụ enemy1), chúng ta kiểm tra vị trí X của enemy có bằng với player không: nếu bằng thì di chuyển enemy tiến về phía player (nếu không bị chặn). Trường hợp không bằng: chúng ta tiến đến player theo chiều X nếu không bị chặn, còn nếu bị chặn thì ta sẽ kiểm tra chiều Y tiến đến player, nếu chiều không bị chặn, enemy sẽ đi, còn trường hợp ngược lại, tức là lúc này enemy bị khép góc, không thể di chuyển được, cũng là mục đích của người chơi. Với các enemy khác, chúng ta cũng làm tương tự.

Screen-Shot-2014-10-27-at-8.01.57-AM-300x117.png

Với enemy 1 và 2, đi 2 nước trong 1 turn, nên chúng ta cần 3 biến để điều khiển sự di chuyển của chúng: monster1MoveStep1Active, monster2MoveStep2Active và firstSteped. 3 biến có giá trị mặc định là false. Khi player di chuyển xong, monster1MoveStep1Active sẽ có giá trị true, và người enemy sẽ di chuyển nước đi đầu tiên. Khi thực hiện xong nước đi này, giá trị firstSteped sẽ có giá trị true, và monster2MoveStep2Active sẽ có giá trị true.

Screen-Shot-2014-10-27-at-8.03.12-AM1-300x141.png

Khi enemy được quyền di chuyển, sẽ gọi đến hàm EnemyMove của class EnemyAction, ứng với mỗi loại enemy để tìm ra ô tiếp theo enemy di chuyển đến, sau đó sẽ gọi đến hàm EnemyMoveNeight trong charactorMove để set các giá trị cho phép enemy di chuyển (ví dụ là monster1MoveStep1Active và monster2MoveStep2Active của enemy1). Tại hàm update của EnemyAtion, khi các biến này có giá trị true, chúng ta sẽ cho enemy di chuyển.

Chúng ta cần 1 hàm objectCollision(), trả về 1 enemy có vị trí trùng với ô hiện tại mà enemy đang đứng. Hàm này được gọi mỗi khi 1 enemy thực hiện xong 1 bước đi. Nếu enemy hiện tại là enemy3 hoặc 4, thì sẽ bị destroy chính nó. Còn nếu enemy hiện tại là enemy 1 hoặc 2, thì sẽ destroy enemy mà nó va chạm.

Screen-Shot-2014-10-27-at-8.04.11-AM-300x125.png

  1. Hệ thống Item trong game

Có 3 loại Item trong game: heart, trap và key. Để làm điều này, chúng ta sẽ cho mỗi stone 1 biến enum stoneType trong stoneState với các giá trị tương ứng là 3 item ( vì trong game, các item không bị trùng nhau nên ta có thể làm điều này).

Với trap và heart thì rất đơn giản, chúng ta sẽ chỉ nói về cách xử lí của item key. Với mỗi key sẽ có 1 fence, là 1 hàng rào. Mỗi khi người chơi từ bên ngoài di chuyển vào ô chứa chìa khoá, trạng thái của hàng rào sẽ bị thay đổi cũng như trạng thái của các stone chứa nó cũng sẽ bị thay đổi theo. Để thực hiện điều này, ta cần gắn cho object key 1 script Key với 2 biến kiểu game object chứa 2 stone mà fence gắn vào. Đồng thời tạo 1 hàm changeStoneState thay đổi trạng thái các stone và fence.

Screen-Shot-2014-10-27-at-8.04.40-AM-300x158.png

  1. Check Wingame, losegame và next level

Ở trang class GameManger, chúng ta sẽ khai báo 1 biến enum GameState với 3 trạng thái: Wingame, Losegame và Ongame. Với Ongame, người chơi sẽ có quyền điều khiển player, và các phím chức năng trong scene. Nếu losegame, click vào 1 vị trí bất kì trên màn hình, sẽ load ra scene hiện tại. Còn nếu wingame, click vào 1 vị trí bất kì trên màn hình, sẽ load ra level tiêp theo.

sau khi hoàn thành mỗi bước đi, các enemy sẽ kiểm tra xem ô hiện tại chúng đang đứng có trùng với ô mà player đang đứng không. Nếu có thì người chơi đã thua, gameState sẽ chuyển sang trạng thái losegame. Enemy thực hiện action attack, player sẽ có action die.

Chúng ta cần 1 hàm kiểm tra xem tất cả các nhân vật trong scene đã đứng yên, hàm này trả về 1 giá trị true hoặc false. Khi tất cả nhân vật đứng yên, lúc này chúng ta mới có thể kiểm tra ô player đang đứng có chứa heart? Nếu chứa heart thì chuyển trạng thái game về Wingame, player thực hiện anim celebrate.

Screen-Shot-2014-10-27-at-8.05.16-AM-300x217.png

Và mình đạt được là 1 game hoàn thiện:

https://play.google.com/store/apps/details?id=com.muinv54.PyramidMaze

0