Friday, July 17, 2015

Tuesday, July 7, 2015

Monday, May 18, 2015

Database trong Game Maker
Khi làm game, việc lưu dữ liệu là rất quan trọng. Dữ liệu được lưu có 2 dạng chính: Chuỗi - String(bao gồm các ký tự không có số) và Số học - Real (Bao gồm số).
Dạng lưu database bằng Game Maker thông dụng nhất là INI. Bây giờ, mình sẽ hướng dẫn các bạn sử dụng các function ini_... để lưu và đọc dữ liệu nhé!
Trước tiên, bạn phải định nghĩa được file INI có những cấu trúc như thế nào. Xem hình minh họa:
Sơ Đồ Cấu Tạo File INI
1 File INI gồm 4 cấp độ
- File INI (Chứa toàn bộ dữ liệu của các Sections, xem như cái tủ đựng) 
     - Sections: Đơn vị nhỏ hơn file, chứa các dữ liệu từ các keys (xem như cái khay)
          - Keys: Đơn vị này chỉ có 1 value duy nhất, là đơn vị cấu thành nên sections và file ini.
Bạn cứ xem chúng như cái tủ quần áo. File INI là cái tủ, sections là các thùng đồ, keys là các chiếc áo, còn value là những họa tiết trên chiếc áo đó.
Tất nhiên, việc sắp xếp này sẽ mang lại 1 cấu trúc dữ liệu khá đơn giản để truy cập và ghi lên.

VẬY CÁCH SỬ DỤNG TRONG GM LÀ GÌ?
Trước tiên, bạn phải mở file INI trước đã.
Hãy sử dụng function mở file ini:
ini_open("Filename.ini")
Trong đó filename.ini là tên file ini cần đọc Sau đó, đọc hay ghi dữ liệu vào
ini_read_real("Section", "Key", "Default") //Đọc dữ liệu và trả về giá trị real
ini_read_string("Section", "Key", Default) //Đọc dữ liệu và trả về giá trị string
ini_write_real("Section", "Key", Value) //Ghi dữ liệu dạng real, trả về true khi thành công
ini_write_string("Section", "Key", "Value") //Ghi dữ liệu dạng string, trả về true khi thành công

ini_section_delete("Section") //Xóa section chỉ định
ini_key_delete("Section","Key") //Xóa Key thuộc Section chỉ định
Trong đó:
"Section" là section trong file INI
"Key" là Key trong Section chỉ định
Value là giá trị số cần ghi vào
"Value" là giá trị chuỗi(string) cần ghi vào
"Default" là khi không tìm thấy Section hoặc Key thì giá trị trả về sẽ bằng với Default bạn đã thiết lập (dạng String)
Default là khi không tìm thấy Section hoặc Key thì giá trị trả về sẽ bằng với Default bạn đã thiết lập(dạng Real)
HÀM LOGIC
ini_section_exists("Section") //Kiểm tra nếu section tồn tại thì trả về true và ngược lại
ini_key_exists("Section","Key") //Kiểm tra nếu một key nằm trong section nào đó tồn tại
Cuối cùng, khi đã truy cập xong dữ liệu, đừng quên close ini bằng function
ini_close()
Lưu ý: Chỉ close được khi bạn đã mở bằng function ini_open(), khi bạn chưa close file ini hiện thời thì không thể mở tiếp file khác trên cùng object đó.
Cuối cùng sẽ là ví dụ:
ini_open("tutorial.ini")
show_message(ini_read_string("Section","Key",""))
show_message("a + b =" + string(ini_read_real("Real","a",0)+ini_read_real("Real","b",0)))
if ini_section_exists("Section")
{
show_message("Section exists")
}
else
{
show_message("Section doesn't exists")
}

và đây là nội dung file INI
[Section]
Key="Day la mot string"
[Real]
a=12
b=124
Chúc bạn thành công, cùng share cho mọi người bài viết này nhé!!!
Tác giả: Nguyễn Anh Nhân - KLStudio
Nếu copy xin để lại nguồn, hãy thể hiện bạn là người có văn hóa!

Saturday, March 28, 2015

