[Hướng Dẫn] Căn bản về Instance - Focker C

Focker_cFocker_c Posts: 1,577Registered
edited July 2019 in Game Maker: Studio
Instance

Chào các bạn. Mình là Focker C - mod GME diễn đàn TTC hiện thời.
Hôm nay mình xin post một mini-guide GME về một vấn đề rất cơ bản, nhưng thường bị các GMU (Game Maker Users) bỏ qua. Đó là "Instance". Từ ngữ này chắc hẳn các GMU gặp khá nhiều trong các guide hay tip mà ko hiểu được nghĩa chính xác của nó.

Vậy, Instance là gì ? Có ăn đc ko ? :D
Điều chắc chắn là nó ko ăn được, và để hiểu được Instance là gì, thì trước tiên phải biết Object là gì.
Objects là các "vật thể" sẽ có mặt trong game, thực hiện các sự kiện riêng mà người lập trình giao phó cho. Ví dụ : Con quái , người chơi , viên đạn.

Ở hình trên, mình tạo ra 1 object có tên là "tao_la_object_day".
Về cơ bản, có những vật thể ko chỉ xuất hiện 1 lần. Ví dụ như object "tao_la_object_day" của mình là 1 con quái, và nó sẽ có mấy con trong map chứ ko phải một. Vậy chẳng nhẽ lại phải tạo thêm 4, 5 cái object tương tự sao ?
Không, trong cơ chế của GME, bạn có thể lặp lại 1 object nhiều lần trong 1 room. Mỗi lần lặp lại này đều tạo ra một bản sao. Những bản sao này được gọi là INSTANCE.
Chúng đều thừa hưởng những event của object gốc, nhưng hoạt động độc lập. Chúng cũng có ID riêng để GMU có thể đưa ra các lệnh chỉ định riêng.

j9lh4hf1xelnavofgjpg

Trong hình trên, mình tạo ra 6 con quái (instances) trong room. Nếu bạn đưa chuột vào con giữa như trong hình , bạn có thể xem được ID của instance này (ID = 100008)
Ví dụ mình muốn con quái ở giữa này di chuyển tới vị trí có tọa độ (123,456) mà các con khác vẫn đứng yên thì viết script sau :-1:

(100008).x = 123 ;
(100008).y = 456
Vì thế ta có thể thay đổi các biến của object có ID xxxxxx , ta sử dụng mẫu lệnh :
(xxxxxx).<biến cần thay đổi>  =  <giá trị cần thay đổi>
NÂNG CAO :
Một số lệnh mạnh hơn, sẽ giúp bạn khi muốn lấy ID của các instance :
- instance_exists(obj) : trả về giá trị true hay false về việc có instance nào của object mang tên "obj" tồn tại hay ko.
- instance_number(obj) : trả về số lượng instance của object mang tên "obj".
- instance_position(x,y,obj) : trả về ID của instance tạo ra từ "obj" và đang ở vị trí (x,y)
- instance_nearest(x,y,obj) , instance_furthest(x,y,obj) : lần lượt trả về ID của instance tạo ra từ "obj" và đang gần nhất / xa nhất so với mốc lấy ở vị trí (x,y)
- instance_create(x,y,obj) : tạo ra một instance từ object "obj" và đặt nó ở vị trí (x,y)
- instance_destroy() : phá hủy instance chứa lệnh này.

NÂNG CAO HƠN CHÚT NỮA :
Ví dụ 1 : Tôi muốn tạo ra 1 instance mới và lấy được ID của nó luôn.
Trả lời : Đây :
A = instance_create(123,456,object2)
A.speed = 100
A được gán luôn id của instance vừa được tạo ra theo lệnh. Ở đây, mình cho instance A này có tốc độ bằng 100. Các bạn nhớ lưu ý, khi này thì ta ko còn dùng dấu ngoặc để bọc ID nữa.
Ví dụ 2 : Tôi muốn phá hủy 1 instance khác chứ ko phải instance đang viết script.
Trả lời : Đây :
(xxxxxx).instance_destroy()
A.instance_destroy()
Bạn cần làm cách nào đó để gán ID của instance cần phá hủy vào A , hay làm cách nào để có được ID chính xác của nó.
Hết , mong rằng mini-guide này có ích cho các GMU nói chung và cộng đồng GMU TTC "mới vào" nói riêng. :D
Ơ ? Có cái spoiler kìa ??
989658lsf9dsm8tfgjpg

