[Hướng Dẫn] Làm Game Online Thật Đơn Giản Cùng Game Maker Server - Phần 1

namlunthklnamlunthkl Posts: 66Registered
edited August 2019 in Game Maker: Studio
Làm Game Online cùng Game Maker Server
]Phát huy tiếp loạt bài tutorial, mình lại dội bom Forum một lần nữa
Trước khi vào phần chính, mình muốn lưu ý với các bạn rằng bản thân mình không có điều kiện để Online nhiều nên muốn hỏi gì thì cứ Inbox rồi mình sẽ sớm giải quyết.
Rồi, ta vào phần chính!
Nói đến Game Online, hẳn ai cũng nghĩ đến những hệ thống đầy phức tạp(Mình cũng từng làm việc với 1 engine "Chuẩn" làm game online và nói thật rằng việc mở port cũng đã mệt rồi :dodgy: )
Lục xuống 1 tẹo, mình có đăng 1 Game Online(Grid Shooter) nhiều bạn cũng cho rằng phải thật cao siêu mới làm được nhưng chưa hẳn là vậy. Game Online chỉ đơn thuần như sau: Các máy con kết nối đến máy chủ (gọi là Client) và tất nhiên máy chủ (gọi là Server) sẽ xử lí và gửi đến những Client khác (Truy cập ngang hàng P2P).
Game Maker cũng có khá nhiều Engine để làm việc Online song đều rất khó dùng với các "Newbie". Chính lẽ đó, Game Maker Server được ra đời. So sánh 1 chút, tuy tốc độ không cao nhưng bù lại, bạn không cần bỏ ra 1 cục tiền để duy trì 1 VPS (Virtual Private Server) chạy Server cho Game. Ngoài ra, Game Maker Server cũng hỗ trợ 1 bộ công cụ cực kỳ đầy đủ, thuận tiện cho người dùng.
Nếu vẫn chưa sẵn sàng, bạn có thể ghé 1 chút vào trang chủ để hiểu thêm(Game của mình hiện đang nằm ở trang chủ): Game Maker Server
Trên trang chủ của GMServer, bạn kéo xuống, click download để tải nó về.

Hiện tại, GMServer đến phiên bản 1.8.6, file sau khi tải về có tên:
GameMaker Server 1.8.6d.zip

Giải nén được 3 Folder và 1 file:
Folder: Extension, Examples, Custom Windows
1 File cài đặt nhanh (Không biết cơ chế của nó thì không nên dùng nhé): Quick Installation (GM8 and GM81 only).exe

Chắc về chuyện nhập extension mình không cần nhắc nữa vì hẳn ai cũng biết. Còn nếu mới tập tành thì có thể search google hoặc nếu có thể mình sẽ hướng dẫn sau.

GMServer hỗ trợ 3 phiên bản của Game Maker:
Game Maker 8
Game Maker 8.1
Game Maker Studio (Lưu ý: Chỉ sử dụng được với phiên bản Game Maker Studio > 1.4.1130)


