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