Cách tạo hoạt ảnh cho SPRITE (Animation)
Đáp ứng yêu cầu của một số bạn, các bạn muốn đối tượng nhân vật của mình có hoạt ảnh nhằm giúp trải nghiệm trong trò chơi được tuyệt vời hơn, sau đây là cách thực hiện
- Thông thường, SPRITE của các bạn chỉ có 1 Frame duy nhất, vì vậy nhân vật của bạn sẽ không có hoạt ảnh
- Hãy thêm vào nhiều Frame khác nhau, mỗi Frame các bạn chỉnh sửa lại hình ảnh một tí để tạo hiệu ứng chuyển động cho nhân vật
- Các bạn có thể import tệp .gif nếu không muốn tốn thời gian ngồi tạo từng Frame
Tạo thêm nhiều Frame, sau đó chỉnh tốc độ chạy animation tại vùng khoanh đỏ
Thành quả, mình đã thay thế nhân vật từ quả bóng thành hoạt ảnh tàu vũ trụ
Tạo thanh máu cho các chướng ngại vật (oWall)
Nếu chỉ "Né chướng ngại vật" đơn thuần thì trò chơi khá chán, thế nên mình đã thêm quyết định hướng dẫn tới cùng cho các bạn nhiều tính năng phức tạp hơn, trong đó có "Bắn chướng ngại vật". Đầu tiên thì chướng ngại vật phải có lượng hp nhất định để có thể bắn phá được, vì vậy mình sẽ hướng dẫn các bạn tạo thanh máu hiển thị trên đầu mỗi chướng ngại vật (luôn luôn di chuyển theo chướng ngại vật)
- 1. Tạo một Create Event cho object oWall(chướng ngại vật)
Khởi tạo lượng máu mặc định là 100
- 2. Tạo một Draw Event cho object oWall, sau đó thêm vào event 2 hàm dựng sẵn: Draw Seft và Draw Healthbar
Draw Seft vẽ lại chướng ngại vật, trong khi Draw Healthbar vẽ thanh máu, để tìm kiếm các bạn hãy nhập keyword vào toolbox bên phải
Sau khi thực hiện
Tạo object viên đạn (oBullet)
Tiếp theo chúng ta sẽ tạo một object mới: oBullet, ý tưởng là nếu nó Collision(va chạm) bất kỳ chướng ngại vật nào, thì chướng ngại vật đó sẽ bị mất máu
- 1. Chèn SPRITE thích hợp cho viên đạn: xem lại phần 1
- 2. Tạo object oBullet và tạo một Collision Event giữa oBullet và oWall: Lưu ý rằng những dòng code nằm bên trong hàm
with(other){}
sẽ được thực thi cho đối tượng oWall bị Collision(va chạm), không phải thực thi cho đối tượng oBullet.
with (other){
hp-=15;
if (hp<=0){
effect_create_above
(ef_explosion, x+sprite_width/2, y+sprite_height/2, 2, c_orange);
instance_destroy();
oCircle.myscore += round(sprite_width);
}
}
effect_create_above(ef_firework, x, y, 2, c_red);
instance_destroy();
- 3. Sau khi có đối tượng viên đạn, việc còn lại các bạn chỉ cần gọi đối tượng này ở Step Event của object oCircle (máy bay):
with (instance_create_layer(x-10,y,"Instances",oBullet)){
direction=point_direction(0,0,0,-1);
speed=15 ;
}
with (instance_create_layer(x+10,y,"Instances",oBullet)){
direction=point_direction(0,0,0,-1);
speed=15 ;
}
Thành quả
SHADER là gì, tạo SHADER (Ấn ALT+A)
Shader là một dạng hỗ trợ của Draw Event, nhưng nó là một công cụ cực kỳ mạnh mẽ để thao tác những gì và cách mọi thứ được hiển thị trên màn hình bằng card đồ họa, có nghĩa là các event được xử lý cực nhanh. Trong game hiện tại mình chỉ sử dụng một ít hiệu ứng, nhưng nếu sau này các bạn phát triển những game nặng hơn, hiệu ứng đẹp hơn và phức tạp hơn, thì các bạn nên dùng Shader để giúp cho những Event được xử lý mượt mà nhằm mang đến trải nghiệm tốt nhất từ phía người chơi. Ngoài ra, Shader là một công cụ không chỉ có ở mỗi Game Maker Studio mà còn có trong hầu hết các nền tảng, các bạn có thể tham khảo tại đây
- 1. Sau khi tạo Shader (Ấn ALT+A), các bạn chuyển qua tab .fsh
- 2. Thêm vào hàm main() lệnh sau: lệnh bên dưới có chức năng tạo hiệu ứng FLASH cho đối tượng. Vì câu lệnh khá phức tạp nên mình sẽ không giải thích, các bạn có thể tham khảo tại đây
gl_FragColor = v_vColour * texture2D( gm_BaseTexture, v_vTexcoord );
gl_FragColor = vec4(1.0,1.0,1.0,gl_FragColor.a);
- 3. Cách gọi Shader cho đối tượng oWall
Thử nghiệm: Bắn các vật thể
Ở project này, mình sử dụng Shader chớp sáng khi viên đạn va chạm với chướng ngại vật (nhằm giảm độ lag của game tại có rất nhiều chướng ngại vật), để làm được như hình bên dưới, các bạn chỉ cần thay đổi flashtime
thành một số >=0
khi có Collision xảy ra giữa oBullet và oWall, hãy tự thực hiện xem sao nhé
Các bạn có thể thấy có rất nhiều hiệu ứng như: chớp sáng, tạo tia lửa, tạo vụ nổ,...
Tổng kết
Sau 4 phần, mình xin được phép tổng kết một số kiến thức mang tính tổng quát cho việc phát triển game như sau (không nói riêng cho Game Maker Studio 2):
- Phần 1: tìm hiểu về Android Studio, NDK, SDK, JDK, Sprite, Object
- Phần 2: tìm hiểu về Event, các API và kiến trúc để có thể tạo game cho Android
- Phần 3: tìm hiểu thêm về tính năng của Game và hình dung cách để phát triển các phiên bản sau của Game
- Phần 4: tìm hiểu chuyên sâu về Collision, công cụ Shader là gì và tại sao nó được dùng trong đa số trò chơi hiện nay
Lời cuối cùng, cảm ơn các bạn đã ủng hộ mình trong suốt Series làm game Android đầu tiên với Game Maker Studio 2, bài viết của mình xin phép được kết thúc tại đây. Hi vọng sau 4 phần, các bạn đã biết được thêm nhiều kiến thức thú vị và nâng cao khả năng tư duy cũng như chiến lược phát triển phần mềm, sản phẩm của mình dành cho những bạn yêu thích lập trình game. Hãy ủng hộ mình bằng cách chia sẻ và đánh giá bài viết để mình có động lực làm một Series mới về game 3D nhé, một lần nữa cảm ơn các bạn đã xem bài viết này, chúc các bạn thành công.
Game đã hoàn chỉnh: Android PC
Tài nguyên sử dụng trong game: Full
Project (GMS2_ProjectFile): Full