Tất cả các Function có trong phiên bản GMServer dành cho Game Maker Studio:
	ar_ban
	ar_isadmin
	ar_kick
	ar_none
	ar_owner
	ar_warn
	bdb_f32
	bdb_f64
	bdb_s16
	bdb_s32
	bdb_s8
	bdb_string
	bdb_u16
	bdb_u32
	bdb_u8
	cp_bottom
	cp_top
	e_accountexists
	e_already_logged_in
	e_banned
	e_global_ban
	e_invalid_name
	e_kicked
	e_local_ban
	e_noaccount
	e_noconnection
	e_ok
	e_ping
	e_serverfull
	e_userloggedin
	e_wrongpass
	gms_achievement_count
	gms_achievement_description
	gms_achievement_find
	gms_achievement_isreached
	gms_achievement_reach
	gms_action_get_argument
	gms_action_get_argument_name
	gms_action_get_argument_real
	gms_action_get_argument_string
	gms_action_get_id
	gms_action_get_sender
	gms_action_goto_next
	gms_admin_ban
	gms_admin_kick
	gms_admin_unban
	gms_bdb_close
	gms_bdb_open
	gms_bdb_read
	gms_bdb_read_hex
	gms_bdb_read_real
	gms_bdb_read_string
	gms_bdb_seek
	gms_bdb_size
	gms_bdb_tell
	gms_bdb_write
	gms_bdb_write_hex
	gms_bdb_write_real
	gms_bdb_write_string
	gms_chat
	gms_chat_bind_pos
	gms_chat_bind_room
	gms_chat_bind_view
	gms_chat_colors
	gms_chat_draw
	gms_chat_get_color
	gms_chat_get_sender
	gms_chat_get_sendername
	gms_chat_get_text
	gms_chat_get_time
	gms_chat_istyping
	gms_chat_keys
	gms_chat_local
	gms_chat_num
	gms_chat_set_font
	gms_chat_team_only_get
	gms_chat_team_only_set
	gms_chat_toggle
	gms_connect
	gms_debug_enable
	gms_debug_hide_errors
	gms_draw
	gms_draw_toggle
	gms_friend_count
	gms_friend_get
	gms_friend_isonline
	gms_friend_name
	gms_friend_send_request
	gms_global_exists
	gms_global_get
	gms_global_get_real
	gms_global_get_string
	gms_global_isreal
	gms_global_set
	gms_global_set_real
	gms_global_set_string
	gms_highscore_add
	gms_highscore_add_guest
	gms_highscore_count
	gms_highscore_find_pos
	gms_highscore_list_count
	gms_highscore_list_exists
	gms_highscore_list_id
	gms_highscore_list_title
	gms_highscore_name
	gms_highscore_replace
	gms_highscore_score
	gms_highscore_self_score
	gms_info_isconnected
	gms_info_isloggedin
	gms_info_isresponding
	gms_info_login_count
	gms_info_ping
	gms_ini_game_delete
	gms_ini_game_exists
	gms_ini_game_read
	gms_ini_game_size
	gms_ini_game_size_limit
	gms_ini_game_write
	gms_ini_player_delete
	gms_ini_player_exists
	gms_ini_player_read
	gms_ini_player_size
	gms_ini_player_size_limit
	gms_ini_player_write
	gms_init
	gms_instance_created_by_sync
	gms_instance_get
	gms_instance_get_owner
	gms_instance_get_real
	gms_instance_get_string
	gms_instance_handover
	gms_instance_handover_all
	gms_instance_is_owner
	gms_instance_isreal
	gms_instance_set
	gms_instance_set_real
	gms_instance_set_string
	gms_instance_sync
	gms_instance_sync_destroy
	gms_instance_sync_destroy_silent
	gms_instance_sync_var_add
	gms_location_countrycode
	gms_location_countryname
	gms_location_isonum
	gms_location_languages
	gms_login_error_tostring
	gms_login_errorcode
	gms_login_execute
	gms_login_player_has_account
	gms_login_set_password
	gms_login_set_username
	gms_logout
	gms_master_player
	gms_message_reporting
	gms_network
	gms_optimize_set_max_skip
	gms_optimize_set_sendspeed
	gms_optimize_set_spc
	gms_optimize_variables
	gms_other_admin_rights
	gms_other_count
	gms_other_exists
	gms_other_find
	gms_other_find_by_name
	gms_other_get
	gms_other_get_real
	gms_other_get_string
	gms_other_has_changed
	gms_other_isreal
	gms_p2p_send
	gms_register
	gms_register_error_tostring
	gms_register_errorcode
	gms_request_resource
	gms_script_set_chat_receive
	gms_script_set_chat_verify
	gms_script_set_connection_lost
	gms_script_set_drawchat
	gms_script_set_kick
	gms_script_set_login
	gms_script_set_logout
	gms_script_set_p2p
	gms_script_set_roomid
	gms_script_set_session_change
	gms_script_set_vs_begin
	gms_script_set_vs_end
	gms_self_admin_rights
	gms_self_isguest
	gms_self_ismaster
	gms_self_name
	gms_self_playerid
	gms_self_set
	gms_self_set_precision
	gms_session_count
	gms_session_create
	gms_session_current_id
	gms_session_exists
	gms_session_id
	gms_session_join
	gms_session_player_count
	gms_session_type
	gms_settings
	gms_setversion
	gms_sha512
	gms_show_achievements
	gms_show_friends
	gms_show_highscore
	gms_show_isopen
	gms_show_keyboard
	gms_show_login
	gms_show_message
	gms_show_register
	gms_show_replace
	gms_show_set_allowguest
	gms_show_set_constant
	gms_show_set_fonts
	gms_show_set_position
	gms_show_statistics
	gms_show_toggle_keyboard
	gms_show_update
	gms_statistic_count
	gms_statistic_description
	gms_statistic_find
	gms_statistic_get
	gms_statistic_set
	gms_status
	gms_step
	gms_team_auto_join
	gms_team_find_player
	gms_team_get_current
	gms_team_join
	gms_team_player_count
	gms_team_player_get
	gms_team_player_is_friend
	gms_team_score_add
	gms_team_score_get
	gms_team_score_set
	gms_team_set_max
	gms_time
	gms_uninit
	gms_update_apply
	gms_update_check
	gms_update_has_updated
	gms_update_isfinished
	gms_update_progress
	gms_update_start
	gms_version
	gms_vs_end
	gms_vs_ready
	gms_vs_time
	is_extended
	is_full
	is_onetime
	isc_local
	lt_fullfps
	lt_second
	lt_supersave
	lt_twenty
	mt_achievement_get
	mt_friend_login
	mt_friend_logout
	mt_highscore_get
	mt_none
	mt_player_login
	mt_player_logout
	re_ip_limit
	re_mail_in_use
	re_mail_invalid
	re_name_in_use
	re_name_invalid
	re_name_too_short
	re_ok
	re_pass_not_equal
	re_pass_too_short
	rs_background
	rs_sound
	rs_sprite
	spc_autocombine
	spc_interpolate
	spc_interpolate_smoothpredict
	spc_none
	spc_smooth_interpolate_nopredict
	spc_smoothen
	spc_smoothen_inerextrapolate
	spc_smoothen_interpolate
	spc_supersmooth_interpolate
	to_server
	tt_ease
	tt_linear
	tt_shake
	tt_sin
	wle_add
	wle_build_cache
	wle_build_cache_recursive
	wle_close
	wle_copy
	wle_create
	wle_destroy
	wle_destroy_internal
	wle_draw
	wle_element_position
	wle_event_dequeue
	wle_event_element
	wle_event_empty
	wle_event_name
	wle_find
	wle_find_style
	wle_focus
	wle_get
	wle_get_constantdata
	wle_get_styledata
	wle_grab_element
	wle_hashname
	wle_init
	wle_invalidate_cache
	wle_load
	wle_parse_layout
	wle_parse_styles
	wle_parse_value
	wle_parse_valuelist
	wle_perform
	wle_position
	wle_register_event
	wle_register_handler
	wle_replace_children
	wle_set
	wle_set_constant
	wle_set_renderwh
	wle_show
	wle_step
	wle_textbox_select_all
	wle_tick
	wle_tween
	wt_achievements
	wt_friends
	wt_highscores
	wt_keyboard
	wt_login
	wt_message
	wt_register
	wt_statistics
	wt_update
	xGms_bdb_get
	xGms_bdb_open
	xGms_session_find

