Jewel-mmo開発日記

RubyでMMORPGを作る過程を記録する日記。 Yokohama.rb 発起人。
2008-01-24

メインPC死亡

今朝プラポケをリロードしようとしたら、PCが固まってハードディスクからカラカラと乾いた音が。

強制的に電源を落として再起動を試みるが、もうハードディスクが認識されず。数回試したら一度だけWindowsの起動画面が出たんだけど、やっぱりカラカラ言って停止。

以前は何度か似たような現象にあったことがあって数回ハードディスクを交換している。ここ3年くらいは調子が良かったのだけど……。購入時に5年保障をつけておいたので、この3月までは保障が効くはず。今日修理に持っていこうと思う。

中のデータはもうだめだろうな。なくなって困るようなデータはすぐに思い浮かばないけど。あ、ケータイから転送してあった4月以降写真が駄目じゃんorz。他にもいくつかありそうだ……

2008-01-23

tDiaryを最新版に変更

自分でちょこちょこ書き換えてしまうので、今回からはCVS版を使おうと決意。ディスク容量が少ないからcoreを落としてきた。

cvs -z3 -d:pserver:anonymous@tdiary.cvs.sourceforge.net:/cvsroot/tdiary login
cvs -z3 -d:pserver:anonymous@tdiary.cvs.sourceforge.net:/cvsroot/tdiary co -d tdiary core

tdiary/rd_style.rbを新しい環境にコピーする。 index.rbとupdate.rbの先頭行を環境に合わせる。 tdiary.confを書き換える。

プラグインがないようなのでCVSから落としてきてコピー。コピーする場所が間違えているかも。

cp ~/tmp/plugin/amazon.rb misc/plugin
cp ~/tmp/plugin/category.rb misc/plugin
cp ~/tmp/plugin/comment_mail-sendmail.rb misc/plugin
cp ~/tmp/plugin/counter.rb misc/plugin
cp ~/tmp/plugin/image.rb misc/plugin
cp ~/tmp/plugin/makerss.rb misc/plugin

cp ~/tmp/plugin/ja/amazon.rb plugin/ja
cp ~/tmp/plugin/ja/category.rb plugin/ja
cp ~/tmp/plugin/ja/makerss.rb plugin/ja

設定画面にカテゴリとかRSSの設定が現れない。何か間違えているっぽい。 こういうのほんと苦手だ。脳が止まる……。

2008-01-23

書きこみテスト

てすと。

2008-01-22

HSPがオープンソースになってたみたい

http://dev.onionsoft.net/trac/

BSDライセンスとのこと。

svn co http://dev.onionsoft.net/svn/openhsp/

でチェックアウトできる。

2008-01-22

[Ruby]String#[](regexp)

リファレンスマニュアルを読んでて気がついた。

p str[/(foo){2}/] # => "foofoo"

こんなのあったんだ。

2008-01-22

ActionScript 3.0の文字列のコピー

最初の図をみるとRubyとは違うんだね。Rubyだったらひとつの文字列オブジェクトをaとbが指すもの。

2008-01-16

[Ruby]Star Rubyに透視座標変換っぽいのがついたらしい

http://d.hatena.ne.jp/hajimehoshi/20080116/1200435820

仕事が片付いたら遊んでみたいなあ。

2008-01-16

[Ruby]$stdout

putsやprintの出力先を状況に応じて変更したい。 $stdoutを変更すれば、出力先を切り替えることができるらしい。

$stdout = STDOUT
puts "hello"    # 標準出力へ
$stdout = File.open("log.txt", "w")
puts "hello"    # ファイルlog.txtへ

とまあ簡単に切り替えられるわけだけど、いちいちグローバル変数を設定するのが嫌な気がするので、次のようなメソッドを定義したのだけど、もっといいが方法あるのだろうか。

def stdout(out)
  tmp = $stdout
  $stdout = out
  yield
  $stdout = tmp
end
2008-01-15

ActiveScriptRubyのホームページ

2つあります。

  1. http://www.geocities.co.jp/SiliconValley-PaloAlto/9251/ruby/
  2. http://arton.hp.infoseek.co.jp/indexj.html

それぞれ同じページに見えますが、公開しているバージョンが違います。

  1. 1.8.5.2
  2. 1.8.6(111)

2の方が新しいようです。

Rubyの公式ページは1にリンクしています。 るびま(Rubyの歩き方)も1にリンクしています。

今後ActiveScriptRubyを紹介する場合は、どちらのURLを示すべきなのでしょうか?

2008-01-14

中島美嘉

