スポンサーサイト

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

地図の描画方法変更

ver.1.22.1で地図の描画方法を大幅に変更しました。

初期バージョン
・街名、海域名などが元から合成された地図を使用
・海域変動をリアルタイムに合成

ver.1.20以降
・街名、海域名などを地図から分離
・街名、海域名、海域変動等をリアルタイムに合成

ver.1.22.1
2種類の描画方法があります。
1.街名等を等倍表示にする
 ・海域変動を地図と必要なタイミングで合成して保持
 ・街名、海域名等をリアルタイムに合成
2.街名等を等倍表示にしない
 ・街名、海域名、海域変動等と地図を必要なタイミングで合成して保持
 ・保持しておいた地図を描画時に使用

2.の方法は初期バージョンに近く、描画負荷が少なくなっています。
また、海域変動を街名などより先に合成するため、海域変動により文字が
青っぽくなったり赤っぽくなったりすることがありません。

描画イメージ(全て地図150%表示)
・初期バージョン
初期バージョン

・ver.1.22.1
1.街名等を等倍表示にする
ver1.22.1その1

2.街名等を等倍表示にしない
ver1.22.1その2

テーマ : 大航海時代Online - ジャンル : オンラインゲーム

ナビゲーションクライアント

ナビゲーションクライアント

オリジナル交易Mapにある DOL画面キャプチャミニツール の機能を実現するため、
ナビゲーションクライアントを作成しました。

ナビゲーションクライアントを使用することによって大航海時代Onlineを実行しているPCで得た情報をローカルネットワークで接続されたPCで実行している交易MapC#に送ることができます。

ナビゲーションクライアントがクライアント、交易MapC#がサーバとして動作します。
通信はTCPで行われ、ポートを開きます。
ネットワークのセキュリティに注意が必要です。
交易MapC#は以下の情報をナビゲーションクライアントから得ます。
・航海日数
・測量位置
・コンパスの角度
・利息の有無
・災害
・海域変動


設定方法

交易MapC#
交易MapC#設定

・交易MapC#の設定ダイアログから画面キャプチャ、ログ解析設定を開きます。
・TCPサーバモードにします。
・ポート番号の下にホスト名とIPアドレスが表示されているのでメモします。
・OKを押して設定ダイアログを閉じます。
・交易MapC#の右下に TCP SERVER と表示されます。
 サーバはポートを開きます。
 ウイルス対策ソフトによってはブロックされる可能性があります。
 マウスカーソルを TCP SERVER 上に持っていくとポップアップします。
 以下のようになればサーバ起動成功です。

接続待ち



ナビゲーションクライアント
接続設定

・ナビゲーションクライアントの接続...ボタンをクリックして接続設定ダイアログを開きます。
・接続先に先程メモしたIPアドレス、またはホスト名を入力します。
 ホスト名を指定すればDHCPによってIPアドレスが変わった場合でも接続できます。
・接続ボタンをクリックすると交易MapC#に接続します。
・接続できた場合タスクトレイに入ります。

テーマ : 大航海時代Online - ジャンル : オンラインゲーム

Managed DirectX メモ

ビットマップから切り出してテクスチャを作成
テクスチャはDDSで持つと読み込みが楽ですが、そうでない時用
流れとしては
・Bitmap()で読み込み
・イメージをbyte[]で得る
・テクスチャをUsage.Dynamic、Pool.SystemMemoryで作成
・テクスチャをロックして内容を設定する
・Pool.ManagedもしくはPool.Defaultにテクスチャを作成し、そこに転送する
最終的なテクスチャをPool.Managedにすればデバイスロスト時になにもしなくて済む
テクスチャ転送時にDxt5とかにフォーマット変換することができるが、
そういうテクスチャは元からDDSで持ったほうがいい。

テクスチャをロックして転送するコードは以下のような感じ

public Texture CreateTexture(Device device, ref byte[] image, int stride, Rectangle rect)
{
Texture dst_texture = null;
Size tex_size = new Size(rect.Width, rect.Height);
using(Texture texture = new Texture(device, tex_size.Width, tex_size.Height,
1, Usage.Dynamic, Format.R5G6B5, Pool.SystemMemory) ){
// テクスチャをロック
UInt16[,] buf = (UInt16[,])texture.LockRectangle(typeof(UInt16),
0,
LockFlags.Discard,
m_size.Height, m_size.Width);

// 内容を設定
int index = (stride * rect.Y) + (rect.X * sizeof(UInt16));
for(int y=0; y for(int x=0; x buf[y, x] = (UInt16)((image[index + x*sizeof(UInt16) + 1] << 8)
| (image[index + x*sizeof(UInt16) + 0] << 0));
}
index += stride;
}
texture.UnlockRectangle(0);

// テクスチャを転送
dst_texture = CreateTextureFromTexture(device, texture);
}
return dst_texture;
}

public Texture CreateTextureFromTexture(Device device, Texture src_texture)
{
if(device == null) return null;
if(src_texture == null) return null;

try{
// 同じサイズで同じフォーマットのテクスチャを作成する
SurfaceDescription d = src_texture.GetLevelDescription(0);
Texture dst_texture = new Texture(device, d.Width, d.Height,
1, Usage.None, d.Format, Pool.Managed);

// 単純にコピー
Surface dst = dst_texture.GetSurfaceLevel(0);
Surface src = src_texture.GetSurfaceLevel(0);
SurfaceLoader.FromSurface(dst, src, Filter.None, 0);
dst.Dispose();
src.Dispose();

// 出来上がったテクスチャを返す
return dst_texture;
}catch{
// 失敗
return null;
}
}

テーマ : プログラミング - ジャンル : コンピュータ

海域情報収集

海域情報収集

交易MAP C#のおまけとして 海域情報収集 を作ってみました。
このアプリケーションは
・したらば掲示板の安全海域情報スレッド
・大航海時代オンラインまとめwiki(統括)
から海域情報を取得します。

取得した情報はドラッグ&ドロップで交易MAP C#に反映させることができます。
ドラッグ&ドロップの仕様は以下の通りです。
・フォーマットは DataFormats.Text
・変動状況をクリップボードにコピーボタンを押したときにクリップボードにコピーされる内容そのままを渡す

得られた情報は変動がいつ終了するのかを知る程度な気がしないでもないですが、
プレイするサーバ以外の変動状況を眺めてニヤニヤしたりできるかもしれません。よう分からんけど

新コンパス解析と大航海時代Onlineの船の向きの話

大航海時代Onlineは船の角度を2°刻みで変更することができます。
(少しづつ船の角度を変えながら調査した結果です。現状ほぼ間違いないと思っています)

この結果から512段階の角度解析から360段階の角度解析に変更し、
最終的に180段階の角度を求めるように調整されました。
360段階で角度を求めた後180段階に落とし込むことで、コンパス解析の誤差を吸収しています。

この調整により、以前のようにコンパスの線よりも少し下に到着するというような誤差はなくなり、
正確にコンパスの線が指す位置に到着できるようになりました。


大航海時代Onlineの船の向きまとめ
・船の角度は2°刻みで変更でき、1周180段階である
・船は0°(真北)に向くことができず、358°から右に少し角度を変えた場合は2°になる

テーマ : 大航海時代Online - ジャンル : オンラインゲーム

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