DMS


開発環境:Win7 & 8.1 + Visual Studio 2015, 17, Eclipse CDT
使用言語:C/C++ + DXライブラリ + WinSock1, 2 + BSDSocket


はい、2次創作です。すみません。
あと、このゲームは今からちょうど1年半前に開発を開始して、そこから5ヶ月で完成まで持って行った作品です。なぜ今になって掘り出して書いているかと言いますと、完成させてから1年が経過して、自分の中で整理できたからです。

システム的にはShadowverseとかHearthstoneとかWAR OF BRAINSとかと同じだと思います。オンライン対戦ゲームはボクの能力の限界を超えていたようで、今見ると酷いコードがたっくさんあります。

まず、オンライン部分の開発は後回しにしました。オフラインで動く部分を全部作りきってから、TCP/IPの勉強を開始した程です。具体的にはデッキを作成/編集して、テキストファイルへ保存する部分です。これは単純に各カードに一意のIDを与え、識別し、エディタ(ゲーム内の)からドラッグアンドドロップでデッキリストへ追加するというものです。
no title


で、保存ボタンが押された時にテキストファイルへそのIDを出力します。
ゲームを起動するとそのテキストファイルからIDを読み込んでデッキリストを生成するのです。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

オンライン部分なんですけど、当初は自宅にサーバーとしてデスクトップを立てて、クライアントのアクセスをそこで受け止め、IPアドレスを交換しあってました。
……のですが、火事が怖いのですぐレンタルVPSへ切り替えました。
さくらVPSを借りて、そこでIPアドレスを交換するマッチングサーバー(プログラム)を動かしていたのですが、HTTPで通信するように書けばさくらサーバーでも運用できたのかもしれません。詳しくは知りませんけど。

マッチングはUDPで行い、IPアドレスを交換した後はTCPで通信していました。ですが、マッチングもTCPでやるべきだったと反省しています。UDPでやる意味がないです。
あと、クライアントプログラムが今見ると本当に酷いです。
WSAWaitForMultipleEventsとWSAEnumNetworkEventsを両立していると言えばその酷さが分かるでしょう。エラー処理もぐちゃぐちゃだし、connectのブロッキングは回避していないしで、書き直す気力も起こりません。
最近WinSockの勉強をやり直してやっとこさきれいなプログラムが書けるようになりました。
絶対に挫折させないWinSock

でもTCPはレコード境界を作らないので、その辺りの処理をプログラマが実装しなきゃいけないのがなんとも面倒くさいというか、レコード境界付きTCPを誰か作ってください。20年待ちます。

あ、あと、WinSockもBSDSocketも中身はほとんど同じなので、参考書の中身が大分被ります。違う部分の方が少ないので学習は楽です。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
カードの効果は……
とりあえずボクは毎フレーム毎にバトルゾーンのカードが効果を発揮していないか確認していましたが、今思えば無駄だったと思います。プレイヤーがアクションを起こした後に1度だけ確認すればよいですね。

カードの情報を保持するクラスを作成して、他のクラスのメンバとして使用していました。例えばデッキクラスから生成されるデッキオブジェクトの実態はカードオブジェクトの配列です。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
グラフィカルじゃないよね……?
はい。DXライブラリを使うのはこれが初めてで……というかそもそも画像の表示とSEの再生にしか使ってないです。

なので演出の凝り方とかよくわかんないです。
でもアニメーションの再生は分かりました。フレームを確保する関数を書いて、その関数へ渡したフレームの間は他の関数の処理を止めればよいのです。
これを利用して呪文を発動した時だけはちょっとだけかっこよく表示されるようにしています。
(51秒目から)


というか当時は数学もIとIIをやった位で、その上なにもかも忘れていたので、画像の斜め移動とかはやっつけで書きました。sinとかcosとかにラジアンすら渡してません。適当に数値を代入して、1時間位掛けて目当ての方角へ移動する値を見つけてはそれを保存しておくという、他のプログラマが見たらドン引きするような手法をしていました。

だってこの為だけに数学やりたくなかったんですもん。時間もありませんでしたし。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
まとめ

すごく楽しかったけど大変でした。
もうオンラインゲームは作りたくないです。考えることがたくさんありますから。
でもまた作りたくなってるんですよね。もし次作るとしたらオリジナルのカードゲームにしようと思います。やっぱり2次創作は精神的に辛いです。