スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

綺麗にスッキリコーディング

XNA内でスッキリコーディングする方法を紹介。

記述していてだんだん汚くなる場所。それが更新処理部分Updateだと思います。

大した処理でもないのにフィールド変数を用意し、関数を一個作り、Uptateさせ。。。。etc

そんな時にスッキリさせる方法としてゲームコンポーネントを追加する方法があります。

使い方:
・ソリユーションエクスプローラのプロジェクト名を右クリック→追加→新しい項目
・GameComponentを選択してGameComponent1.csを好きな名前にする
・ゲーム製作のクラスを作ってUpdateさせる感じで適当にコーディング
・元のコードに
GameComponent1 = new GameComponent1(this);
// ゲームクラスのコンポーネント追加
this.Components.Add(this.GameComponent1);

と記述してコンポーネントを追加してやる。(フィールドで宣言してからね)



これでいちいちメインのUpdate内にチマチマした作業を書き込まずに独立させることができる。
いろいろな使い方ができそうだし管理が楽なのが素敵。

ソースがごちゃごちゃしてきた人は是非。




ねよっと
スポンサーサイト

XNA日本語(漢字)表示

日本語表示のサイトはいくつも見つかるのだが、いざチャットをするために日本語表示まわりを弄りだすと不特定の漢字を表示するサンプルが見つからない。

というのも大抵オフゲーを作ることを想定されているせいで自分の用意したプログラムで使用している漢字を調べてそれを使えるようにすればOK

という流れで説明されているのである。

こまった。


コントロール系から作成するのがいいのかもしれないが
・描写速度が悪いらしい
・面倒
・おしゃれな文字を使えない

の三点から却下。

結局、自分で常用漢字を埋め込むことにした。
いつぞやに遊びで作ったFlashのBBSを思い出した。

登録されていない文字をチャットに打ち込んだ場合は*になるという荒業でことを乗り切ることにした。
フォント探しが大変だろうと思ったけど素敵な方々がフリーで結構沢山用意してくれている事を知った。素敵。
ありがたい

第二水準まで用意しているサイトがちらほらあるのだが。。。
手書きフォントだそうだ。
6000文字以上をせっせと手書きしたのだと思うと頭が下がる。
多分ちまちま作業が好きな人なんだろう(失礼)

ねよっと。

チャットが動いた

この間作ったチャットサーバーシステムのクライアント部を作成してみた。

C++でDLLを作成してC#で使っていたのだが、なんとも不細工に見えてきたので全部C#で作り直してみた。

C#でのソケット通信の方法はいろいろあるみたいだけど
using System.Net.Sockets;
using System.Net;

を利用した方法を採用。

ソケットをコネクトしたらBeginReceiveで受信スレッドを別に作成。
一通り受信したら内容を解析して処理。
また次スレッドを作成。

という流れで随時サーバーから受信データを得る仕組みにした。
排他処理にはlockを利用した。
使い方を詳しく調べていないので不安だが
lock(ロックしたいオブジェクト)
{
    ここにロック中の処理
}

としてやれば良いみたいだ。やっぱりC#はスマート。素敵。

っと、思っていたらパケットの作成部分がどうもスマートではない。
チャット文字を含むような可変長のByte配列を作成する場合、無理に構造体を使って作成しようとすると途端にC#らしさがなくなってしまう。
結局頭から長さを指定していくオーソドックス?な形で落ち着くことにした。


チャット自体の仕様は以下の通り。
・大雑把にMAPに大きな区切りを付ける
・自分の周囲1マスの区切りまでのユーザーのチャットは送受信する

といったかんじ。
明日からは区切りの間を移動するユーザーの切り替え処理を作成しようと思う。
同時に大きなMAP(とりあえず2D)を移動するプログラムも作ってテストすることにする。

チャット用途で移動できるMAPを作成するのであれば今回のようなレベルのシステムでどうにかなりそうだけど、リアルタイムなネットワーク対戦となるとUDPを使った高速な通信+予測のアルゴリズムを利用したスムーズなキャラクター描写などを取り入れなければいけない気がしてきた。
正直色々な知識が足りない。(今に始まったことじゃないが



ねよっと。

XNAにWindowsコントロールを取り入れる

チャットシステムを作っているとき日本語入力ができるテキストボックスが無いといろいろ不便だ。
とりあえず簡単にコントロールが読み込めるので方法を記載

まずソリューションエクスプローラでプロジェクト名右クリック>追加>新しい項目>WindowsForm
(名前はここではWinControlにした)

んでもって左のツールボックスから適当にボタンやらコンボボックスやらテキストボックスを選んで配置

フォーム上を右クリックしてコードを表示を選択

そこにまず
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
を追加

んでもって
class WinControlManager
{
GraphicsDeviceManager graphics;
Form XnaForm;
WinControl ControlForm;
public WinControlManager(Game game, GraphicsDeviceManager graphics)
{
ControlForm = new WinControl();
this.graphics = graphics;
XnaForm = Form.FromHandle(game.Window.Handle) as Form;
XnaForm.FormBorderStyle = FormBorderStyle.None;//本来のXNAの枠を無くす
XnaForm.Dock = DockStyle.Fill;//左上で揃える
XnaForm.TopLevel = false;
ControlForm.Controls.Add(XnaForm);//コントロール追加
ControlForm.Show();
}
}

っとクラスを追加してやる
これで準備完了~!

あとは
フィールドに
WinControlManager winControlManager;
コンストラクタに
winControlManager = new WinControlManager(this, graphics);
としてやればOK
例)
GraphicsDeviceManager graphics;
SpriteBatch spriteBatch;
Network network;
WinControlManager winControlManager;
private SpriteFont font; //フォント

public Game1()
{
graphics = new GraphicsDeviceManager(this);
winControlManager = new WinControlManager(this, graphics);
Content.RootDirectory = "Content";
}


めでたしめでたし

gui.jpg

ねよっと。

チャットプログラム

サーバー型の大規模?チャットサーバーシステムが完成した。
しかしクライアントを作っていないので動くかどうかすら試していない。(ぉぃ)

これから作ろうと思っている人のために手順を書いておく。

手順
・XNAプログラムを一回忘れる。
・Linuxをインストールして動かせるようになる。
・ネットワークについてお勉強する。
・グローバルIPを取得して(DDNSでもいいかも)簡単なHP公開くらいまで実験する。
・Linux上で開発ソフトを使えるようにする。(私はNetbeansを使用しました)
・1:1でデータのTCPとUDP送受信をする。(LinuxC言語←→WindowsC++自作DLL+XNA)
・マルチスレッドプログラミングについてお勉強(ミューテックス含む)
・Socket通信のSelectについてお勉強(コスト的にやや不利な仕組みらしい)
・MySQLのインストール。
・MySQLのGUIソフトをインストールして大まかな操作を勉強。
・MySQLをC言語から動的に操作する手順を覚える。
・シグナルについてお勉強。


とりあえず上記の流れでなんとか作れると思います。
結構スムーズに進んでいたのですがMySQLのリンカ設定で嵌りました。
Makefileとか扱ったことなかったし・・・泣。


ねよっと。
プロフィール

あしゅ

Author:あしゅ
ぷぃぷぃ日常。
いつのまにか雑記ブログに。

カテゴリ
最新記事
検索フォーム
最新コメント
リンク
このブログをリンクに追加する
ブロとも申請フォーム

この人とブロともになる

カウンター
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。