Bài 7. Thay đổi trạng thái của một đối tượng game
Khác với việc thêm thưởng vào game,
chúng ta có thể thêm hiệu ứng đặc biệt vào object của trò chơi. Ví dụ, ta sẽ
thay đổi trạng thái của tấm ván. Trong khi thay đổi trạng thái của tấm ván,
chúng ta sẽ xác định thời gian của trạng thái mới, và sau khi thời gian kết
thúc, tấm ván sẽ trở lại vị trí ban đầu. Bây giờ, ta sẽ làm cho tấm ván rộng
hơn.
Để làm điều này, chúng ta cần tạo một biến thực
thể dạng Text được gọi là state trên paddleBlue. Giá trị của biến thực thể này sẽ xác định trạng thái của
object paddleBlue. Bây giờ, chúng ta
cần một địa điểm để thay đổi nó, hãy thay đổi nó khi khối màu tím bị hủy, bởi
vì hiện tại không có gì xảy ra khi chúng ta hủy nó.
Để lựa chọn khối màu tím, ta sẽ nhìn vào biến thực thể blockColoer của nó; nếu nó ghi là purple, ta sẽ chọn khối mà ta muốn. Sau đó ta có thể thay đổi trạng thái của khối này. Điều nữa là tôi muốn đổi trạng thái paddleBlue thành giá trị mặc định của nó. Ta có thể làm điều này bởi kiểm tra của hiệu ứng và biến thực thể blockColor để tìm khối không phải màu tím và không có hiệu ứng. Vì vậy, chúng ta sẽ thêm sự kiện phụ vào code như dưới đây:
Chúng
ta đã thay đổi trạng thái của object paddleBlue,
bây giờ, để nó hoạt động thực sự, ta cần thêm 2 sự kiện nữa. Một là khi giá trị
biến thực thể của trạng thái rộng hơn và hai là khi nó trở thành một chuỗi rỗng.
Chúng ta muốn tấm ván rộng hơn khi trạng thái thay đổi và trở lại chiều rộng
ban đầu khi nó là một chuỗi rỗng. Chú ý rằng chiều rộng ban đầu của paddleBlue là 104 pixels và ta muốn nó
thành 184 khi rộng hơn. Sự kiện đầu tiên như sau:
Sự kiện thứ hai:
Thêm nhiều trạng thái
Bạn đã biết cách thay đổi trạng thái
của một đối tượng và đưa nó trở lại trạng thái ban đầu. Tuy nhiên, điều gì sẽ xảy
ra khi bạn thêm những khối thay đổi trạng thái? Tôi sẽ trả lời bằng thêm trạng
thái khác cho tấm ván. Đầu tiên, hãy thêm một hoạt ảnh gọi là Grey tới object của các khối; đưa hoạt ảnh
này một sprite hình chữ nhật màu xám.
Như đã làm trước đó, cho một số khối, thay đổi
giá trị biến thực thể blockColor
thành Grey. Chúng ta muốn thay đổi
góc của tấm ván sau khi người chơi phá hủy khối này, đầu tiên, chúng ta thêm sự
kiện phụ khác khi khối bị phá hủy:
Như trước đó, để làm trạng thái có hiệu ứng, chúng ta sẽ làm một sự kiện khác để kiểm tra trạng thái của paddleBlue. Sự kiện mới này sẽ thiết lập góc của tấm ván nếu giá trị của trạng thái là góc:
Đừng quên thay đổi góc trở lại 0o
khi trạng thái trở lại là rỗng:
Test thử game của bạn bây giờ, nếu bạn
phá hủy khối màu tím và sau đó là khối màu xám, bạn sẽ thấy tấm ván rộng hơn và
nghiêng một góc 45 độ. Đây là do hiệu ứng của các khối thay đổi trạng thái được
chấp nhận.
Như bạn có thể nhớ, chúng ta chỉ thay đổi chiều
rộng và góc của tấm ván về giá trị cũ khi biến thực thể của trạng thái là một
chuỗi rỗng. Lần này, biến thực thể trạng thái không có sự thay đổi để trở thành rỗng
trước khi trạng thái thay đổi, do đó áp dụng 2 thay đổi trạng thái cùng 1 lúc.
Khi bạn làm game của bạn, hãy luôn cố gắng tìm
ra những khía cạnh nhỏ như này, ko phải C2 lúc nào cũng cho bạn biết bạn muốn
gì, đây là điều bình thường khi bạn làm game, ko vấn đề gì với công cụ bạn sử dụng.
nó thường xảy ra khi bạn thay đổi giá trị của biến.
Để sửa điều này, ta cần phải tắt các hiệu ứng thay đổi khác khi ta chuyển sang trạng thái mới. Ta sẽ thiết lập góc thành 0 khi chúng ta làm tấm ván rộng ra và đưa chiều rộng trở lại khi chúng ta nghiêng góc. Chính vì vậy ta có 2 hành động mới cho 2 sự kiện khác nhau:
Bài 8. Kết thúc trò chơi
Sau đó, chúng ta sẽ diễn tả những giá
trị này trên màn hình như ta đã làm ở game thứ nhất. Vì vậy, ta sẽ tạo hai
object Text mới và đặt ở HUD layer, đặt tên chúng là txtTime và txtLife, và khiến giá trị của chúng hiển thị ở biến thực thể gameTime và life như sau:
Để
hiển thị người chơi đã thua, ta sẽ hiển thị văn bản Game OVER khi điều kiện thua xảy ra. Chính vì vậy, tạo một Text object khác, thêm nó vào HUD layer, ghi GAME OVER vào nó, và
thay đổi font của nó cho lớn hơn.
Để
thay đổi size của Text, bạn phải thay đổi thuộc tính Font trên text object.
Khi bạn kích vào thuộc tính Font, bạn
sẽ thấy một hộp nhỏ có 3 dấu chấm trên nó; kích vào phần này để mở cửa sổ nơi bạn
có thể thay đổi font:
Trong cử sổ này, bạn có thể thay đổi font chữ, phong cách chữ và kích thước chữ. Thiết lập kích thước lên 36 và đặt ở giữa màn hình. Ta cũng sẽ thay đổi màu của phông chữ; để làm điều này, kích vào thuộc tính Color của phông chữ, bạn sẽ thấy một hộp nhỏ ở phía tay phải. kích vào nó, một hộp với nhiều màu sắc hiện ra để lựa chọn. Bây giờ, cho chữ GAME OVER thành màu đỏ. Di chuyển phông chữ txtGameOver ra khỏi màn hình, bởi vì ta chỉ cần nó khi người chơi thua.
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é.
Điều
kiện thua đầu tiên mà ta muốn làm đó là thua vì hết giờ. Logic rất đơn giản: nếu
biến toàn cầu gameTime dưới 1, nghĩa
là giá trị 0 hoặc âm, thì ta sẽ hiện phông chữ GAME OVER ở giữa màn hình trò
chơi. Ta phải dừng chuyển động của quả bóng, bởi vì ta không muốn nó di chuyển
và đập lung tung khi đã tuyên bố người chơi thua. Nếu ta viết dòng code này, nó
sẽ như sau:
Bây giờ chỉ thiếu một điều là ta vẫn chưa giảm thời gian của game; thật tuyệt khi C2 có một sự kiện có thể làm vài thứ mỗi giây (hoặc vài giây tùy thuộc vào những gì bạn muốn).
2. Thua vì hết mạng
Bây giờ, ta sẽ làm cho người chơi thua vì hết mạng. Ban đầu, người chơi sẽ có 3 mạng, mỗi lần quả bóng rới xuống dưới màn hình, người chơi sẽ mất đi 1 mạng, và nếu mạng tiến tới 0, chúng ta có thể nói rằng người chơi đã thua. Câu hỏi là làm thế nào để tiếp tục sau khi quả bóng rơi xuống màn hình. Câu trả lời là a sẽ tạo ra quả bóng mới:
Vì vây, logic rất đơn giản; nếu quả bóng rơi xuống màn hình, ta sẽ giảm mạng của người chơi đi 1; nếu nó trên giá trị 0, ta sẽ tạo quả bóng mới cho người chơi, và nếu nó đạt giá trị 0, người chơi thua. Code như sau:
Nếu bạn test thử game bây giờ, bạn sẽ thấy nó hoạt động rất tốt. Tuy nhiên, ta vẫn còn thiếu 1 thứ: đó là điểm số. Chính vì vậy hãy tạo nó nào.
3. Tính điểm
Tính điểm cực kì dễ vì ta có biến thực thể trong object của các khối, ta có thể sử dụng nó để tăng điểm số khi nó bị phá hủy. Vì vậy, về cơ bản ta chỉ cần thêm giá trị điểm mỗi lần khối bị phá hủy.
Ở đây, ta sẽ tạo khối mới, một sự kiện On destroyed, bên cạnh khối mà ta vừa tạo. Không sao cả khi làm những sự kiện khác nhau, nó có thể làm giảm số lượng action trong 1 sự kiện để code có thể dễ đọc và hiểu hơn.
Bạn có thể tạo hai hoặc nhiều sự kiện từ cùng một sự kiện. Sử dụng điều này với các nhóm hoạt động và sự kiện phụ để code dễ học và hiểu hơn.
Sau khi chúng ta tạo code, là lúc hiển thị điểm số. Ta sẽ hiển thị nó vào lúc level kết thúc, kể cả khi người chơi thắng hay thua. Ta sẽ tạo Text object mới được gọi là txtScore trên HUD layer và bỏ nó ra khỏi màn hình. Đầu tiên, hiển thị object này khi người chơi thua. Tạo một txtScore object mới khi gameTime dưới 1 hoặc khi mạng sống của người chơi = 0. Ta sẽ thêm hành động vào 2 sự kiện:
Sau khi tạo phông chữ điểm số, chúng ta sẽ hiển thị giá trị ban đầu của nó. Giá trị ban đầu ko phải giá trị mà ta thiết lập ở thanh Properties của nó, nhưng sẽ dựa trên biến toàn cầu điểm số. Do đó ta sẽ tạo giá trị ban đầu của nó ở một địa điểm khác khi nó được tạo. C2 có một sự kiện là On created được tạo khi object đầu tiên được tạo, ta sẽ thiết lập giá trị ban đầu ở đó:
Test thử game bây giờ, bạn sẽ thấy một hộp phông chữ GAME OVER xuất hiện khi mạng của người chơi bằng 0. Tiếp theo, ta sẽ hiển thị điểm số cho người chơi thắng.
4. So sánh một biểu thức
Người chơi thắng game này khi tất cả các khối bị phá hủy. Để biết khi nào khối bị phá hủy hoặc không, chúng ta sẽ đếm số phiên bản của khối. Nếu nó là 0, chúng ta sẽ biết tất cả các khối đã bị phá hủy. C2 có một biểu thức để đếm số lượng phiên bản của 1 object; để đối chiếu 1 biểu thức thay cho 1 biến, ta sẽ sử dụng sự kiện compare two values của hệ thống, và tạo ra một điều kiện “System blocks.count = 0” .
Ngoài ra, ta cũng muốn tính các khối khi trò chơi đang diễn ra, không phải sau khi trò chơi đã kết thúc. Vì vậy, ta sẽ thêm một một điều kiện khác đóng vai trò như một người đánh dấu khi game kết thúc. Chúng tôi muốn ngăn chặn chuyển động của quả bóng sau khi người chơi thắng, hãy sử dụng như một điểm đánh dấu và thiết lập tốc độ của quả bóng thành 0. Ta sẽ dừng chuyển động của quả bóng khi người chơi thắng, với những hành động và điều kiện kết hợp với nhau, code của ta sẽ như sau:
Chơi trò chơi cho đến khi bạn thắng, và bạn có thể thấy điểm số được hiển thị như ta muốn. Quả bóng đã ngừng chuyển động, vì vậy không cần phải lo lắng về việc nó rơi xuống dưới màn hình game khi ta thắng.
5. Kiểm soát lỗi
Vâng, chúng ta đã có được một trò chơi nhỏ vô cùng hoàn hảo. Tuy nhiên, giống như bao trò chơi khác, trò chơi này cũng có thể có lỗi. Hiện tại có hai lỗi ở đây: bộ đếm thời gian không dừng lại khi game kết thúc và thời gian có thể đếm xuống âm. Ta có thể sửa lỗi đầu tiên bằng cách chắc chắn rằng ta đã chỉ trừ đi biến gameTime trong khi trò chơi vẫn tiếp tục, nói cách khác là khi mạng sống và số lượng các khối trên 0.
Lỗi thứ hai có thể sửa một cách đơn giản bởi thay đổi giá trị phông chữ khi gameTime nhỏ hơn 1. Kết quả dòng code như sau:
Tổng kết
Trong chương này, bạn đã được học về đối tượng mới, Tiled background và cách sử dụng nó. Bạn cũng được học về hành vi mới, Solid và cách sử dụng nó để bật khỏi các đối tượng khác. Bạn cũng được học về biểu thức, cách sử dụng chúng và cách so sánh chúng với các biến thực thể khác. Bạn cũng học về các biến không đổi (constant variable) và cách thay đổi trạng thái của một đối tượng. Hơn nữa, bạn cũng được tiếp xúc với sự kiện phụ (sub-event).
Trong chương tới, tôi sẽ giới thiệu cho bạn đối tượng vật lí (Physics object) và một vài thứ bạn có thể làm với nó.
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é
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é