中島美嘉がすごく好き。 声、顔、メイク、髪型、服装、体型が好き。とにかく好きすぎて中島美嘉になりたい。でもなれない。いろいろ考えたけど方法が浮かばない。現代の科学力は無理だとあきらめるしかない。

と、テレビで中島美嘉を見かけるたびにつぶやいていたのだけど、妻からこんな意見が。

「催眠術かけてもらえばいいんじゃない?」

この発想はなかった。でもなんか微妙。

2008-01-14

orbital period

「JUDY AND MARY」が解散してからは、ほしい音楽CDがなくなってしまったのだけど、「BUMP OF CHICKEN」はよく聞いている気がする。

BUMPはインディーズの「THE LIVING DEAD」がすごく好きで当時いくつかのCDを買った。メジャーデビュー後はCDを自分で買ったことはないんだけど、妻が好きだからたぶん家には全部CDがあるんじゃないかな。

最新のアルバム「orbital period」、これ好きかも。

orbital period

2008-01-12

[プラポケ]登録ユーザー数が50人を突破

http://dgames.jp/pockets/

去年の年の瀬に正式リリースしたプラポケですが、昨日登録人数が50人を超えていました。ちなみに5日以内にログインしているアクティブユーザーは25人。なかなかの定着率じゃないでしょうか。

今日から新しいステージが始まりました。 前回のステージの優勝はznzさん。おめでとうございます。

予定通りいくつかの部分を修正しまいした。

  • あるカードのジョブを侍へ変更
  • お守り系アイテムの価格アップ
  • 攻撃訓練系アイテムの価格アップ
  • その他一部のアイテムの価格調整
  • 限定レアアイテムの効果を実装。訓練の成功率をアップ

また今ステージは8日開催となります。次ステージは前回と同じ20日開催の予定です。ステージの優勝者には限定レアアイテムが贈呈されますが、このレアアイテムはステージ終了時のグレードによって変わります。もちろんグレードが高いほど強力なアイテムが送られます。 暫定ですが限定レアアイテムの効果も実装しました。限定アイテムは(今のところ)自然消滅しませんのでご安心ください。

2008-01-11

モード7

http://user.chem.tue.nl/jakvijn/tonc/mode7.htm

を眺めてて思ったけど、そもそもモード7は正方形(または長方形もかな)を単純なルールで変形させることしかできないのかな。そっか、4点の任意頂点変形とはぜんぜん違うんだ。勘違いしていた。

というか頂点変形を使って、擬似的にモード7を実装しているのかと思っていた。

2008-01-11

[Ruby]マリオカートっぽい画面をどうやって実現するかのメモ

昨日の話の続で、座標を3D管理すると何が必要かを考えていたら、コードができたのでメモしておく。久しぶりに3D考えたけど、以前みたいに頭の中で座標系を回せなくなってる(汗)。回転順序とかちょっと迷った。

自分の思いつく限りだと、やっぱり座標に関しては3D処理を真面目にやっちゃうのが、キャラクター制御とかゲームレベルの実装をするときに楽だと思う。 座標を3Dで管理するといっても下のようにそれほど複雑にはならない。

地面に関しては、Ground#renderで計算している地面のスクリーン上の4点座標をテクスチャーに渡して描画したい。

下のカメラは、視点の位置と角度を設定するAPIになっているけど、これは注視点の位置とそこからの距離(と角度)を設定するAPIにしたほうが使いやすい。マリオカートとかだとキャラクターの後ろにカメラが来るので。