Platform Engine tuyệt vời cho Game Maker
Có lẽ đây là một engine platform tốt nhất mà trước đến nay mình từng được "diện kiến": B1: Tạo 1 Script và đặt tên là "motion" (không có 2 dấu ngoặc kép "")
/// motion(right,jump,left) // CONTROLS ///////////// if(argument0-argument2==1) { spr_dir = 1; hsp = min(max_spd,hsp+acc_spd); } if(argument1==1) { if(free==0 && hold==0) { vsp = jmp_spd; jump = 1; } hold = 1; } else {hold = 0;} if(argument2-argument0==1) { spr_dir =-1; hsp = max(-max_spd,hsp-acc_spd); } // HORIZONTAL MOVEMENT //////////////////////// repeat(round(abs(hsp))) { var blk, mov; blk = place_meeting(x+lengthdir_x(1,grv_dir+(sign(hsp)*90)),y+lengthdir_y(1,grv_dir+(sign(hsp)*90)),par_solid); mov = 0; if(blk==1) { for(a=1;a<=max_slp;a+=1) { if(place_meeting(x+lengthdir_x(1,grv_dir+(sign(hsp)*90))-lengthdir_x(a,grv_dir),y+lengthdir_y(1,grv_dir+(sign(hsp)*90))-lengthdir_y(a,grv_dir),par_solid)==0) { x += lengthdir_x(1,grv_dir+(sign(hsp)*90))-lengthdir_x(a,grv_dir); y += lengthdir_y(1,grv_dir+(sign(hsp)*90))-lengthdir_y(a,grv_dir); mov = 1; break; } } if(mov==0) { hsp = 0; break; } } else { var jt; jt = instance_place(x+lengthdir_x(1,grv_dir+(sign(hsp)*90)),y+lengthdir_y(1,grv_dir+(sign(hsp)*90)),par_jump_through); if(jt!=noone) { if(place_meeting(x,y,jt)==0) { for(a=1;a<=max_slp;a+=1) { if(place_meeting(x+lengthdir_x(1,grv_dir+(sign(hsp)*90))-lengthdir_x(a,grv_dir),y+lengthdir_y(1,grv_dir+(sign(hsp)*90))-lengthdir_y(a,grv_dir),par_jump_through)==0) { x += lengthdir_x(1,grv_dir+(sign(hsp)*90))-lengthdir_x(a,grv_dir); y += lengthdir_y(1,grv_dir+(sign(hsp)*90))-lengthdir_y(a,grv_dir); mov = 1; break; } } } } if(mov==0) { for(a=max_slp;a>=1;a-=1) { if(place_meeting(x+lengthdir_x(1,grv_dir+(sign(hsp)*90))+lengthdir_x(a,grv_dir),y+lengthdir_y(1,grv_dir+(sign(hsp)*90))+lengthdir_y(a,grv_dir),par_solid)==0 && (place_meeting(x+lengthdir_x(1,grv_dir+(sign(hsp)*90))+lengthdir_x(a,grv_dir),y+lengthdir_y(1,grv_dir+(sign(hsp)*90))+lengthdir_y(a,grv_dir),par_jump_through)==0 && sign(vsp)>-1)) { if(place_meeting(x+lengthdir_x(1,grv_dir+(sign(hsp)*90))+lengthdir_x(a+1,grv_dir),y+lengthdir_y(1,grv_dir+(sign(hsp)*90))+lengthdir_y(a+1,grv_dir),par_solid)==1 || place_meeting(x+lengthdir_x(1,grv_dir+(sign(hsp)*90))+lengthdir_x(a+1,grv_dir),y+lengthdir_y(1,grv_dir+(sign(hsp)*90))+lengthdir_y(a+1,grv_dir),par_jump_through)==1) { x += lengthdir_x(1,grv_dir+(sign(hsp)*90))+lengthdir_x(a,grv_dir); y += lengthdir_y(1,grv_dir+(sign(hsp)*90))+lengthdir_y(a,grv_dir); mov = 1; break; } } } } if(mov==0) { x+= lengthdir_x(1,grv_dir+(sign(hsp)*90)); y+= lengthdir_y(1,grv_dir+(sign(hsp)*90)); } } } // VERTICAL MOVEMENT ////////////////////// repeat(round(abs(vsp))) { if(place_meeting(x+lengthdir_x(1,grv_dir-90+(sign(vsp)*90)),y+lengthdir_y(1,grv_dir-90+(sign(vsp)*90)),par_solid)==1) { vsp = 0; landed = 1; break; } var jt; jt = instance_place(x+lengthdir_x(1,grv_dir),y+lengthdir_y(1,grv_dir),par_jump_through); jt = collision_line(bbox_left,bbox_bottom+1,bbox_right,bbox_bottom+1,par_jump_through,1,1); if(jt!=noone && sign(vsp)>-1) { if(place_meeting(x,y,jt)==0) { vsp = 0; landed = 1; break; } } x+= lengthdir_x(1,grv_dir-90+(sign(vsp)*90)); y+= lengthdir_y(1,grv_dir-90+(sign(vsp)*90)); } free = 1; if(place_meeting(x+lengthdir_x(1,grv_dir),y+lengthdir_y(1,grv_dir),par_solid)==1) { free = 0; } var jt; jt = instance_place(x+lengthdir_x(1,grv_dir),y+lengthdir_y(1,grv_dir),par_jump_through); jt = collision_line(bbox_left,bbox_bottom+1,bbox_right,bbox_bottom+1,par_jump_through,1,1); if(jt!=noone && sign(vsp)>-1) { if(place_meeting(x,y,jt)==0)free=0; } // GRAVITY & FRICTION /////////////////////// if(free==1) { vsp+= grv_spd; if(argument0-argument2==0){hsp=max(0,abs(hsp)-air_frc)*sign(hsp);} } else { jump = 0; if(argument0-argument2==0){hsp=max(0,abs(hsp)-gnd_frc)*sign(hsp);} }
B2: Tạo 2 object: 1 object tên là "par_solid" và 1 object tên là "par_jump_through"(2 object này sẽ làm parent cho các object tường) B3: Tạo object tên là "obj_player" Đặt ở event create script sau:
////////////////////// // Object Variables // ////////////////////// //The default platforming stats for all platforming units. //Modify these to your heart's content. max_spd = 6; //Max hspeed acc_spd = 0.8; //hspeed accelaration jmp_spd =-12; //Jumping speed(decreases by grv_spd every step) grv_spd = 0.6; //vspeed accelaration/gravity grv_dir = 270; //gravity direction(0=Right, 90=Up, 180=Left, 270=Down) air_frc = 0.15; //Number to decrease hspeed by when no key is pressed in air gnd_frc = 0.85; //Number to decrease hspeed by when no key is pressed on ground max_slp = 2; //Highest slope you can climb (in px) //Required variables, don't mess with 'em hsp = 0; vsp = 0; free = 1; //Whether you're in the air (1) or on the ground (0) spr_dir = 1; //Sprite direction (useful for image_xscale) hold = 0; //Whether you're holding the jump key
Ở event Step, đặt code sau
motion(keyboard_check(vk_right),keyboard_check(vk_up),keyboard_check(vk_left))
B4: Tiếp theo chúng ta tạo 1 obj_wall, đặt parent cho obj_wall này là par_solid(không thể đi xuyên qua) hoặc par_jump_through(nhảy xuyên được, sau khi xuyên thì đứng lên phía trên luôn). B5: Bày biện chúng trong room B6: Chạy game!!! Chúc các bạn thành công!!! có gì để lại lời nhắn với mình qua comment nha, mình sẽ trợ giúp!

