Sau khi đã thiết lập kết nối, tạo phòng game và có hai người, chúng ta sẽ bắt đầu trò chơi. Nhưng điều này cũng có nghĩa là bắt đầu một ý tưởng gọi là “liên lạc”. Khó khăn chính trong bất cứ trò chơi nhiều người nào cũng là các hành động diễn ra đồng thời.Xét trong ví dụ trò chơi đánh bóng bàn pong1.gm6 trong file examples sau khi giải nén tập tin multiplayer, khi một người chơi nhìn thấy quả bóng trong game ở nơi khác so với người thứ hai thì chắc hẳn những diễn biến lạ lùng sẽ xảy ra. (Trong trường hợp xấu nhất, một người nhìn thấy vợt đập trúng bóng còn người kia sẽ thấy đập trượt). Trò chơi dễ dàng bị “lệch pha” và từ đó sẽ tạo ra nhiều rắc rối. Chúng ta phải hạn chế lượng liên lạc càng nhiều càng tốt. Rất có thể dữ liệu còn dễ bị truyền chậm ở phía đầu kết nối kia, thậm chí bị mất và không đến được. Chúng ta phải xử lý các vấn đề này dựa trên kiểu game, ví dụ như game chiến thuật theo lượt sẽ dùng đến cơ chế khác so với các trò chơi hành động nhanh.
Game Maker hỗ trợ hai cơ chế để liên lạc là chia sẻ dữ liệu và truyền message. Cách thứ nhất khá dễ dàng còn cơ chế thứ hai thì linh hoạt và phức tạp hơn nhưng cũng đòi hỏi bạn phải hiểu cách thức hoạt động của liên lạc.
Kỳ 3: Chia sẻ dữ liệuTheo cách này, tất cả các liên lạc đều bị bạn chặn. Giá trị 1000000 là thông số chung cho tất cả các thực thể của game (ví dụ như cả Master và Slave). Mỗi thực thể này có thể thiết lập và đọc các giá trị. Game Maker đảm bảo cho mỗi thực thể này đều nhận biết được cùng các giá trị đó. Một giá trị có thể là số thực, có thể là một string.
Có hai công thức sau:
mplay_data_write (ind,val) viết giá trị val (string hoặc số thực) vào vị trí ind (ind giữa 0 và 1000000)
mplay_data_read (ind) trả giá trị vào vị trí ind (ind có giá trị trong khoảng 0 đến 1000000)
Vào lúc ban đầu tất cả các giá trị đều bằng 0.
Để dùng cơ chế này, bạn phải xác định giá trị nào dùng cho thức thể nào và ai được phép thay đổi nó. Tốt hơn hết là một instance của game được viết giá trị này và chỉ dùng vài vị trí đầu tiên để lưu bộ nhớ.
Trong trường hợp này, có 4 giá trị quan trọng: tọa độ y cây vợt của Master, tọa độ y cây vợt của Slave, tọa độ x, y của quả bóng. Vì vậy, chúng ta dùng vị trí 1 để xác định tọa độ y cho cây vợt của Master, vị trí 2 để xác định tọa độ y cho cây vợt của Slave. Xác lập Master chịu trách nhiệm cho các giá trị của quả bóng. Slave chỉ đơn giản là vẽ quả bóng theo vị trí đúng cho mỗi bước.
Cách hoạt động như sau: Trước hết, cây vợt của Master (vợt bên trái) chỉ được Master điều khiển. Điều này có nghĩa là các sự kiện keyboard cho mũi tên lên, xuống dùng để điều khiển nó, bạn phải đảm bảo rằng vị trí chỉ thay đổi nếu bạn là Master. Mã cho phím mũi tên lên như sau:
{
if (!global.master) exit;
if (y > 104) y -= 6;
mplay_data_write(1,y);
}
Còn cây vợt của Slave cũng được viết với mã tương tự. Giờ đây, cả Master và Slave phải đảm bảo rằng họ đặt vợt của đối phương vào đúng vị trí và chúng ta thực hiện điều này trong sự kiện Step. Nếu là Slave, trong sự kiện Step cho cây vợt của Master, chúng ta thiết lập vị trí như sau:
{
if (global.master) exit;
y = mplay_data_read(1);
}
Thực hiện tương tự cho cây vợt của Slave.
Cuối cùng, đối với quả bóng, chúng ta phải làm cho nó nảy tưng tưng khi đụng vào bàn hoặc vợt. Thực ra, điều này chỉ thực hiện với Master. Để gửi dữ liệu về quả bóng cho Slave, bạn chènt hêm đoạn mã sau vào sự kiện Step.
{
if (global.master)
{
mplay_data_write(3,x);
mplay_data_write(4,y);
}
else
{
x = mplay_data_read(3);
y = mplay_data_read(4);
}
}
Với các mã trên, việc liên lạc cơ bản đã được thực hiện. Việc còn lại là xử lý phần khởi động của trò chơi, phần ghi điểm… Master sẽ quyết định khi nào người chơi thua và thay đổi điểm số, khởi động quả bóng mới.
Một điều cần chú ý là với cách thức liên lạc như trên, hai phần chơi có thể hơi “lệch pha” nhưng bạn có thể tránh rắc rối đó bằng cách đưa vào một object đồng thời. Object này sử dụng một số giá trị để đảm bảo cho hai bên đều sẵn sàng trước khi bất kỳ thứ gì được vẽ ra trên màn hình. Dù vậy, bạn vẫn phải cẩn trọng vì có thể xảy ra tình trạng ngưng để chờ phía bên kia.
Hơn thế nữa, khi một người tham gia vào trò chơi sau khi các giá trị chia sẻ này thay đổi thì chúng sẽ không được gửi tới người mới. Do vậy, chỉ những thay đổi mới sau thời điểm đó mới được gửi đến người mới tham gia.
Nguồn :
[You must be registered and logged in to see this link.]