class Vector3D < Array
  %w(x y z).each_with_index do |e, i|
    eval "def #{e} ; self[#{i}] ; end"
    eval "def #{e}=a ; self[#{i}] = a ; end"
  end
  %w(+ - * /).each do |e|
    eval "def #{e}d
            Vector3D[self[0] #{e} d[0], self[1] #{e} d[1], self[2] #{e} d[2]]
          end"
  end

  include Math
  def rotate_zyx(angle)
    ax, ay, az = angle
    px, py, pz = x, y, z
    px, py = px * cos(az) - py * sin(az), px * sin(az) + py * cos(az)
    pz, px = pz * cos(ay) - px * sin(ay), pz * sin(ay) + px * cos(ay)
    py, pz = py * cos(ax) - pz * sin(ax), py * sin(ax) + pz * cos(ax)
    Vector3D[px, py, pz]
  end
end

class Camera
  attr_accessor :position, :angle, :scale, :screen_z
  def initialize
    @position = Vector3D[0, -200, -1000]
    @angle = Vector3D[Math::PI / 20, 0, 0]
    @screen_z = 800.0
    @scale = 1.0
  end

  def to_screen(vector3d)
    temp = (vector3d - position).rotate_zyx(angle)
    perse = screen_z / temp.z
    [temp.x * perse + screen.w / 2, temp.y * perse + screen.h / 2, perse * @scale]
  end

  def render(*objects)
    objects.to_a.flatten.each do |e|
      e.view.x, e.view.y, e.view.scale = to_screen(e.position)
      e.render
    end
  end
end

class Character
  attr_accessor :position
  attr_reader :view
  def self.image_resource(fname)
    class_eval "def image_file_name; '#{fname}'; end"
  end

  def initialize
    @view = TransparentImage.new(image_file_name)
    @position = Vector3D[0, 0, 0]
  end

  def update
    @view.update
  end

  def render
    @view.render
  end
end

class Ground
  def initialize(camera)
    @camera = camera
    @tops = [
      Vector3D[-1000, 0, -1000],
      Vector3D[ 1000, 0, -1000],
      Vector3D[ 1000, 0,  1000],
      Vector3D[-1000, 0,  1000],
    ]
  end

  def render
    tops_2d = @tops.map {|top| @camera.to_screen(top) }
    # @view.render ...
  end
end

Ruby/SDLだと拡大縮小が遅くて使い物にならないから、この手の制御はダメだったんだけど、 Star Rubyは拡大縮小が高速らしいので、その辺に期待してる。

2008-01-10

[Ruby]透視座標変換っぽいのができた

http://d.hatena.ne.jp/hajimehoshi/20080109/1199880590

Star Rubyにスーファミのモード7のような機能が付いたという話。Star Rubyについては、今は忙しくて無理だけど、仕事が片付いたら一度は触ってみたいと思っていた。

APIは次のようなものになるらしい。

Texture#render_in_perspective(texture, camera_x, camera_y, camera_angle, distance)

ぱっと見て思ったのは、スーファミのようなゲームの場合、2Dを組み合わせながら擬似的に3Dを体現することになると思うので、座標の管理とか2次元投影のロジックも定型とは違ったオリジナルの実装になることが多いのではないかと思う。 だとすると、2次元投影のパラメータとかこっちで管理したいから、APIにカメラの情報を渡すのではなくて、頂点の座標をダイレクトに指定する、または拡大縮小や回転のパラメータを渡す形のほうがいいのではないかなあということ。2次元変換はこっちで好きにできるように。自分でやるのはちょっと面倒だけど。

既存のAPIだとパースの情報はどうやって与えるのだろう。

2008-01-08

[Ruby]野良ビルドしたirbでカーソルキーが利かない

readlineがらみらしい。 Debianなのでlibreadline5-devを入れて、

apt-get install libreadline5-dev

そのあと、configureしたら利くようになった。

2008-01-08

[Ruby]Array#choiceとArray#shuffle

Ruby1.9.0-0で増減したメソッド一覧を眺めていたら、Array#choiceなるものを発見。

これ前からほしかったやつじゃん! choiceは配列の中のひとつの要素をランダムに取得する。

10.times {
  p [1, 2, 3, 4, 5].choice
}

実行結果

4
2
1
1
5
5
1
4
1
5

shuffleというメソッドも配列に追加されている。 shuffleは配列の要素をシャッフルする、つまり順番をランダムに並び替える。

10.times {
  p [1, 2, 3, 4, 5].shuffle
}

実行結果

[5, 2, 4, 3, 1]
[2, 1, 3, 5, 4]
[3, 5, 4, 2, 1]
[5, 2, 1, 3, 4]
[3, 2, 4, 1, 5]
[1, 4, 2, 5, 3]
[2, 3, 5, 4, 1]
[3, 2, 5, 1, 4]
[5, 2, 1, 4, 3]
[5, 2, 4, 3, 1]

shuffleには、破壊的に動作するshuffle!も用意されている。

2008-01-07

RPGツクール VX のおかげ?

年末年始、「Rubyではじめるゲームプログラミング」のアマゾンでのランキングがいつもより上位にいた(確認した限りの最高ランキングはたしか、Ruby書籍で1位、プログラミング書籍で22位)のだけど、もしかして年末に発売した「RPGツクール VX」のせいなのかな?

RPGツクール VX (Amazon.co.jpオリジナル特典 オリジナルレーベル素材集付き) Rubyではじめるゲームプログラミング—人気の国産言語で、誰でも簡単にゲームが作れる! (I/O BOOKS)(山本 団)

2008-01-04

ナイフメーカー

正月に叔父に会った。父の弟にあたる人なんだけど、ナイフを作っているらしい。話は以前から聞いていたけど、今回ホームページを教えてもらった。 たくさんの作品が紹介されている。

お互いのもの作りの話で盛り上がった。父は技術オンリーで美術には興味のない人だから、ああいう話は新鮮だった。

2008-01-03