Saturday, January 3, 2015

http_get_file(url,dest) - Một Function tải file online của Game Maker!

Hiện nay, việc sử dụng Internet đã quá gần gũi với chúng ta. Việc lưu dữ liệu Online cũng vậy nhưng với 1 phần mềm làm game như GM, liệu việc này có ích gì?
NÓ RẤT CÓ ÍCH. Ví dụ:
Khi bạn có 1 trang web và muốn người dùng đăng nhập ngay trong Game. Trước tiên, việc bạn làm là phải tải file chứa thông tin đăng nhập về (Tốt nhất là mã hóa cho an toàn ) Sau đó giải mã hóa và đọc dữ liệu. Trong nhiều trường hợp, http_get_file còn rất tốt trong việc chống bị đánh cắp tài nguyên (Tải file về, giải mã hóa và xóa. Như  vậy dù có decompile được thì cũng chẳng có dữ liệu mà hốt :v )
Cú pháp:
ArgumentDescription
urlĐịa chỉ file
local_targetChỗ sẽ lưu file lại
Ở event HTTP, đây là những const mang các dữ liệu hoặc thông báo



  • id: ID của việc Request

  • status: Trả về trạng thái của việc get(<1 = Lỗi)

  • result: Dữ liệu nhận được

  • url: URL mà chúng ta đã yêu cầu

  • http_status: Status của file (Ví dụ: 404: Không tồn tại,.....)
  • Code ví dụ
    http_get_file("http://klstudio.url.ph/images/back.png","back.png")

    Thursday, December 4, 2014

    Lib cho extension làm game Online
    Để phục vụ nhu cầu làm việc với extension của Nya Nana, mình đã tạo 1 cái lib (tab kéo thả) chứa đủ chức năng cần thiết nhưng 1 số cái anh em vẫn phải tự sáng tạo thoy. Thôi nói nhiều. Sau khi tải về, mọi người paste nó vào thư mục lib của Game Maker. Bật Game Maker lên, nhìn bên phải và tận cmn hưởng. Lưu ý: Cái Nút Initial phải kéo vào create event của object server nhé!
    Link: http://adf.ly/uyULZ
    Tải extension: http://adf.ly/4240716/daas

    Monday, October 20, 2014

    Làm Game Online với Game Maker Server Phần 2

    Đã hoàn tất việc giới thiệu sơ lược, giờ chúng ta sẽ vào vấn đề chính: LÀM GAME
    Trước tiên, để vào được phần này, bạn cần đăng ký 1 tài khoản ở Trang chủ Game Maker Server: http://gamemakerserver.com rồi vào phần Developer, nhập một mật khẩu( phải khác với mật khẩu tài khoản!) sau đó vào Giao diện chính của phần Developer nó sẽ thế này:
    Bạn nhập các thông tin về Game ở ô Title và GameID (cái này rất là quan trọng để game bạn không bị nhầm lẫn và bạn có quyền quản trị cho game!)
    Sau đó, nhấn vào Add new game  để hoàn tất việc đăng ký. Nhắc lại, xin hãy ghi nhớ GameID thật kỹ càng!




    Sau khi làm các bước trên, bật Game Maker lên, Vào Global Game Setting và vào Tab Loading, xuống phần Game Identifier và nhập cái GameID lúc nãy vào!
    bấm OK để lưu lại và trở lại màn hình chính, load cái Extension bạn tải trên trang Game Maker Server vào, bạn đã hoàn thành khâu chuẩn bị!
    Nói rõ ra: Để làm được game với Extension này thì ít nhất bạn cũng phải thành thạo việc làm game Offline với Game Maker và bạn phải tư duy thật tốt cộng thêm việc ghi nhớ các biến rõ ràng!
    Thời gian có hạn nên hôm nay mình chỉ viết đến vậy, ngày mai sẽ tiếp tục với phần 3: Cách để hiện Login box hoặc tự tạo riêng một Login cho mình!!!!

    Saturday, October 18, 2014

    Làm Game Online với Game Maker Server Phần 1

    Thời kì hiện đại này Internet và Game Online đã phát triển quá mạnh, hình thức Game Offline phá đảo dần dần lu mờ đi, tại sao không làm một game online hoành tráng với nó nhỉ :)
    Link tải: Bấm vào đây
    Trong đó có một vài Example nhưng xem ra khá là khó hiểu. Sơ lược về các hàm:
    gms_instance_created_by_sync(): Nói với server cái object này được đồng bộ hóa bởi người dùng
    gms_instance_get(id, "variable"): Lấy cái global var từ object
    gms_instance_get_owner(id): Kiểm tra ID của người tạo ra nó
    gms_instance_get_real(id, "variable"): Lấy cái var dạng số của object
    gms_instance_get_string(id, "variable"): Lấy var dạng string của object
    gms_instance_handover(id): Ngắt đồng bộ object ở một client nào đó(bằng ID)
    gms_instance_handover_all(): Ngắt đồng object ở toàn bộ client(tiết kiệm CPU + Server size)
    gms_instance_isreal(id, "variable"): Đặt cho cái varible đó là số
    gms_instance_is_owner(id): Tao là chủ của nó
    gms_instance_set(id, "variable", value): Đặt biến cho object kia khi tạo ra nó
    gms_instance_set_real(id, "variable", value): Đặt cái biến có số
    gms_instance_set_string(id, "variable", value): Đặt biến vừa số vừa chữ
    gms_instance_sync(id, flags, "var1", "var2"...): Tạo ra 1 object ở tất cả client, cái này thông dụng mà lại khó, tí nói rõ luôn :")
    gms_instance_sync_destroy(id): Xóa cái object đã được đồng bộ tại một client

    Các Flag chính:

    • One-time synchronization: Đồng bộ vị trí chỉ một lần, khi xóa không thể xóa trên tất cả client, tạo các biến và chỉ cho chỉnh sửa chúng một lần, chiếm ít dung lượng nhưng thường thường các thông số sẽ bị sai lệch chút ít.
    • Extended synchronization: Đồng bộ hóa liên tục vị trí, khi destroy thì tất cả client khác cũng destroy theo nhưng chiếm nhiều CPU và Server size.
    • Full synchronization: Bao gồm tất cả các thứ trên nhưng được tích hợp thêm vài thứ nhưng hầu như không ai dùng.
    Cách sử dụng arguments trong Game Maker
    Kết quả hình ảnh cho coding

    Lập trình vài hôm về Game Maker chắc không ai là không thắc mắc về cái quái này.
    Thứ nhất: Hầu như rất ít người dùng đến arguments
    Thứ hai: Đòi hỏi người dùng phải tư duy tốt và não phải nhớ nhanh
    Thứ ba: Đôi khi dùng nó rất ức chế

    Vào phần chính

    I. Arguments là gì?

    Khái niệm về argument khá là mập mờ, nói chung, nó dùng để liên kết các script với nhau gần như là tương tự với một Globalvar nhưng được mở rộng hơn. Game Maker hỗ trợ cho ta 12 arguments và đó là số lượng arguments lớn nhất cho 1 script (thừa rồi :)) ). Thế dùng Arguments như thế nào? Xem tiếp nhé!!! ;)

    II. Cách dùng Arguments

    Đọc phần trên chắc bạn cũng sơ sơ hiểu về cái Arguments. Và giờ là phần vừa dễ vừa khó nhất: SỬ DỤNG ARGUMENTS để tạo các script mới
    Cái này đòi hỏi bạn phải thông thạo về script mới được!
    Tạo 1 script mới với cái tên là tên hàm định tạo, ở đây tôi đặt là icreate(instance_create đấy :v)
    Trong phần code của nó, tôi đặt như sau:
    instance_create(16,16,argument0)
    Rồi vào object chính đặt 1 cái event linh tinh gì đó, global left pressed chẳng hạn, đặt cho nó một cái script và tôi sẽ code cho nó như thế này:
    icreate(obj_player) ////với obj_player là một object riêng biệt
    Thế là xong, khi bạn nhấn chuột trái nó sẽ tạo ra 1 object ở tọa độ 16:16

    III. Kết luận 

    Tóm lại, Argument dùng để tạo ra một script mới bằng các script cũ và khi sử dụng thì các argument sẽ được thay bằng các thông tin cần thiết cho script. Có gì thắc mắc xin vui lòng comment lại phía dưới để giúp :) Hẹn gặp lại ở tutorial sau: Cách làm Game Online với Game Maker Server

    Thursday, October 16, 2014

    Hướng dẫn fix lỗi không thể chạy game HTML5 trên trình duyệt chrome!
    Như chúng ta đã biết, theo thông báo từ chrome thì từ phiên bản 35.0 của chromium trở lên sẽ được cập nhật lại, vì vậy, một số phiên bản của game maker khi xuất ra file game để up lên web.
    Các cách khắc phục:
    - Bật Javascript
    - Cập nhật phiên bản của Game Maker (khuyến khích sử dụng bản Early Access!)
    Hướng dẫn bật Javascipt:
    Google Chrome
    1. Nhấp vào biểu tượng trình đơn Chrome Chrome menu trên thanh công cụ trình duyệt.
    2. Chọn Cài đặt.
    3. Trên trang "Cài đặt", nhấp vào liên kết Hiển thị cài đặt nâng cao....
    4. Trong phần "Bảo mật", nhấp vào Cài đặt nội dung...
    5. Chọn Cho phép tất cả các trang web chạy JavaScript (nên chọn) trong phần "JavaScript".
    6. Nhấp vào Hoàn tất.
    Mozilla Firefox
      1. Chọn Tools (Công cụ) từ trình đơn trên cùng.  2. Chọn Options (Tùy chọn).Chọn Content (Nội dung) từ thanh điều hướng trên cùng.  3. Để bật JavaScript chọn hộp đánh dấu bên cạnh Enable JavaScript (Bật JavaScript) .  4. Để tắt Javascript chọn tùy chọn ngược lại.  5. OK.
    Internet Explorer (9.0)
      1. Chọn Tools (Công cụ) từ trình đơn trên cùng.
      2. Chọn Internet Options (Tùy chọn Internet).
      3. Nhấp vào tab Security (Bảo mật)
      4. Nhấp vào Custom Level (Cấp độ tùy chỉnh).
      5. Cuộn xuống cho đến khi bạn thấy mục có gắn nhãn 'Scripting'
      6. Trong 'Active Scripting', để bật JavaScript chọn Enable (Bật) và để tắt Javascript chọn tùy chọn ngược lại.
      7. OK.

    Cập nhật Phiên bản Game Maker

    Bấm vào đây để tải.

    Thông tin về phiên bản Game Maker Studio Early Access 1.99.182 (Nguồn: Trang chủ Game Maker)

    Changes

    • Audio files change their path to be the file added to the project, not remain the original import location.
    • Script/Timeline window titles now all use _ instead of . for their seperator.
    • "Pop-in" windows will still remember their size and position correctly after running a game.
    • Enums now error if initialised with string or other enum value (see 0015352 and 0015353).
    • Enums have also been added to the manual on the "Data Types" page.
    • Fix to stop multiple copies of the same script/code window being open at once.
    • iOS packages maintain the Included Files folder structure set in the resource tree.
    • Fix for access violations when deleting an extension.
    • Fixes to make downloading files from the Marketplace more reliable (fixes "Socket Error 0" on published assets).
    • My Library "Update" button is now disabled during updates.
    • Duplicating a script will always give the new one a different name.
    • Fix for missing script in Marketplace package import if the script name matches its group name.

    Fixed Bugs

    • 0015520 0015520: Scripts: [Can open multiple copies of the same] coding windows
    • 0015229 0015229: UI: Windows/Forms don't display properly, testing application rearranges all windows and cascades them.
    • 0015352 0015352: Enums don't error if supplied strings
    • 0015353 0015353: Enums don't take expressions with other enums or variables
    • 0015271 0015271: iOS: Included Files are all copied into the same folder, without keeping subdirectories structure
    • 0015456 0015456: UI: Can't delete extension, access violation
    • 0015517 0015517: UI: Cannot close Timeline window
    • 0015519 0015519: Audio: Sound Properties Filename: uses original location when importing and play sample and export
    • 0015509 0015509: No documentation on enums
    • 0015256 0015256: Android: No splash screen displayed on Android
    • 0015390 0015390: I/O error on importing GM81 files into EA version
    • 0015488 0015488: Socket Error #0 / HTTP Error 403 when downloading update to asset
    • 0015508 0015508: Scripts: Duplicate script keeping same name - Crash game on run