Đẳng Cấp Học Sinh

Đẳng Cấp Học Sinh

Đại Ân 2
 
Trang ChínhPortalCalendarTrợ giúpTìm kiếmThành viênNhómĐăng kýĐăng Nhập

Share | 
 

 Game Maker (phần 14): Thực hiện chức năng chơi online

Xem chủ đề cũ hơn Xem chủ đề mới hơn Go down 
Tác giảThông điệp
zavasaki11
Thành Viên Cấp 2
Thành Viên Cấp 2


Tổng số bài gửi : 21
Join date : 03/05/2012
Age : 23
Đến từ : Đại Ân 2

Bài gửiTiêu đề: Game Maker (phần 14): Thực hiện chức năng chơi online   Mon May 21, 2012 5:35 pm

Trò chơi bóng bàn mà chúng ta đang thử nghiệm ở phần thực hiện chức năng chơi online này có một vấn đề nghiêm trọng như sau: Khi có sự ngắt quãng trong liên lạc, quả bóng của Slave sẽ tạm thời đứng im. Không có vị trí tọa độ nào được gửi tới và do đó, quả bóng không di chuyển.


Rắc rối này nảy sinh nhất là khi khoảng cách giữa các máy tính quá xa nhau và đường truyền chậm. Khi trò chơi trở nên phức tạp hơn, bạn sẽ cần thêm nhiều giá trị để mô tả tình trạng của nó. Nếu bạn thay đổi nhiều giá trị trong mỗi step thì sẽ có nhiều thông tin hơn cần được truyền đi. Việc này sẽ khiến bạn mất thời gian, làm chậm trò chơi hoặc có thể làm cho mọi hoạt động bị “lệch pha”.

Một cách để truyền tải dữ liệu chia sẻ nhanh hơn được một chút là không dùng chế độ đảm bảo. Bạn có thể dùng hàm sau:

mplay_data_mode (guar) xác định xem có dùng hay không dùng chế độ truyền tải đảm bảo.
guar có thể mang giá trị True (mặc định) hoặc False.

Một kỹ thuật hay hơn để xử lý tình trạng này là xác định điểm “chết”. Tại đây, chúng ta gửi thông tin từ thời điểm này đến thời điểm khác. Vào khoảng thời gian giữa, bản thân trò chơi phải “đoán” điều gì đang diễn ra tùy vào thông tin mà nó có.

Kỳ 5: Xác định điểm "chết"

Chúng ta sẽ áp dụng điều này cho trò chơi bóng bàn: Không chỉ gửi đi vị trí của quả bóng trong mỗi step, ta gửi cả thông tin về tốc độ và hướng đi của quả bóng. Lúc này, Slave có thể tự thực hiện phần lớn các phép tính. Miễn là không có thông tin mới đến từ Master, trò chơi đơn giản chỉ tính đường di chuyển của quả bóng.

Chúng ta sẽ không dùng dữ liệu chia sẻ trong trường hợp này mà dùng cách truyền tin nhắn, chỉ ra thay đổi về vị trí, tốc độ của quả bóng và vị trí của cây vợt. Master gửi những message đó bất cứ khi nào có sự thay đổi. Đối tượng điều khiển trong Slave sẽ “lắng nghe” các tin nhắn này và thiết lập các thông số đúng. Nhưng nếu Slave không nhận được gì, nó sẽ để cho quả bóng di chuyển. Nếu Slave gây ra “lỗi lầm” nhỏ nào thì message sau của Master sẽ sửa lại. Ví dụ, trong sự kiện Step của quả bóng, chúng ta đưa vào đoạn mã sau:

{
if (!global.master) exit;
mplay_message_send(0,11,x);
mplay_message_send(0,12,y);
mplay_message_send(0,13,speed);
mplay_message_send(0,14,direction);
}

Trong sự kiện của đối tượng điều khiển, ta đặt đoạn mã sau:

{
var messid, val;
while (mplay_message_receive(0)
{
messid = mplay_message_id();
val = mplay_message_value();
// Check for bat changes
if (messid == 1) bat_left.y = val;
if (messid == 2) bat_right.y = val;
// Check for ball changes
if (messid == 11) object_ball.x = val;
if (messid == 12) object_ball.y = val;
if (messid == 13) object_ball.speed = val;
if (messid == 14) object_ball.direction = val;
// Check for sounds
if (messid == 100) sound_play(val);
}
}

Chú ý rằng các message không cần phải gửi đi theo chế độ đảm bảo. Nếu lỡ mất một tin nhắn thì vẫn không gây ra vấn đề nào nghiêm trọng lắm. Bạn có thể tìm thấy trò chơi ứng dụng kỹ thuật này trong pong2.gm6. Giờ đây, bạn sẽ thất vọng khi chạy pong2 vì vẫn còn một số chỗ ngắt quãng. Nguyên nhân gây ra sự cố này là đường truyền chậm. Slave có thể nhận các tin nhắn bị gửi lại sau một thời gian, do đó, nó sẽ làm cho quả bóng quay lại một chút rồi sau đó, khi nhận được message mới, nó mới đẩy bóng về phía trước.

Do đó, hãy tiếp tục thử lần thứ ba và bạn có thể kiểm tra công việc với pong3.gm6. Trong trường hợp này, chúng ta chỉ thay đổi thông tin khi quả bóng đụng vào cây vợt. Tất cả phần còn lại của hành động được thực hiện bằng cách dùng đến chức năng xác định điểm “chết”. Master “lo” cho mọi hoạt động diễn ra ở phần vợt của mình và Slave thì chịu trách nhiệm cho hoạt động của vợt ở đầu bên kia. Trong khi quả bóng di chuyển từ đầu này đến đầu kia, không có message nào được truyền đi truyền lại nữa.

Lúc này bạn sẽ thấy quả bóng di chuyển khá mềm mại. Chỉ khi nó đập trúng một cây vợt thì mới có thể xảy ra sự “tắc nghẽn” hoặc quả bóng mới di chuyển trước khi nó đến được cây vợt phía bên kia. Lý do là cơ chế này giả định cả hai phần chơi diễn ra cùng một tốc độ. Nếu một trong các máy tính có tốc độ chậm thì có thể gây ra rắc rối. Nhưng sự tắc nghẽn xảy ra ở một cây vợt sẽ dễ dàng được chấp nhận hơn là trong quá trình chuyển động.

Nhằm tránh rắc rối kiểu này, bạn cần thêm một số cơ chế cải tiến nữa. Ví dụ: bạn có thể gửi thông tin để mỗi bên biết được trò chơi có tốc độ thế nào ở đầu bên kia và có thể sửa lỗi.

Nguồn : [You must be registered and logged in to see this link.]
Về Đầu Trang Go down
Xem lý lịch thành viên
 

Game Maker (phần 14): Thực hiện chức năng chơi online

Xem chủ đề cũ hơn Xem chủ đề mới hơn Về Đầu Trang 
Trang 1 trong tổng số 1 trang

Permissions in this forum:Bạn không có quyền trả lời bài viết
Đẳng Cấp Học Sinh :: Lập Trình - Thiết Kế :: Phát Triển Game :: Game Maker-