FC2ブログ

ARGENTO CUORE

Category : ゲーム制作

--.--.--[--] スポンサーサイト

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

2010.03.08[月] サーバープログラミング

ネットワークゲーム制作に役立ちそう?なの。

MMORPGゲームサーバープログラミング
ロブロブラボ
flipcode.com Network game programming

Developer's Guide to Multiplayer Games

ロブロブラボさんの前テストしていたMMORPGは遊んだことがある(5分くらい)。まじでこれ一人で作ったの!?みたいなすごさでした。

作ってるサーバー部分は、

ログイン
 ↓
ロビー → ログアウト
↓ ↑
ルーム → ログアウト

でよいのかな。うん、良いだろうきっと(爆)

ロビーはログイン人数に応じてThreadを走らせるようにして、ルームも1つ1つ別個のThreadを走らせるようにしてる……けど、UNIXプロセスの1つとして立ち上げたほうが、一個がこけても大丈夫になる? どっちでも変わらない?
JavaのThreadがどんな実装になってるのか、今まで知らずに生きてきてごめんなさい。

こっちがよいかなー あっちがよいかなーと迷いの森を疾走中。
わからないことばかり。

3歳からはじめるネットワークゲームサーバープログラミング for Java

とか出ないかなー。
今のところ最大30人くらいまで1つのルームに接続できるようにと考えてる。
データ送受信は、1フレーム内に送受信が終わるようにできるのが理想?なのかもしれないけどそんなの無理なので、チャットは発言時即送受信、その他の操作、状態の変化は1秒に1回まとめて行うようにする方針。会話以外で即座に反映されなければならない情報はない(と思う)ので、これで良いかな。
どちらにしろ、混雑時というか、遅い回線のときにどれくらいヤバくなるのかを実験したい。

回線状態をシミュレートしたりとかできないだろうか?
意図的に負荷をかけたい。

ところでJavaのマスコット「Duke」は可愛すぎると思う。鼻をもふもふしたい。UFOキャッチャーの中に棲息することになったりしないだろうか?



スポンサーサイト

2009.12.13[日] ビットマップフォント用BMP出力プログラム

require 'sdl'

WIN_W = ARGV[0].to_i
WIN_H = ARGV[1].to_i
FONT_WIDTH = ARGV[3].to_i
FONT_HEIGHT = ARGV[4].to_i

SDL::TTF.init
SDL.init(SDL::INIT_EVERYTHING)
screen = SDL.set_video_mode(WIN_W,WIN_H,8,SDL::SWSURFACE)

font = SDL::TTF.open(ARGV[2],FONT_WIDTH,0)

$x=0
$y=0
def draw_code(first,last,font,screen)
 x = $x
 y = $y
 first.upto(last) do |uc|
  str = [uc].pack('U')
  font.draw_solid_utf8(screen,str,x,y,255,255,255)
  if x == WIN_W-FONT_WIDTH then
   x = 0
   y = y + FONT_HEIGHT
  else
   x = x + FONT_WIDTH
  end
 end
 $x = x
 $y = y
end

draw_code(ARGV[5].to_i(16).to_i,ARGV[6].to_i(16),font,screen)
screen.update_rect(0,0,WIN_W,WIN_H)
screen.save_bmp(ARGV[5])
loop do
 while event=SDL::Event2.poll
  case event
  when SDL::Event2::Quit
   exit
  end
 end
end

2009.12.12[土] ビットマップフォント表示

他のライブラリに依存していると、それがダイナミックリンクの場合、単にゲームで遊びたいだけなのによくわからないパッケージをインストールしなきゃいけなくなるっていうのは嫌だなぁーと思って、できるだけ外部ライブラリを使わずにしたいと思う今日この頃。

今作っているゲーム+ゲームライブラリは、SDLのみで動くようにしたいと思ってます。
実際には実行時にRubyが必要になるから敷居が高いかも……。
配布時にRubyを同梱するのは良いのかな? rubyスクリプトからexe形式の実行ファイルを作成できるプログラムもあったので、それを使う+SDL.dllを同梱が一番かなぁ……。
でも、Linuxで開発してるから、Windowsに今のままもっていったら不具合出そう……。


