2013-01-01から1年間の記事一覧

マリオカートを目指す試練

前回より見た目がしょぼくなったのはご愛嬌。 サンプルのミニレーシングのコースにランダムにSpriteを配置してみた。3D空間の計算式はDirectXに合わせて右に+x、上に+y、奥に+z(修正:奥だった)の左手座標系としてSpriteと地面を統一した。3Dのイメージはそ…

Sprite3Dと頂点シェーダの連携

マリオカート的な画面を作ろうとすると、少なくとも地面の絵は透視座標変換してパースをつけた描画をする必要がある。これをどのように実現するかというのは大きな問題で、いまどきのPCは速いといってもソフトウェアで計算&描画するのは負荷が大きすぎる。…

擬似3D再び

手元のDXRuby1.5.0devにMatrix/VectorとSpriteの追加機能を実装してみたので、昔やってた擬似3Dの計算をするSpriteを作ってみた。 require 'dxruby' class Sprite3D < Sprite attr_accessor :v def self.set_transform(sw, sh, zn, zf) @@view = Matrix.new(…

ベクトルと行列の案

昔っから何度も出ては消えてを繰り返しているネタである。作ってみていまいちなので却下してという話で、動かすだけならすぐにでもできるが、それが扱いやすいかというと微妙になってしまう。 これがなぜ扱いにくいかというと、もともとが数学の道具であって…

画面外判定を作ってみた

こんな感じかなあ・・・。 class Sprite def on_screen?(range = nil) if range == nil if self.target == nil screen = [0, 0, Window.width, Window.height] else screen = [0, 0, self.target.width, self.target.height] end else screen = range end xa…

画面外判定を考える

キャラのオブジェクトを配列で管理しているとして、キャラが画面外に出たときに配列から削除したい場合、以下のようなコードをよく使う。 @objects = @@screen.check(@objects) ここでいう@objectsはオブジェクトの配列で、@@screenは衝突判定範囲を画面サイ…

エミッタ機能追加

なんもないエミッタではちょっと寂しいので、機能を追加してみた。追加してみた、というだけで、名前とか使い勝手とか実装とかはいい加減なのだが、こんなようなことができるといいのかなあ、という雰囲気の提示である。 以下に貼り付けてあるがちょっと長く…

テキトーなそれっぽい例

ものすごいテキトーだけどこんなことができるわけです。

エミッタを考える

パーティクルシステムにおいて、エミッタというのがパーティクルを生成するオブジェクトになるから、これがないと始まらない。が、Rubyで書く場合はユーザが作るクラスで適当にパーティクルを生成してもらえば済むわけで、わざわざエミッタというクラスを用…

Rubyの実行速度を考える

昔はよくこういうことをやっていた記憶がある。 ruby 1.9.3p125 (2012-02-16) [i386-mingw32]にて。そういえばしばらく更新してないから古いね。 require 'benchmark' Benchmark.bm {|x| x.report { 100000.times do Array.new(100) {1} end } x.report { 10…

パーティクルシステムその後

このあいだのコードでは新しい種類のParticleクラスを追加すると、それにあわせてParticleFactoryクラスも追加しなければいけなかったが、これが面倒なのでParticleFactoryは共通にしたくなった。拡張の容易さ重視である。しかしそのかわりにParticle側を作…

ソフトウェアデザインのトリレンマ

国際金融のトリレンマというものがある。 これは(1)為替レートの安定、(2)独立した金融政策、(3)自由な資本移動の3つのすべてを同時に達成することはできず、2つを達成した時点で残りの1つは捨てなければならない、という話だ。 金融政策を独立させて自由な…

パーティクルというもの

しばらくダラダラとツイッターに書いていたのでブログには初登場のパーティクルなのだが。DXRubyに組み込んで簡単に使えるといいなあ、と思っていたのだ。 どういうものかというと、動きのパラメータを定義して、その通りに勝手に動くオブジェクト、という感…

ドラクエ的メニュー

Window.loopとInput.updateをどのようにしようかと考えていたのだが、結局のところこれはこのままでいいのではないかという結論に達した。Window.loopを複数置けるようにするとウィンドウを閉じたときの動作で困ることになるし、1フレーム内にInput.updateを…

Sceneにメインループを置く例

昨日のコードには2つほど問題がある。一つはシーン切り替えのトリガが1フレーム処理の最後にあるところで、まあこれは単純なミスだ。 もう一つは、シーン切り替えの瞬間のみInput.updateが1フレーム中に2回呼ばれるところ。2回呼ぶのはDXRuby的には反則なの…

Sceneクラスがよくわらんという話

いや、理屈はわかる。使い方もわかる。んでも、なんだかいまいちピンとこないと言うか、なじまないと言うか。DXRubyではWindow.loopを基本に作ることになっているが、これはちょっとしたものを極限まで簡単に作れるようにという意図でそうしている。逆に言え…

Cプログラマのための例外講座

例外というものがよくわからない。というCプログラマは多いのではなかろうか(当社調べ)。 言語の機能といえばそうなのだが、少なくとも単純なネイティブコードに落とされるわけではなさそうだ。えらく抽象的な概念なのでいまいちピンとこない。 ということで…