2022/11/05(土) [n年前の日記]
#2 [tic80][ruby] TIC-80 + Rubyのサンプルを書き直してみた
_昨日、
TIC-80 1.0.2164 + Ruby (mruby 3.0) で class を使ったサンプルを書いてみたものの、処理内容的に class を使ってる意味が薄いなと思えてきた。
ここはやはり、一つ一つのオブジェクトが勝手気ままに動いてるほうがそれっぽいかなと思えてきたので、そのようなサンプルに書き直してみた。環境は Windows10 x64 21H2 + TIC-80 1.0.2164。
書き直したと言っても、作ったのはいつものアレだけど。ボールが画面内を跳ね回るソレ。
処理としてはショボいけど、複数のオブジェクトが別々に動く様子を一応実装していると言えるわけで…。この手のサンプルが動いた/書けたなら、その環境上でリアルタイムアクション系ゲームも作れそうだと容易に予想できるはず。そう考えると、これもまた Hello World の一種なのかもしれない。
ここはやはり、一つ一つのオブジェクトが勝手気ままに動いてるほうがそれっぽいかなと思えてきたので、そのようなサンプルに書き直してみた。環境は Windows10 x64 21H2 + TIC-80 1.0.2164。
書き直したと言っても、作ったのはいつものアレだけど。ボールが画面内を跳ね回るソレ。
処理としてはショボいけど、複数のオブジェクトが別々に動く様子を一応実装していると言えるわけで…。この手のサンプルが動いた/書けたなら、その環境上でリアルタイムアクション系ゲームも作れそうだと容易に予想できるはず。そう考えると、これもまた Hello World の一種なのかもしれない。
◎ ソース。 :
ソースは以下。
_moveball.rb
使用画像は以下。
_tiles2.png
TIC-80 のタイル画像領域にインポートするには、コンソール上で以下を打つ。
_moveball.rb
# script: ruby class Ball def initialize(x, y, scrw, scrh) @id = 1+2*(rand*6).to_i @x = x @y = y @scrw = scrw @scrh = scrh ang = rand(360) spd = 0.4 * scrw / 60.0 a = ang * Math::PI / 180.0 @dx = spd * Math.cos(a) @dy = spd * Math.sin(a) end def update @x += @dx @y += @dy @dx *= -1 if (@x <= 0 or @x >= @scrw - 16) @dy *= -1 if (@y <= 0 or @y >= @scrh - 16) end def draw spr @id,@x,@y,0,1,0,0,2,2 end end $scrw, $scrh = 240, 136 $t = 0 # init objs $objs = [] n = 80 n.times do |i| o = Ball.new($scrw/2, $scrh/2, $scrw, $scrh) $objs.push(o) end # main loop def TIC # update $objs.each {|o| o.update} # draw cls 0 $objs.each_with_index {|o,i| o.draw} print "mruby: #{RUBY_VERSION}",4,8*1,12 print "count: #{$t}",4,8*2,12 print ($t.div(60)).to_s+" sec",4,8*3,12 $t+=1 end
使用画像は以下。
TIC-80 のタイル画像領域にインポートするには、コンソール上で以下を打つ。
import tiles tiles2.png
◎ 少し解説。 :
Ruby (mruby) の仕様について、分かった範囲でメモ。
TIC-80側の仕様について。タイル画像をpng画像としてエクスポートしたい時は以下を打つ。
逆に、インポートしたい時は以下。
エクスポートされた画像を使い慣れたドットエディタで修正してからインポートすれば、作業が楽になるかもしれない。
- 疑似乱数は、rand で得ることができる。0.0以上、1.0未満の実数を返すらしい。
- rand(整数) と書けば、0 - (整数 - 1) の疑似乱数を返す。
- 三角関数 sin, cos は、Math.sin()、Math.cos() と書く。
- 円周率πは、Math::PI と書く。
- 度をラジアンに変換する関数は、どうやら無いっぽい。たぶん。
- 配列の初期化は、objs = [] のように書く。
- 配列に要素を追加するには、objs.push() を使う。
- 配列を使ってループするには、objs.each {|o| ... } や objs.each do |o| ... end のように書く。
- 回数を指定してループするには、10.times do |i| ... end のように書く。この場合、i には 0 から 9 まで入る。
- クラスのインスタンス変数は、@id のように @ を先頭につける。
- 数値を文字列にするには .to_s をつける。10.to_s とか。
- 実数や文字列を整数にするには、.to_i をつける。10.0.to_i とか。"10".to_i とか。
- 文字列の中に変数を展開するには、#{} を使う。print "x, y = #{x},#{y}" みたいな感じ。
TIC-80側の仕様について。タイル画像をpng画像としてエクスポートしたい時は以下を打つ。
export tiles hoge.png
逆に、インポートしたい時は以下。
import tiles hoge.png
エクスポートされた画像を使い慣れたドットエディタで修正してからインポートすれば、作業が楽になるかもしれない。
[ ツッコむ ]
以上です。