Event
Bài trước chúng ta đã dừng lại ở mức độ tạo đối tượng, bây giờ chúng ta sẽ tiến tới bước quản lý sự kiện cho đối tượng, để quản lý sự kiện thì mình sẽ dùng chức năng Execute Code
và lập trình những gì chúng ta mong đợi object sẽ thực hiện vào đó
Tất cả các event được tìm thấy tại đây, tuy nhiên mình sẽ hướng dẫn các bạn 4 event quan trọng nhất bên dưới
Step Event: con người tính thời gian bằng giây, bằng phút, GMS2 tính thời gian bằng "Step", 1 giây có thể có 10,100 hay 1000
step tùy theo cách các bạn cài đặt. Nếu các bạn muốn trong 1 giây một câu lệnh kiểm tra nào đó được liên tục thực thi thì Step Event là một lựa chọn cho các bạn. Ví dụ bên dưới là một đoạn Execute Code nằm trong Step Event:
if (mouse_check_button_pressed(mb_left)){
var xx = mouse_x;
var yy = mouse_y;
move_towards_point(xx,yy,10);
}
Câu lệnh trên nhằm để kiểm tra xem bạn vừa click chuột vào vị trí nào, và di chuyển đối tượng hướng tới vị trí đó. Nhưng vì hoạt động click chuột là bất biến, bạn có thể click chuột vào lúc nào cũng được, nên việc kiểm tra phải được xảy ra liên tục, đấy cũng chính là lý do bạn nên bỏ đoạn code trên vào Step Event để 1 giây nó sẽ kiểm tra 10,100 hoặc 1000
lần.
Create Event: tương tự như Step Event, nhưng nó chỉ chạy 1 lần duy nhất kể từ khi tạo object, thường được dùng để khai báo thông số mặc định cho object.
Collision Event: tương tự như Step Event, nhưng nó chỉ chạy khi object chứa event này tương tác với 1 object được chỉ định.
Draw Event: chi phối những gì bạn thấy trên màn hình.
Sau khi tạo 1 Event bất kỳ, hãy sử dụng chức năng Execute Code để lập trình event đó nha, Lưu ý trong Execute Code có rất nhiều các hàm được dựng sẵn, các bạn hãy thị tìm hiểu tại đây, bên dưới mình sẽ hướng dẫn các sử dụng của một số hàm như kiểm tra phím, di chuyển đối tượng, ghi chữ lên màn hình game,...
Ở phần 1 mình đã hướng dẫn các bạn tạo object vào tìm kiếm tính năng trong Toolbox
Hoạt động trong game diễn ra như thế nào
Trước khi làm game, các bạn cần phải xác định vào game thì người chơi họ chơi cái gì. Trong ví dụ này game của mình sẽ là "Né chướng ngại vật", sẽ có 2 đối tượng chính là quả bóng và chướng ngại vật, người chơi sẽ cố điều khiển quả bóng né các chướng ngại vật trong thời gian lâu nhất có thể (và điểm sẽ được tính theo số Step đã trôi qua).
Mối quan hệ giữa các Object, Sprite và Event
Tạo đối tượng quả bóng (oCircle): sau khi tạo xong, quả bóng sẽ có các Event chính sau đây
- Create Event (oCircle): Giá trị mặc định cho các thuộc tính của quả bóng (Execute Code)
active=true;
myscore=0;
- Step Event (oCircle): Cũng sử dụng chức năng Execute Code
if (active){
if (mouse_check_button_pressed(mb_left)){
var xx = mouse_x;
var yy = mouse_y;
move_towards_point(xx,yy,10);
}
if (x<100) x=100
if (x>620) x=620
if (y<100) y=100
if (y>1420) y=1420
myscore+=1;
}
Tạo đối tượng chướng ngại vật (oWall): tạo đối tượng, đối tượng này không cần thiết có event nào, tuy nhiên để có thể điều chỉnh các thứ như: vị trí tạo chướng ngại vật, tốc độ của chướng ngại vật, độ khó, ... ta cần tạo thêm một Object khác để điều khiển việc tạo các đối tượng oWall này, mình sẽ đặt tên nó là oFunction
- Create Event (oFunction):
level=1;
levelSpeed=8;
delay=100;
- Step Event (oFunction): các thuật toán nhằm tạo các đối tượng ngẫu nhiên trong room trò chơi, tuy hàm tạo object mới đã được dựng sẵn nhưng các bạn có thể tìm hiểu thêm về nó tại đây hoặc tham khảo code mẫu bên dưới.
level=floor(oCircle.myscore/1000)+1;
levelSpeed=8+level*1.3;
if (delay==0){
delay=max(40,100-level*10);
var xx=random_range(0,520);
with (instance_create_layer(xx,-200,"Instances",oWall)){
speed=oFunction.levelSpeed;
direction=point_direction(0,0,0,1);
}
} else delay--;
- Hiển thị điểm số (oInfomation): tạo đối tượng và sử dụng Draw Event để hiển thị thông tin lên màn hình
draw_text(20,30,"Score: "+string(oCircle.myscore));
draw_text(700,30,"Level: "+string(oFunction.level));
- Hiển thị màn hình kết thúc (oGameOver): tương tự như trên
var layerId=layer_get_id("Background");
var backGroundId=layer_background_get_id(layerId);
layer_background_blend(backGroundId,c_red);
draw_text(360,310,"GAME OVER");
draw_text(360,510,"FINAL SCORE \n"+string(oCircle.myscore));
- Collision (oCircle - oWall) -> màn hình kết thúc, thông báo điểm số
Công đoạn cuối cùng, thêm một Collision event vào object oCircle để lập trình những thứ sẽ xảy ra khi quả bóng va chạm với chướng ngại vật
Tính năng bổ sung
Hình nền trong game: Tương tự như mục "Tạo Room" ở phần 1, nhưng các bạn có thể chọn một Sprite khác cho hình nền của mình ở room MainGame
Mình sử dụng hình nền cũ của room Menu cho room MainGame luôn vẫn được
Thông tin tác giả: Các bạn tự thiết kế cho mình một Sprite và làm tương tự như trên, sử dụng Sprite này làm hình nền cho room About nhé
Bên trong room About, các bạn có thể tùy biến và thêm vào 2 nút mới để trở về room Menu như mình
Giao diện sau khi hoàn thành game: chơi thử trên PC trước khi xuất ra android
Giao diện của mình đã thêm một số nút như nút trở về và nút chơi lại, thử thách cho các bạn hãy tự mình tham khảo phần 1 và thêm vào nhé
Hướng dẫn xử lý một số lỗi thường gặp
- Lỗi không hiển thị target Build for Android: Nếu các bạn đã làm xong game vào chạy được trên PC, nhưng không thể xuất cho thiết bị android, rất có thể phiên bản GMS2 của bạn không hỗ trợ target Build for Android. Để có thể xuất được cho thiết bị di động của bạn, hãy gỡ hoàn toàn phiên bản GMS2 hiện tại và cài phiên bản của mình (đã test) tại đây
- Lỗi "không thể build cho thiết bị này, hãy thêm Arm64" khi xuất project cho thiết bị android
Có thể các phiên bản android khác nhau sẽ tương thích với các kiến trúc khác nhau, để chắc chắn các bạn hãy chọn tất cả
3. Lỗi BUILD FAILED do phần mềm diệt virus: Nếu ấn F5 nhưng project không thể complie và chỉ ghi dòng chữ BUILD FAILED, hãy thử theo thứ tự:
- Ấn F5 lại lần nữa
- Đóng và mở lại phần mềm GMS2
- Tắt chương trình diệt virus trên máy
4. Lỗi giảm chất lượng đồ họa khi xuất project cho thiết bị android
Nếu các Sprite của bạn có chất lượng cao, hãy chỉnh lại thông số như trong hình để đảm bảo độ phân giải tốt nhất
Tạm kết
Vậy qua phần 2, chúng ta đã hiểu được mối liên hệ của các thành phần Sprite, Object và Event trong game. Về cơ bản game này đã có thể chơi được, nhưng mình vẫn còn rất nhiều tính năng muốn giới thiệu tới các bạn. Vì vậy nếu mọi người thấy hứng thú và muốn mình tiếp tục ra các phần tiếp theo hãy đánh giá 5 sao và share bài thật nhiều cho mình nhé, đạt cột mốc 5k view mình sẽ viết tiếp phần 3.
Giới thiệu sơ lược phần 3: thêm âm thanh trong trò chơi, tùy chỉnh font chữ hiển thị trong game, nhập tên người chơi và lưu danh sách điểm vào file, ...
Cuối cùng, cảm ơn các bạn đã xem blog này, nếu các bạn có vấn đề gì phát sinh trong quá trình thực hiện, các bạn có thể để lại comment và mình sẽ trợ giúp các bạn, chúc các bạn thành công.