Pygameプロジェクトのためにいくつかの基本的なネットワーキングを行う必要があります。
基本的に、それは2Dシングルプレイヤーまたは協力ゲームです。ネットワークは、1つをホストとして、2つのプレーヤーをサポートするだけで済みます。
送信する必要がある唯一の情報は、プレイヤーの位置、クリープ、弾丸です。
私はよく読んでいて、Twistedが次々と登場しますが、これまでネットワーキングを行ったことがなく、それがやり過ぎかどうかはわかりません。
それで、比較的初心者がPygameにネットワーキングを実装することは可能ですか?誰かが私を正しい方向に向けることができますか?
これは最近Redditで尋ねられたので、多かれ少なかれそこから答えをコピーします。これ以上リンクを提供できなかったことをお詫びします。担当者が10人未満なので、一度に2つしか投稿できません。
ツイストはうまくいくかもしれませんが、私はそれについてあまり経験がありません。とにかくTwistedがバックグラウンドで使用するので、ソケットを使用することをお勧めします。 Beejのガイド(google it)は、ソケットがどのように機能するかを知りたい場合は、ほとんど聖書の聖書です(C++では、概念はどこにでもあります)。 Pythonは複雑さの一部を抽象化しますが、それでもバックグラウンドで何が起こっているのかを知ることは良い考えです。
Python特定のソケットについては、先に進んでハウツーを使用できます(user745294は上記のリンクを投稿しました)。 ここ 'sa「すべてのプログラマーがする必要があること」というタイトルの素晴らしい記事ゲームネットワーキングについて知っている」。これは、さまざまなタイプの主要なネットワーキングスタイル(クライアントサーバー、p2p、udpv。tcpなど)と、いくつかの主要なゲームがネットワーキングに使用したものの背後にある歴史について説明します。
以下は、Python 2.6/Pygameでネットワーク化された「ゲーム」を作成する際に行ったデモへのリンクです。実際にはゲームではありませんが、作成する各クライアントはサーバーに接続してキャラクターを制御します。矢印キーを使用してキャラクターを移動すると、接続されているすべてのクライアントでキャラクターが移動します。ソースコードにコメントして、送信内容を示してみましたが、理解するにはソケットに関する知識が少し必要な場合があります。それ。
ソースコードは、この投稿の下のコメントのコードパッドリンクに記載されています。スクリプトと同じディレクトリに2つの画像を提供する必要があります。
bg.png
は背景のスプライトです。幅400ピクセル、高さ300ピクセルの画像である必要があります(これは、必要に応じてGameClient
クラスで変更できます)Sprite.png
はプレイヤーキャラクターです。動き回るのが見えるように、背景よりも小さくする必要があります。PyGameとのネットワーキングには Twisted を使用できます。 「ゲーム」プロジェクト Launchpadには、メインループを統合する方法の例がいくつかあります。基本的に、twisted.internet.task.LoopingCall
を使用してPyGameフレームを描画し、入力を処理し、選択したTwistedリアクターを正常に実行します。
すでにPygameを使用しているので、Pygame用に作成されたこの軽量ネットワークライブラリは、必要なことを実行して教えてくれますが、圧倒されることはないと思います。 pygame.org経由の "Mastermind Networking Lib"
Pythonでネットワークを構築するための別のソリューションとしてpyro(pythonリモートオブジェクト)があります。
Rawソケットの使用は低レベルであり、危険に満ちています。前に述べたように、Twistedは複雑で、起動して実行するのに時間がかかります。頭痛の種を減らすために、次のようなものを試してみます https://github.com/dotcloud/zerorpc-python
次の解決策が必要です。
上記はまだ「基本」と呼ばれるべきです、あなたは本当に慣用的なAPIでいくつかの派手なネットワーキングライブラリを使うべきです。
更新:
基本的に、メッセージをPythonのQueue
にプッシュするネットワークサービスを(独自のスレッドで)公開し、Pygameコードからこの同じキューにアクセスする必要があります。メッセージがある場合は、使用する構造を更新します。プレイヤーの位置を保存し、画面に描画します。弾丸の位置のようなものはローカルで簡単に(そしてより速く)計算できるので、ネットワークを介して送信するべきではありません。ソースの位置と速度ベクトルを使用して、ネットワークを介してbullet_shot
のようなイベントを送信するだけです。