で、ビットマップフォントを少し表示していたけれど、漢字まで対応しました。
当初の予定?では、あらかじめ他のファイル(テキスト)に使用する漢字を書いておいて、実行時にそこから必要な文字を取得&ビットマップデータから取り出してきて表示するという流れにしようかなと思っていたけれど、わざわざ使う前に書くのも面倒だし、パソコンたくさんメモリあるし、全部読み込んでおこうと思い、UTF-8のお勉強からはじめることにしました。

以下、日本語+英語表示に必要そうな部分だけ一覧

[格納ファイル] -> コード範囲 - 言語地域:文字種(補足)
font4x8 -> 0020~007F - ヨーロッパ:基本ラテン文字(アルファベット)
font4x8 -> FF66~FF9F - 記号・句読点:全角・半角形(半角片仮名)

font2.bmp -> 0080~00FF - ヨーロッパ:ラテン1追加
font2.bmp -> 2000~206F - 記号・句読点:一般句読点

※font3.bmpは3000~FAFFまで連続して格納している
font3.bmp -> 3000~303F - 東アジア:CJKの記号及び句読点(かぎ括弧その他)
font3.bmp -> 3040~309F - 東アジア:平仮名
font3.bmp -> 30A0~30FF - 東アジア:片仮名
font3.bmp -> 31C0~31EF - 東アジア:CJK字画
font3.bmp -> 3300~33FF - 東アジア:CJK互換用文字(各種単位、元号、日付等)
font3.bmp -> 4E00~9FFF - 東アジア:CJK統合漢字
font3.bmp -> F900~FAFF - 東アジア:CJK互換漢字

font4.bmp -> FF00~FF65 - 記号・句読点:半角・全角形(全角英数、半角片仮名)

こういう感じで、半角のもの、記号1、日本語、記号2という4つのビットマップファイルを作成し、
それぞれをバッファに読み込んでおいて、表示時にとってくるという形にしました。
美咲フォントで出力した場合、漢字などが穴ぼこだらけですが、あんまりたぶん使わない漢字だからないんだろうなーと思って気にしない。

ビットマップ出力スクリプトはRuby/sdlで書きました。SDLのサーフェス保存メソッドを使ったので楽~。
コードは以下のような感じに。firstとlastに表示する文字のコードの最初と終わりを渡します。

~省略~
16 def draw(first,last,font,screen)
17 x = $x
18 y = $y
19 first.upto(last) do |uc|
20 str = [uc].pack('U')
21 puts uc.to_s(16)
22 font.draw_solid_utf8(screen,str,x,y,255,255,255)
23 if x == WIN_W-FONT_WIDTH then
24 x = 0
25 y = y + FONT_HEIGHT
26 else
27 if uc.between?(0x0020,0x007F) or uc.between?(0xFF66,0xFF9F) then
28 x = x + FONT_WIDTH/2
29 else
30 x = x + FONT_WIDTH
31 end
32 end
33 end
34 $x = x
35 $y = y
36 end
~省略~

表示時には、
<初期化>
できたビットマップフォントを読み込み、文字をキーとして渡すハッシュを作成して、その中にビットマップ中の対象文字のX、Y座標データを格納
<描画>
渡された文字をキーとして初期化時に作ったハッシュへと渡し、指定された座標のビットマップ情報を取得。表示サーフェスへと転送

