2012-04-01 32 views
13

Tôi cần thực hiện một số kết nối mạng cơ bản cho dự án Pygame.Kết nối mạng cơ bản với Pygame

Về cơ bản, đó là một trò chơi đơn hoặc trò chơi hợp tác 2D. Mạng chỉ cần hỗ trợ 2 người chơi, với một người chơi như một máy chủ.

Thông tin duy nhất cần gửi là vị trí của người chơi, creep và dấu đầu dòng.

Tôi đã đọc xung quanh và Twisted vẫn tiếp tục, nhưng tôi chưa kết nối mạng trước đây và tôi không chắc liệu đó có phải là quá mức hay không.

Vì vậy, có thể cho một người mới tương đối triển khai mạng trong Pygame không? ai đó có thể chỉ cho tôi phương hướng đúng không?

Trả lời

11

Điều này đã được hỏi gần đây trên Reddit, vì vậy tôi sẽ nhiều hơn hoặc ít hơn chỉ cần sao chép câu trả lời của tôi từ đó. Tôi xin lỗi vì không thể cung cấp thêm liên kết, tôi có < 10 đại diện vì vậy tôi chỉ có thể đăng hai liên kết mỗi lần.

Xoắn có thể hoạt động, nhưng tôi không có nhiều kinh nghiệm với nó. Tôi khuyên bạn nên đi với ổ cắm, vì đó là những gì Twisted sử dụng trong nền anyway. Hướng dẫn của Beej (google it) là khá nhiều Holy Bible của ổ cắm nếu bạn muốn tìm hiểu cách họ làm việc (trong C + +, nhưng các khái niệm mở rộng ở khắp mọi nơi). Python làm trừu tượng một số phức tạp đi, nhưng nó vẫn là một ý tưởng tốt để biết những gì đang xảy ra trong nền.

Đối với các ổ cắm cụ thể của Python, bạn có thể tiếp tục và chỉ sử dụng howto (user745294 đã đăng liên kết ở trên). Here là một bài viết hay có tựa đề "Mọi lập trình viên cần biết gì về Mạng trò chơi". Nó đi vào các loại khác nhau của phong cách mạng chính (client-server, p2p, udp v. Tcp, vv) và lịch sử đằng sau những gì một số trò chơi lớn được sử dụng cho mạng của họ.

Dưới đây là liên kết đến bản trình diễn mà tôi đã thực hiện khi tạo "trò chơi" được nối mạng trong Python 2.6/Pygame. Nó không thực sự là một trò chơi, nhưng mỗi khách hàng bạn tạo kết nối với máy chủ và điều khiển một nhân vật. Bạn có thể di chuyển nhân vật của mình bằng các phím mũi tên và nhân vật sẽ di chuyển trên tất cả các máy khách được kết nối. Tôi đã cố gắng bình luận mã nguồn với một số dấu hiệu của những gì tôi đang gửi qua lại, nhưng bạn có thể cần một chút kiến ​​thức về ổ cắm để hiểu nó.

http://www.mediafire.com/?bjwr225lpefzkfj

+0

Dưới đây là một vài liên kết mã hóa tới Máy khách/Máy chủ trong trường hợp bạn không muốn truy cập vào mediafire (bạn sẽ phải cung cấp bg.png và sprite.png của riêng bạn). Máy chủ: http://codepad.org/p9lVrmqn Khách hàng: http://codepad.org/e6pwGj24 – nemec

+1

Liên kết mediafire đã chết, có vẻ như vậy. Các liên kết codepad là tuyệt vời mặc dù, cảm ơn! –

0

Có Pyro (python đối tượng từ xa) như một giải pháp cho mạng trong python.

http://irmen.home.xs4all.nl/pyro/

+0

Không sử dụng Pyro cho bất kỳ thông tin liên lạc không tin cậy nào. Nó chắc chắn là không thích hợp cho một trò chơi chơi trên internet. http://packages.python.org/Pyro4/security.html#pickle-as-serialization-format – Glyph

+0

Tôi thừa nhận đó không phải là trường hợp sử dụng tốt nhất cho nó, cảm ơn vì đã chỉ ra. – Tshirtman

0

Sử dụng ổ cắm thô là ở mức độ thấp và đầy nguy hiểm. Như đã nói, Twisted rất phức tạp và phải mất thời gian đứng dậy và chạy. Để tiết kiệm cho mình một số nhức đầu tôi muốn thử một cái gì đó giống như https://github.com/dotcloud/zerorpc-python

Bạn cần giải pháp sau:

  • khám phá cầu thủ khác (s) trên mạng (cục bộ), bạn không muốn người chơi nhập một số địa chỉ IP
  • xử lý lỗi mạng
  • sắp xếp từng thông điệp chứa dữ liệu của bạn (vị trí, tên người chơi, v.v.)
  • xử lý luồng như mạng là không đồng bộ IO

Trên vẫn nên được gọi là 'cơ bản', bạn thực sự cần sử dụng một số ưa thích thư viện liên kết với các API ngữ.

UPDATE:

Về cơ bản bạn cần phải vạch trần dịch vụ mạng (trong chủ đề riêng của nó) mà sẽ đẩy thông điệp đến Python của Queue, sau đó truy cập vào cùng một hàng đợi này từ mã Pygame của bạn, và nếu có một thông điệp sau đó bạn cập nhật bất cứ cấu trúc nào bạn sử dụng để lưu trữ vị trí của người chơi và vẽ nó trên màn hình. Bạn không nên gửi các nội dung như vị trí bullet trên mạng vì chúng có thể dễ dàng (và nhanh hơn) được tính cục bộ, bạn chỉ cần gửi một sự kiện như bullet_shot qua mạng với vị trí nguồn và vector tốc độ.

+2

Xoắn không phải là tất cả những gì phức tạp. Một máy chủ echo là 3 dòng mã. Máy chủ RPC 2 chiều không nhiều hơn thế. Tuy nhiên, Twisted là một giải pháp mạng chung, thích hợp cho một khách hàng trò chơi - zerorpc dựa trên zeromq và do đó không phù hợp với các giao tiếp không tin cậy của khách hàng; nó là nhiều hơn cho việc phối hợp các dịch vụ back-end với nhau. – Glyph

6

Bạn có thể sử dụng Twisted để kết nối mạng với PyGame. The "game" project trên Launchpad có một số ví dụ về cách người ta có thể tích hợp các vòng chính với nhau; về cơ bản, sử dụng twisted.internet.task.LoopingCall để vẽ khung hình PyGame và xử lý đầu vào, trong khi cho phép lò phản ứng Xoắn của sự lựa chọn của bạn chạy bình thường.