Comments

  • MeoDenLuoiMeoDenLuoi Posts: 1,425Registered
    Tuyệtttttttttttttttttttttttttttttttttttttttttttttt
    Tuyệt cmn vời
    tuyệt vãi cả gói xôi của a Khoa
    nói chung là tuyệt..!!
  • slucis7593slucis7593 Posts: 544Registered
    :D Tuyệt vời ông mặt trời, đúng là đạo trưởng có khác.
    Cái này có vẻ giống như Copy 1 cái event trong rpg maker rồi paste ra xung quanh nhỉ, về các thông số khác vẫn y nguyên, chỉ có ID + tọa độ là khác đi.
  • dsiver144dsiver144 Posts: 1,064Registered
    Mod của GME có khác :) Klq nhưng trong rpg có 1 script là spawn event, mình thường dùng call script với id như này để điều khiển event "ảo" đó :) Chứ trong editor ko có :v
  • David ChaseDavid Chase Posts: 1,766Registered
    MeoDenLuoi wrote:
    Tuyệtttttttttttttttttttttttttttttttttttttttttttttt
    Tuyệt cmn vời
    tuyệt vãi cả gói xôi của a Khoa
    nói chung là tuyệt..!!

    TUyệt vãi cả gói xôi của anh khoa :))
  • Focker_cFocker_c Posts: 1,577Registered
    Hôm nọ có new-comer nào cơ mà ? Đc mấy hôm mất tích luôn à ? :(
  • dsiver144dsiver144 Posts: 1,064Registered
    Chắc tại thấy anh ko vào rep nên đi thẳng luôn rồi :D or maybe not
  • Dang_KhoaDang_Khoa Posts: 3,861Administrators
    MeoDenLuoi wrote:
    Tuyệtttttttttttttttttttttttttttttttttttttttttttttt
    Tuyệt cmn vời
    tuyệt vãi cả gói xôi của a Khoa
    nói chung là tuyệt..!!

    Xôi của anh tuyệt là tất nhiên rồi
    :dedoa::dedoa::dedoa:
  • dsiver144dsiver144 Posts: 1,064Registered
    Dang_Khoa wrote:
    MeoDenLuoi wrote:
    Tuyệtttttttttttttttttttttttttttttttttttttttttttttt
    Tuyệt cmn vời
    tuyệt vãi cả gói xôi của a Khoa
    nói chung là tuyệt..!!

    Xôi của anh tuyệt là tất nhiên rồi
    :dedoa::dedoa::dedoa:

    Ai ăn rồi cho bài "Rì viu" Xôi của a Khoa đi ^^
  • MeoDenLuoiMeoDenLuoi Posts: 1,425Registered
    Dang_Khoa wrote:
    MeoDenLuoi wrote:
    Tuyệtttttttttttttttttttttttttttttttttttttttttttttt
    Tuyệt cmn vời
    tuyệt vãi cả gói xôi của a Khoa
    nói chung là tuyệt..!!

    Xôi của anh tuyệt là tất nhiên rồi
    :dedoa::dedoa::dedoa:
    chơi bừa 1 câu h thành người PR trá hình cho quầy xôi của a Khoa r =]]
  • manh9011manh9011 Posts: 4Registered
    không có cái lệnh như thế này đâu nhé
    (xxxxxx).instance_destroy()
    //hoặc là :
    A.instance_destroy()
    

    viết là
    with (A) instance_destroy();
    hoặc
    with A instance_destroy();
  • Focker_cFocker_c Posts: 1,577Registered
    manh9011 wrote:
    không có cái lệnh như thế này đâu nhé
    (xxxxxx).instance_destroy()
    //hoặc là :
    A.instance_destroy()
    

    viết là
    with (A) instance_destroy();
    hoặc
    with A instance_destroy();

    Bạn đùa mình chắc :D
    Sao mình gõ vào nó vẫn works very well ? :3
Sign In or Register to comment.