という感じにしてます。
とりあえず表示ー。
フォント表示。試しに実行
FPS50なのは気にしない(ぁ

2009.12.04[金] SDLとRubyとゲーム制作と

RubyにはC言語で作成した拡張ライブラリを呼び出す機能があるので、それを初お試し。
久々にC言語書くと、とても面倒だと感じてしまいます。

Ruby/SDL。それは面倒なCとおさらばして、Rubyでハッピーな毎日を送れる魔法の図書館。
でも遡ること数日前、Ruby/SDLのバージョン2.x系じゃない&パッケージマネージャにも落ちてない事実が発覚。
なんでメソッドないって言われるのかなーと小一時間……。

このパッケージにはこれが必要で~とか、Ruby1.9だとこの問題(※1)があって~とか、ソースからインストールするのは絶対嫌だなーとか、色々面倒そうだったので、更に面倒な道を歩くことにしました。

※1 Ruby1.9は、コードの最初に#coding: 文字コード名と書いておくと、マルチバイトキャラクターのエラーが出なくなった……すごく悩んだ……。

・Ruby/SDLじゃなくて俺的Rubyライブラリ/SDLを作ろう?
・まずはRuby拡張ライブラリを作り方を学ばねば(http://zinnia.dyndns.org/~cvsweb/sdldoc-jp/index.html)
・SDLもおさらい(http://www.tacoworks.jp/software/SDLdoc-jp/html/)
・よし、がんばろー。

で、今こんな感じ……。

KAGUYA(ライブラリ未満)

SDLの関数と対応するラッパーライブラリというよりは、ゲーム作るときにこれ定形化できるよねっていうところだけを作っていって、あとは便利(無駄+馬鹿※2)機能を思いつくままに載せていこうという感じで進んでおります。

※2 自分が作るゲームは8bitカラーで問題ないと思ったので、8bit固定でパレット管理機能加えたりetc...

できたのは、
・画面作成
・スクリーンバッファ作成
・パレットスイッチ(じゃかじゃか切り替えると雰囲気変わって楽しそう)
・FPS固定
・キー入力
・ビットマップフォント表示(美咲フォントを使わせてもらってますが、漢字は多くて面倒なので一気に初期化せず、必要に応じて読み込んでフォントマップを保持しておく感じに(個人的メモ))
・3次元の座標計算(透視投影とか陰線処理はまだのワイヤーフレーム)

3次元は、今までOpenGLとかしか触ったことなかったので、1から実装するのは初めて……。ちゃんとできるか心配です+ハードウェア支援受けられないので低速。でも、SDLの描画機能を使ってるので3次元グラフィックスもBlit転送で最終的にスクリーンに出してます(自己満……)。

忘れないように方向性(実装したいもの)メモ
・タイル管理
 8x8pxのイメージデータ管理機能+BG、スプライトへのインターフェース

・ソフトウェアBGレイヤー
 最大サイズ=スクリーンサイズ。何枚でも作成可能(物理的な限界が来ない限り)。プライオリティによる表示優先度指定

・ソフトウェアスプライト
 8x8px。回転拡大縮小アニメーション、プライオリティ
 
・擬似GUI
 ウインドウ、ボタンなどをあるフォーマットに沿ったイメージデータを読み込むことで(なければラインで描画)、好きなデザインのウインドウ、ボタンなどを簡単に作れるようにする。

・キー、ジョイパッド、その他設定の制御
 コンフィグフォーマットのバイナリを読み込んで、データに沿った設定で初期化を行う。
 汎用的に使えるようにする。
 キーコンフィグのインターフェースを用意して、APIを叩くだけで設定が変更されるので、使う側はインターフェースだけ作れば良いとかいう妄想。

・ワイヤーフレームの陰線処理、面付け、テクスチャ
 スキニングとかはなんだか大変そうなので、今のところ考えないことにしました……。

・データ暗号化
 必要ないかもしれない。

・衝突判定、重なり判定とか各種お役立ち処理
・画面切り替わりエフェクト(いっぱいつくろー)
・サウンド

・ゲーム処理的なもの
 シーン管理

・ぼやき
 呪文はキーボードから入力させたい今日この頃です(プレイヤーが忘れたら、もう使えない。スペル間違えると、何が起こるかわからない)。

あとは、Android上で動かしてみたいからできるだけ軽くCPU使わないようにメモリ使わないように……。

Scala Feed

scala feed

FC2カウンター

プロフィール

RoNor

Author:RoNor
得意呪文はScalaですって言えるようになるのが夢です。
デスマーチ中、パーティメンバーの防御力を向上させたりさせなかったり。

検索フォーム

QRコード

QRコード

Copyright © 2009-2010 ARGENTO CUORE and RoNor All rights reserved.

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