[Rails]ShootingStar
すごく気になってきた。もしかしたら激しく使えるかも。
ちょっと試してみた。あれ動かない。よく調べてないからセットアップを間違ってるんだろうな。
[dan@] $ shooting_star start -d [~/c/2007/0619/jewel] /home/dan/local/ruby/lib/ruby/gems/1.8/gems/shooting_star-2.0.2/bin/../lib/shooting_star.rb:71:in `run': Function not implemented (RuntimeError) from /home/dan/local/ruby/lib/ruby/gems/1.8/gems/shooting_star-2.0.2/bin/../lib/shooting_star.rb:71:in `start' from /home/dan/local/ruby/lib/ruby/gems/1.8/gems/shooting_star-2.0.2/bin/shooting_star:61 from /home/dan/local/ruby/bin/shooting_star:16:in `load' from /home/dan/local/ruby/bin/shooting_star:16 /home/dan/local/ruby/lib/ruby/gems/1.8/gems/shooting_star-2.0.2/bin/../lib/shooting_star.rb:65:in `sleep': Interrupt from /home/dan/local/ruby/lib/ruby/gems/1.8/gems/shooting_star-2.0.2/bin/../lib/shooting_star.rb:65:in `start' from /home/dan/local/ruby/lib/ruby/gems/1.8/gems/shooting_star-2.0.2/bin/shooting_star:61 from /home/dan/local/ruby/bin/shooting_star:16:in `load' from /home/dan/local/ruby/bin/shooting_star:16
チャット画面はジェネレートできて、発言を書き込めるんだけど、ブラウザをリロードしないと書き込みが見えない……。
[Rails]rails:freeze:gemsを使ってみる
1.1.6とか古いRailsで開発していたものを 久々に動かそうとRails環境を構築したらRailsのバージョンがあがってて(1.2.3) 起動すると警告メッセージが一杯出ちゃってやばそうなときの対策。
ちなみに自分でコンパイルしたRuby+gemの場合の話。
Rubyとgemを消して入れなおしてから以下を実行。
gem install rails --include-dependencies --version 1.1.6
次にプロジェクトのディレクトリに移動して以下を実行。
rake rails:freeze:gems
これでvendor/rails以下にrails系のライブラリがコピーされる。 アプリ側はこっちを優先的に使うらしい。
railsのバージョンは最新に戻しておく。
gem update rails --include-dependencies
--
もしかしたらわざわざ消さなくてもgemの機能で任意のバージョンに変更できるのかもね。
[アイデア]Webベースの戦闘システム
↑の続き。
たとえばこんなのは?
- ある人と戦闘モードに突入すると一定時間は他者との戦闘が不可能な戦闘モードに入る
- たとえば60分以内に一手を打つ。打たないとノーアクション。(→リアクションをプログラミング)
- 牛歩戦術がいやだから、攻撃は平行して何人にも同時に仕掛けられる。ただし受けはひとりだけ
むむ、思いつきだけど新しい発想だ。さらにパーティ戦ができるようにしないと。 受けをひとりに限定したままだと、ワンピース的展開だな。 離脱と仕掛けを見方同士でうまくやればなんとかなるか?
- 離脱→仕掛け→即攻撃
このコンボはつらい気がする。離脱から次攻撃間に時間的制約を設けるとしたら……
- 離脱→仕掛け→(仕掛けた側は後攻となり、受け者は最大60分間相手のアクションを遅延できる)即攻撃
ん、ちょっと待て。離脱っていつでも 勝手にできちゃまずい。それじゃ逃げ放題だ。スペルカードかな。
- スペルカード『離脱』……戦闘状態を解除する。離脱を行った後は60分間戦闘突入を回避できる
粘着されたら?
- 離脱→ログアウト→一定時間後にログイン→仕掛けられる→離脱→ログアウト→繰り返し→スペルカード切れ→死亡
はまる。まあいいかあ。それがいやなら性格をニュートラルにしろってことで。
- 見せ掛けの戦闘でお友達を守れるよ!
- →ノーアクションが続いたら戦闘解除(これじゃ解決しない)
- →プレイヤー同士で戦闘可能なエリアは一部に制限(現実的)
- NPC はふくろ叩きにしてOK?
- 同時接続者数(戦闘受付数)を自分で設定できるといいのかも
[アイデア]ベース画面のUI
↑の続き。
着眼点を切り替え。viewをデザインしよう。 一番重要なのはキャラクター表示だ。
#/character キャラ0 キャラ1 キャラ2 キャラ3 キャラ4
悩みどころなのが/homeと/characterの使い分け。ホームにキャラクターリストを表示すべきかどうかとか。 プラポケだとホームにキャラ一覧があるからキャラに関してはあれで十分なんだけど、 ホームにキャラを出さずに/characterをキャラ表示のメインにするUIはありえるだろうか。
#/home ・キャラクター一覧
そうだプレイヤーキャラクターだけ表示したらどうだらう。 キャラが複数いてもPCがはっきりするし。うん、そうしよう。 そうだ、PCのアイコンをプレイヤーアイコンにすればいいんだ。
#/home +-----+ name | | lv.job | | hp 8/8 +-----+ mp 2/3 ・キャラクター一覧 ...:青石ああと一個! ...:ログ ...:ログ ...:青石あまってます。レス(1) ...:ログ ...:ログ
あとは戦闘の表現をどうからめるかだな。
- 絡めない。完全別UI
- 全部ここでやる
- その他
うーん。理想的なのはWebのノンリアルタイムなテンポで複数人同時対戦ができちゃうようなシステム。 つまり可能なら全部ここでやるタイプが理想。 戦闘システムの落としどころに悩み始めて早4年。
[開発]jewel-mmoのモデルの複雑なところ
- Ghost …… キャラクターの魂
- Doll …… 憑依する媒体
前に実装しかけたときはこんなモデルがあって、キャラクターがGhostとDollに分かれてたんだけど、 うまくひとつにまとまらないかなあ。 さらにDollの型を決定するCardってのもある。
前に書いたらなんか複雑になっちゃったからもっとすっきりさせたいなあ。
--
プレイヤーは複数のキャラクターを所有するから、これとは別にPlayerというのがあって、さらにUserというのもある。
--
PlayerとUserはしょうがないとしても、キャラクターをすっきりさせたいなあ。
class Character attr_reader :name attr_reader :str, :agi, :mag, :life attr_reader :at, :ac attr_reader :hp, :mp def attack(target) end def special_attack(target) end extend Forwardable def_delegators :@gost, :name end
いや、attackはコントローラかな。
[Ruby]gem install sqlite3-ruby に苦戦したのでメモ
環境
- Linux(Debian)
- Sqlite3 ... apt-get install sqlite3 (sqlite3_3.3.8-1.1_i386.deb)
- Ruby ... 野良ビルド(ruby-1.8.6.tar.gz)
ローカルのユーザ環境にRubyとgemをインストール済み。次に、
gem install sqlite3-ruby
を実行すると次のようなエラー。
Building native extensions. This could take a while... ERROR: While executing gem ... (Gem::Installer::ExtensionBuildError) ERROR: Failed to build gem native extension. ruby extconf.rb install sqlite3-ruby checking for sqlite3.h... no make make: *** `sqlite3_api_wrap.o' に必要なターゲット `ruby.h' を make するルールがありません. 中止. Gem files will remain installed in /home/dan/local/ruby/lib/ruby/gems/1.8/gems/sqlite3-ruby-1.2.1 for inspection. Results logged to /home/dan/local/ruby/lib/ruby/gems/1.8/gems/sqlite3-ruby-1.2.1/ext/sqlite3_api/gem_make.out
インクルードするヘッダのパスを環境変数か何かで教えてやればよさそうなんだけど良くわからないので、 Makefileのあるディレクトリにruby.hとdefines.hを置いてやる。
cd /home/dan/local/ruby/lib/ruby/gems/1.8/gems/sqlite3-ruby-1.2.1/ext/sqlite3_api ln -s /home/dan/local/ruby/lib/ruby/1.8/i686-linux/ruby.h ln -s /home/dan/local/ruby/lib/ruby/1.8/i686-linux/defines.h
すると今後は、
sqlite3_api_wrap.c:1064:21: sqlite3.h: そのようなファイルやディレクトリはありません
といって止まるので、手元の環境は debian だから、
su - apt-get install libsqlite3-dev
を実行。
もう一度 gem install を実行したら無事通った。
gem install activerecord
を実行して下記サイトのサンプルを実行してみる。ちゃんと動いた。
追記(2007/06/19):今日改めてRubyのインストールからやり直したら上記のような問題は起こらず普通に gem install sqlite3-ruby が通った。
[Ruby]メソッド名のコンフリクトの話
メソッド名がコンフリクトすることってあるのかな。 自分の経験ではこれで「ぎゃっ」となったことはないんだよね。 コンクリフトはたぶんありえると思うけど、大事には至らずすぐに原因がわかって問題は解決するんじゃないかな。 そういう心配されるような潜在的な問題があるのなら、さすがに誰か「ぎゃっ」なっているはずだと思うけど、そういった話は一切聞いたことがないから、現実問題深刻な事態にはならないということじゃないかなあ。
誰かが具体的にはまった事例を報告すれば、あーやっぱりあるんだーってことになるんだろうけどね。
宿題
今週は疲れた。もうヘトヘトで今朝は珍しく起きるのが辛かった。
RubyKaigi2007、幸運にもほとんどのセッションを聞くことができた。やっぱりDaveは印象的だった。 (そういえばあのとき荻野さんが控え室に残っているスタッフに「これは聞いてきなさい!」と命令して自分を犠牲にしてスタッフ皆にその機会を与えてくれたんだった。)
Daveは僕らに宿題を与えた。この宿題がとっても大変なもので、まるでこれからのRubyistとしての活動に大きな使命を課せられてしまったかのようだ。 僕はプライベートでも仕事でも毎日Rubyの恩恵にあずかっている。 もうRubyがなくては生活が成り立たないくらいに(それに比べたら僕がRubyに貢献できていることなんてなってちっぽけなことか……)。 これからは一方的にRubyを使うだけじゃなくて、Daveの宿題を考えながら日々過ごしていくことになりそうだな。
SourceForge.jpでSubversionを使う
MyGameをSubversionで公開したいのでSourceForge.jpに初挑戦。
鍵とか一切使ったことがなかったのでかなりはまる。Subversionはシェルからsvnコマンドで使いたいのだけど……。
いちおうできたので以下にまとめておく。
結論
手元の環境(クライアント)で、
ssh-keygen -b 2048 -C (ログイン名)@users.sourceforge.jp -f identity -t rsa
上記を実行するとカレントディレクトリにふたつの鍵ができる。
- identity …… 秘密鍵
- identity.pub …… 公開鍵
これらふたつのファイルを手元のPCの ~/.ssh に置く
次にidentity.pubの中身をSourceForge.jp→「アカウント管理」→「CVS/SVN/SSHで共有する公開鍵」に書き込む。
以下を実行してログイン。
ssh -l (ログイン名) shell.sourceforge.jp
最初は、
Permission denied (publickey).
と出てたけど、2,3分したらつながるようになった。公開鍵がSourceForge.jpに適用されるのにちょっと時間がかかるみたい。 つながったら鍵を作るときに入力したpassphraseを入力するとログインできる。
シェルによるログイン。
ssh -l (ログイン名) shell.sourceforge.jp
リポジトリへのアクセス。
svn mkdir svn+ssh://(ログイン名)@svn.sourceforge.jp/svnroot/(プロジェクト名)/trunk -m "make trunk dir" svn checkout svn+ssh://(ログイン名)@svn.sourceforge.jp/svnroot/(プロジェクト名)/trunk
[MyGame]Ruby/SDLスターターキット
考えてみればMyGameはHPSをオマージュしてきたわけですよ。
- http://dgames.jp/dan/?date=20060413
- http://dgames.jp/dan/?date=20050120#p01
- http://dgames.jp/dan/?date=20040906#p06
yharaさんの発表を聞いて、ということは「Ruby/SDLスターターキット」とMyGameは合体したほうがいいんじゃないかと思うわけですよ。 ということを直接yharaさんに話そうと思ってて忘れてしまった。
質問者にマイクを届ける係りのメモ
当日はかくたにさんよりマイク係を任命されました。 ここでいうマイク係とは発表の後の質疑応答でマイクをいち早く質問者に届ける役目です。 マイク係は初めてですが去年のスタッフ経験もあったのでいちおうマイク係の長をつとめました。 いろいろ気がついた点があるので何かの役に立つかどうかはわかりませんがメモしておきます。
- やってみた感じではとくに難しいことはなかった
- ちょっと難しいのは複数人の方が同時に手をあげたときで、途中から司会者にマイクで質問者を任命してもらうのがよさげだと気づきそうしました
- 司会に仕切ってもらうのが良いと気づいてからは、私は一番前のかどっこにいましたが、質疑応答が始まるとやや中央に移動して司会者の視界にわざと入るようにしました。連携重要ということで
- というわけで司会が質問者を選ぶということをあらかじめ打ち合わせしておけばよかったな、と
- あと、レオさんの通訳(質問者の日本語→スピーカーに英語で)もマイクを通したほうが良かったかも。客席に英語な方もいらっしゃったので
マイク運びに関してはこのようにたいしたことはしてないのですが、一番前の客席をよく見渡せる場所にいることから他にもできることがありました。
- 当日の午前中から結構席が一杯になり、お昼直前にとびら付近に立ち見、階段に座り見する方が10人くらいいらっしゃいました
- ので、途中で空席の多かった関係者を一般に開放し、またなるべく奥の席から詰めて座っていただけるようアナウンスしました
- あと初日から会場が寒いという意見を頂いたので、常時何人かに寒くないか聞いて回り、何度か冷房を弱めてもらいました
- ただ、寒いという人がいても、うちわを使っている方もいたりして難しいです。でも基本的には寒いという意見を優先しました
- LTのときはいろいろばたばたするのでサポートにまわる
あーあと、司会の鈴木さんに一番近いという幸運な(ファンですから)ポジションでもありました。
- 鈴木さん本人は最初とにかく緊張していらっさいましたから、何度も客観的にみて「良い点」をいちいち本人へフィードバックするよう心がけました。特に立ち上がりは
- 司会者はその立場上そこを動けません。ただ発表がおしたときの時間の確認やその他スタッフと緊急連絡が必要な場合があるので、いつでも近くにすぐ呼べる人を置くべきだと思いました
他にも細かいことはいろいろあった気がしますが思い出せるところのメモです。 マイク係はマイクを運ぶとき以外は余裕があるので、会場内の全体のバランスをみたり、不測の事態に備えるという役目を果たすことができますね。
最後に、このような努力を心がけましたが、もちろん至らない点がたくさんあったと思いますので、もしご意見があればアンケートにてご指摘いただけるとうれしいです。
幻のRPG編
予定では実践編の最後にRPGをやるつもりだったのだけど、実践編がちょっと予想以上に長くなって微妙に無理だった。あれだけのゲーム画面があるのだからもう十分すぎるボリュームなわけで。というわけでこの画像が幻のRPG。
サンプルゲームとしては完成しているのでそのうちRubyライセンスで公開するつもりです。MyGameリーリスのアナウンスのときかな。
ちなみに書籍で解説してるサンプルゲーム(ビジュアルノベルを除く)のソースと画像は改変および再配布の可能なライセンスとしました。ビジュアルノベルの女の子だけは別のデザイナさんに描いてもらったのでちょっと事情が違いますが、他の画像はフリーです。
[MyGame]RejectKaigi2007で発表してきました
日本Ruby会議2007と同時開催されたRejectKaigi2007でスピーカーとして発表を行いました。
「Rubyで作ったゲームデモ」発表資料をまとめておきます。
ゲーム画面
デモゲーム補足説明
- Ruby/SDLをラップしたMyGameで実装
- アプリケーションはシンプルなピュアRubyで書かれている
- P3の933(ビデオは貧弱なオンボード)メモリは512Mという5年くらい前のPCでデモしているがサクサク動く
ソース1(驚くほど簡単な画像描画)
require 'mygame/boot' Image.render "sample.bmp"
ソース2(メインループと画像オブジェクト)
require 'mygame/boot' class Punya (略) end bg = Image.new("images/bg_race.png") punyas = Array.new(6) {|i| Punya.new(i) } main_loop do bg.render punyas.each do |punya| punya.update punya.render end end
スライド
MyGame 作者 オレオレ 本題 鈴木さんかわ いいよ鈴木さ ん というわけ で、 本が出ます。 Rubyではじめ るゲームプロ グラミング 7月発売 (たぶん)
※TeraPadで発表しました。
宣伝用パネル
※主に懇親会で使用。
RubyKaigi2007をやってきた
当日のボランティアスタッフとして参加してきた。
コミュニティに参加してきたぞ、という感がすごく残った。 えっとまず自分はRubyが好きで、これはコミュニティとは関係なく、フツーにRubyそのものが大好き。 その次にRubyコミュニティが好きで4年くらい前からできるだけ積極的に参加してきた。その延長で、前回に引き続き今回もスタッフ側の立場からRuby会議に参加したわけだけど、内側からアプローチしたからこそきっと一般の参加者とはまた一味違った雰囲気を感じられたと思う。
それで、感想としては、なんというか、非常にアツい。 アツい人間がいっぱい集まって、それで人間同士が密にひとつの目標に向かってあれこれ行動するという、まあこれはどんなプロジェクトでも必要なことだけれども、うん、でもわれわれの場合Rubyという共有物があるからこういう経験ができるわけだ。 オレにとっては生の人間を最も強く感じる場で、生の人間だけにしんどいこともいっぱいあるし、でも当然そこでしか得られないこともいっぱいあって、うん、とても面白かったです。
Rubyをやっていたからこういう場に触れることができて、それがまた日々のRubyプログラミングにもフォードバックされて……この繰り返し。 コミュニティ、人間同士のふれあい、生きている実感とかそんなものをすごく実感したのでした。
[Ruby]やりたいこと
やっぱりちゃんとやっていることを書かないといかんなあ。ログが残ってないと不便ででしょうがない。
今後やっていきたいのはRubyを使ってゲームを開発を楽にする試み。といってもMyGame(Ruby/SDL)みたいなRubyそのものでゲームを一本作る話じゃなくて、Cペースの組み込みプログラムの中にRubyを組み込む方法を研究したい。たとえばPS3やWiiのゲームプログラムにRubyを組み込んじゃうということ。
こんな風にしてRubyを起動するイメージ。
//test.cpp ruby = new Ruby;
こういうの今のRubyでできるのかな。YARVになったらこういうことが可能になるんじゃないかと想像してたんだけど、まだ調べてません。
で、このRubyオブジェクトはたとえば、NPCの行動アルゴリズムを動かすのに使ったりとか、ゲーム全体のシーン管理に使ったりとか、必要に応じていくつもインスタンスを生成して使うイメージ。RubyスクリプトのレベルではDSL的にプログラムを記述してゆく。処理速度が必要でない場面もたくさんあると思う。組み込みで使うのだからいろいろ厳しさがあるんだけど、Rubyが多少不安定で最悪落ちても大丈夫なようにあらかじめ小刻みに生成・破棄するような使い方を設計しておけばなんとか実用にならないかなあ、とか、どうやったらRubyの利点が引き出せるかなあとか、そんなのをちょっと考えたいです。