2011-10-27 30 views
5

Tôi đã mã hóa một ứng dụng bomberman sử dụng kết nối ngang hàng trò chơi để kết nối ngang hàng. Vấn đề là sau một thời gian trò chơi không được đồng bộ nữa.Bộ trò chơi Peer to Peer

Tôi đã xem mã mẫu cho GKTanks và sử dụng mô hình của họ. Không có mối quan hệ máy khách/máy chủ giữa các đồng nghiệp nên tôi không sử dụng một trong game của mình. Cả hai đồng nghiệp duy trì một trò chơi mà họ cập nhật dựa trên dữ liệu nhận được.

Tôi có một NSTimer được sử dụng để chạy gameloop ở mỗi khung. Các NSTimers không đồng bộ nên đôi khi các game thủ trở nên khác nhau cũ: người chơi nhận được một sức mạnh tại cùng một khoảng thời gian và cả hai đều có được sức mạnh vì phải mất một thời gian để gửi dữ liệu.

Tôi sẽ đánh giá cao bất kỳ ý tưởng nào về cách làm cho ứng dụng hoạt động. Tôi đang nghĩ đến việc viết lại mã để sử dụng máy khách-khách hàng nhưng tôi không chắc đó có phải là ý tưởng hay không ... chưa

Cảm ơn bạn!

EDIT: Tôi đã thay đổi mã sao cho trình phát ngẫu nhiên được chọn làm máy chủ. Mỗi lần người chơi đặt một quả bom, anh ta hỏi máy chủ nơi đặt nó. Máy chủ trả về vị trí của người chơi (như đã thấy trên máy chủ) và sau đó cho người chơi biết nơi đặt bom.

Để tăng sức mạnh, máy chủ sẽ kiểm tra xem người chơi có nhận được sức mạnh không và liệu anh ta có gửi gói tin thông báo cho anh ta không.

Một vấn đề khác đã xuất hiện ngay bây giờ. Độ trễ giữa các thiết bị cao (Tôi đang sử dụng kết nối bluetooth). Phải mất khoảng 0,2 giây để đặt một quả bom sau khi khách hàng khai thác nút để đặt nó.

Tôi đang gửi tất cả dữ liệu một cách đáng tin cậy. Tôi làm đúng chứ hả?

Trả lời

4

Vâng preferbly bạn muốn có một mối quan hệ chủ-khách hàng mà chỉ có các máy chủ có thể thao tác các trạng thái trò chơi, vì vậy trong trường hợp của bạn nó sẽ là:

Cả hai cầu thủ đổ xô đến các powerup. Máy chủ lưu trữ nó trước tiên.
Nó được đăng ký và máy chủ lưu trữ điện.
Trong khi đó trình phát # 2 cũng chọn tăng nguồn, gửi hành động đến máy chủ.
Máy chủ thông báo cho người chơi # 2 rằng nguồn điện đã biến mất.

Điều xảy ra với trường hợp của bạn là bạn bị ràng buộc để có được các desynch từ mất gói.
Với mối quan hệ máy chủ-khách hàng không thể xảy ra, vấn đề duy nhất là máy chủ luôn có lợi thế lớn hơn khi độ trễ tăng giữa các thiết bị đặc biệt trên điện thoại thông minh.

Trong một trò chơi như bomberman, nó hoàn toàn hợp lý để gửi toàn bộ gamestate mỗi lần thay đổi một cái gì đó thay vì hành động được thực hiện, điều này là để đảm bảo cả hai thiết bị được đồng bộ.

Để tổng hợp: cả người dùng đều có gamestate nhưng chỉ có máy chủ mới có thể thao tác cả hai.

0

những gì bạn nên làm:

  • một trong những thiết bị này là máy chủ, một số khác là khách hàng
  • quá trình
  • chủ tất cả các bang trò chơi và đưa ra quyết định, sau đó nó sẽ gửi toàn bộ GameState cho khách hàng
  • khách hàng nhận được gamestate và chỉ vẽ mọi thứ dựa trên nó - nó không đưa ra bất kỳ quyết định nào (ai đã chọn bom, bom đã phát nổ, v.v.)
  • khách hàng chỉ gửi đầu vào tới máy chủ (nhấn trái, phải, tạm dừng vv)

là vậy. nếu bạn cố gắng đưa ra quyết định trên cả hai máy, bạn sẽ gặp phải những rắc rối lớn cố gắng giữ chúng đồng bộ.

Các vấn đề liên quan