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ị theLastOne là true 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.
3. 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é.
Đầ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é
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é