Lập Trình Android Game Với Game Maker Studio (Phần 2)

Ở phần 1, mình đã hướng dẫn các bạn cài đặt cũng như giới thiệu về các thao tác đơn giản trên workspace của GMS2, tuy nhiên game của chúng ta chỉ mới dừng lại ở việc tạo menu và hoàn toàn chưa có thao tác gì. Ở phần này, mình sẽ hướng dẫn cho các bạn các công đoạn lập trình tính năng cho một game và hoàn thiện game này. Ngoài ra, mình cũng sẽ hướng dẫn các bạn xử lý một số lỗi thường gặp trong quá trình sử dụng.

*Mình sẽ viết tắt GMS2: Game Maker Studio 2*

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  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)){
				
		//Lấy điểm x,y vừa nhấn vào
	    var xx = mouse_x;
	    var yy = mouse_y;
		
		//Di chuyển object hướng đến điểm nà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  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)
    //Trạng thái của quả bóng
    active=true;
    
    //Điểm của trò chơi (quả bóng)
    myscore=0;
  • Step Event (oCircle): Cũng sử dụng chức năng Execute Code
    //Nếu quả bóng vẫn còn "sống" thì thực hiện công việc kiểm tra
    if (active){
    	
    	//Đoạn code này mình đã giới thiệu ở bên trên
    	 if (mouse_check_button_pressed(mb_left)){
    	    var xx = mouse_x;
    	    var yy = mouse_y;
    		move_towards_point(xx,yy,10);
    		
    	}
                           
    	//Kiểm tra điểm ấn vào có ngoài màn hình hay không
    	if (x<100) x=100 
    	if (x>620) x=620 
    	if (y<100) y=100
    	if (y>1420) y=1420
    	
    	//Tăng 1 điểm mỗi một lần kiểm tra, hay nói cách khác là +1/1 step
    	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):
    //Độ khó
    level=1;
    
    //Tốc độ của chướng ngại vật
    levelSpeed=8;
    
    //Thời gian chờ giữa các lần tạo chướng ngại vật mới(tính bằng steps)
    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.
    //1000 điểm = tăng 1 level: TÙY CHỈNH
    level=floor(oCircle.myscore/1000)+1;
    
    //Tính tốc độ của chướng ngại vật theo level: TÙY CHỈNH
    levelSpeed=8+level*1.3;
    
    //Nếu hết thời gian đếm ngược
    if (delay==0){
    	
    	//Reset thời gian đếm ngược, nhưng tối thiểu là 40 (tránh giật lag)
    	delay=max(40,100-level*10);
    	
    	//Tạo chướng ngại vật ngẫu nhiên
    	var xx=random_range(0,520);
    	with (instance_create_layer(xx,-200,"Instances",oWall)){
    		
    		//Tốc độ của chướng ngại vật, speed là biến dựng sẵn nên không cần khai báo
    		speed=oFunction.levelSpeed;	
    		
    		//Hướng của chướng ngại vật Trên->Dưới
    		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 
    //Hiển thị điểm ở phía trên bên trái
    draw_text(20,30,"Score: "+string(oCircle.myscore));
    
    //Hiển thị level ở phía trên bên phải
    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
    //Đổi background thành màu đỏ: TÙY CHỈNH NÂNG CAO
    var layerId=layer_get_id("Background");
    var backGroundId=layer_background_get_id(layerId);
    layer_background_blend(backGroundId,c_red);
    
    //Thông báo: Game Over
    draw_text(360,310,"GAME OVER");
    
    //Thông báo điểm
    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

  1. 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
  2. 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.


  RATE: 4.7 

  1178 VIEW


chưa có bình luận nào ...
BÀI VIẾT LIÊN QUAN
Code Game 2D Dodge Block Bằng Unity (Phần 2)

Hiện có rất nhiều phần mềm Engine hỗ trợ việc lập trình game từ di động đến desktop, như Game Maker Studio, Unreal Engine 4, … trong đó có Unity. Nhìn sơ qua thì Unity có thể là một nền tảng khá khó cho người mới học, họ dễ bị sốc kiến thức khi lần đầu tiếp cận unity vì nó cung cấp 1 lượng lớn thư viện hỗ trợ gồm các thư viện Asset đồ sộ, các model, được dựng sẵn.

BÀI VIẾT LIÊN QUAN
Code Game 2D Dodge Block Bằng Unity (Phần 1)

Hiện có rất nhiều phần mềm Engine hỗ trợ việc lập trình game từ di động đến desktop, như Game Maker Studio, Unreal Engine 4, … trong đó có Unity. Nhìn sơ qua thì Unity có thể là một nền tảng khá khó cho người mới học, họ dễ bị sốc kiến thức khi lần đầu tiếp cận unity vì nó cung cấp 1 lượng lớn thư viện hỗ trợ gồm các thư viện Asset đồ sộ, các model, được dựng sẵn.

BÀI VIẾT LIÊN QUAN
Lập Trình Android Game Với Game Maker Studio (Phần 4)

Trong phần cuối cùng này, chúng ta hãy cùng nhau tiếp tục tìm hiểu sâu hơn về các tính năng khác trong GMS2 mà bạn có thể sử dụng để nâng cấp trò chơi lên cột mốc chuyên nghiệp hơn. Hãy chắc chắn rằng các bạn đã đọc các bài viết trước đó để có thể thao tác mượt mà trong phần 4