Trong Phần 1, mình sẽ tạm thời hướng dẫn các bạn khởi đầu cùng GMServer.
Trước tiên, bạn tạo các object với tên sau:
1. GMS (với tên đó luôn nhé)
2. obj_login
3. obj_player
4. obj_other_player

Ở object GMS, chúng ta tạo các script với Event và nội dung sau:

Event: Create
gms_init(GMS);

Event: Step
gms_step();

LƯU Ý CỰC KỲ QUAN TRỌN
Lúc bạn thêm extension, Bạn chọn 1 trong 3 phiên bản, ở tut này làm bằng GMS nên chỉ sử dụng 1 trong 2 cái là bản:
1. GameMaker Server 1.8.6d - GameMaker Studio (All).gex
2. GameMaker Server 1.8.6d - GameMaker Studio (Windows).gex

Event: Draw
gms_draw();

Trong trường hợp bạn sử dụng bản All thì trong Event Networking(Click tạo event, chọn Asynchronous và chọn Networking)
Thêm đoạn Code sau:
Event: Networking
gms_network();



OK!, giờ tới lượt chỉnh sửa obj_login. Nếu bạn muốn, bạn có thể đặt sprite cho object này. Nhưng trong tut này, để nhanh gọn mình đặt script login vào event nhấn phím L.

Ở Event Step, thêm đoạn script:
gms_show_login(); //Hiện đăng nhập và trả về giá trị vào User Define

Quay lại Event Create, để mở đầu cho mọi thứ, thêm đoạn script này:
gms_settings(1, 1, obj_player, obj_other_player); //con số 1 đầu là chế độ game(tất nhiên là đặt bình thường) còn con số kia là phiên bản của game. obj_player là con mà người chơi sẽ điều khiển cuối cùng là obj_other_player, nó chính là cái xác của những người chơi khác :p nó chẳng có trách nhiệm gì ngoài nhận dữ liệu và biến đổi cho phù hợp :D

Sau khi User đăng nhập, nếu thất bại sẽ trả về Event User Defined 14
Ví dụ, nếu muốn thoát game thì thêm vào script:
game_end();

Ngược lại, đăng nhập thành công sẽ trả về event User Defined 15 :D
Thêm đoạn code thông báo:
show_message("Login Successfully!");



Giờ nếu muốn test thì tạo 1 cái room đặt tên chẳng hạn như: rm_login
Sau đó quẳng obj_login và GMS vào room đó. Giờ thì test thoải mái đi :D



Bài viết còn có phần sau, cập nhật theo dõi và Vote nếu muốn bài ra sớm
Xin cảm ơn đã đọc bài viết "Siêu dài" và "Siêu rối" của mình. Mong các bạn sẽ thực hiện thành công :D
Cheers,

Comments

Sign In or Register to comment.