mieki256's diary



2014/06/25(水) [n年前の日記]

#1 [dxruby] DXRubyでラスタースクロールを使ったレースゲームの画面を再現できないか実験してみたり

昔、ラスタースクロールを利用した、レースゲーム・ドライブゲームが結構ありましたけど。例えば、 _ポールポジション とか。 _アウトラン とか。…ラスタースクロールと言うか、ラスター割り込み、水平帰線期間割り込み処理を利用したレースゲーム、と言えばいいのかな。

個人的に、あの仕組み、よく分からんのですよ…。ラスター単位で上手いことやればできるよーと先輩に教えてもらった記憶はあるのだけど、具体的にどういう処理をすればそうなるのか分かってなくて。

気になり始めてググってみたところ、一応、解説ページは見かけたのですが。

_Lou's Pseudo 3d Page
_Code inComplete - How to build a racing game
_Code inComplete - How to build a racing game - straight roads
_Code inComplete - How to build a racing game - curves
_Code inComplete - How to build a racing game - hills
_Code inComplete - How to build a racing game - conclusion

英文ページなので、何が何やら。

とりあえず、まっすぐな道路なら、以下のような仕組みで表現できそうかなと思えたので、DXRuby で実験開始。 *1

raster_drive_ss1.gif

raster_drive_ss2.gif


_raster_drive.rb
require 'dxruby'

font = Font.new(24)

imgs = Image.loadTiles("road_bg.png", 1, 480)
bgimg = Image.load("road_bg.png")

Window.bgcolor = [68, 97, 255]
mode = 0
bz = 0
start_y = 1

Window.loop do
  break if Input.keyPush?(K_ESCAPE)

  # Zキーで描画を変更
  mode = (mode + 1) % 6 if Input.keyPush?(K_Z)

  case mode
  when 0
    Window.draw(-320, 0, bgimg)
    Window.drawFont(4, 4, "BG全体を描画", font)

  when 1
    start_y.step(240-1, 1) { |y|
      i = y
      Window.draw(-320, y + 240, imgs[i])
    }
    Window.drawFont(4, 4, "上半分だけ描画", font)

  when 2
    start_y.step(240-1, 1) { |y|
      i = y + 240
      Window.draw(-320, y + 240, imgs[i])
    }
    Window.drawFont(4, 4, "下半分だけ描画", font)

  when 3
    start_y.step(240-1, 1) { |y|
      i = y + 240 * ((y / 16) & 0x01)
      Window.draw(-320, y + 240, imgs[i])
    }
    Window.drawFont(4, 4, "上と下を、ラスター単位で交互に描画 (一定間隔)", font)

  when 4
    sz = 320
    h = 240
    start_y.step(240-1, 1) { |y|
      z = (h * sz / y) # y座標毎のz値を求める
      i = y + 240 * ((z.to_i / 128) & 0x01)
      Window.draw(-320, y + 240, imgs[i])
    }
    Window.drawFont(4, 4, "上と下を、ラスター単位で交互に描画 (z値に基づく)", font)

  when 5
    sz = 320
    h = 240
    start_y.step(240-1, 1) { |y|
      z = (h * sz / y) + bz
      i = y + 240 * ((z.to_i / 128) & 0x01)
      Window.draw(-320, y + 240, imgs[i])
    }
    Window.drawFont(4, 4, "上と下を、ラスター単位で交互に描画 (z値を加算)", font)
    bz += 8
  end
end
背景画像は以下。

road_bg.png

スクリプトを実行して、Zキーを押していけば描画が変わります。

ちなみに、z値は以下の式で求められます。
h : 視点の高さ
sz : 視点からスクリーンまでの距離
y : スクリーン上のy座標

z = h * sz / y
_Code inComplete - How to build a racing game - straight roads の図が分かりやすい、かもしれず。

さて、ストレートな道路なら、これでなんとかなりそうだけど。カーブや丘は、どう表現すればいいのやら…。
*1: レースゲーム・ドライブゲームと言えば3DCGで表現するのが当たり前になってしまったこの御時勢に、自分は一体何をやってるのかという気もするけれど。仕組みが気になり始めてしまったのだから仕方ない。考えてみたら、30〜40年前の技術、というか工夫なんだよなあ…。

以上です。

過去ログ表示

Prev - 2014/06 - Next
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project