mieki256's diary



2013/12/23(月) [n年前の日記]

#2 [dxruby][game] DXRubyで地形アタリを取りながらプレイヤーキャラの移動

昨日アップロードしたクラスを使って、プレイヤーキャラの移動をやってみようかなと。

とりあえず、横移動と、足元に床が無かったら落下する、だけの処理を書いてみました。

playermove1.rb
# プレイヤーキャラを動かしてみるサンプルその1
# 横移動、床補正、落下処理だけの版

require 'dxruby'
require 'tmx'
require_relative 'dxrbtmx'
require_relative 'bgatari'

# 画像読み込み
pimg = Image.loadTiles("player.png", 640/80, 640/80)
bgimg = Image.loadTiles("bg_attari.png", 256/16, 256/16)

# tmx読み込み
scrw, scrh = Window.width, Window.height
tmx = DxrbTmx.new("./bg_atari_test.tmx", scrw, scrh)

# Bgレイヤーマップデータ取得
atari_layer = tmx.get_layer("bg_atari")
bg_layer0 = tmx.get_layer("layer0")
bg_layer1 = tmx.get_layer("layer1")
bg_layer2 = tmx.get_layer("layer2")
bg_layer3 = tmx.get_layer("layer3")

bgtw, bgth = tmx.screenwidth, tmx.screenheight

# BGアタリテーブル作成
bgatari = BgAtari.new(bgimg, atari_layer, scrw, scrh, 0, 22, 30)

# カーソル描画用メソッド
def draw_cursor(x, y, col)
  w = 2
  Window.drawLine(x - w, y, x + w, y, col)
  Window.drawLine(x, y - w, x, y + (w + 1), col)
end

bx, by = 0, 0
px, py = scrw / 2, scrh / 2
dx, dy = 0, 0
gravity = 0.45
pimgnum = 16

# メインループ
Window.loop do
  break if Input.keyPush?(K_ESCAPE)

  # プレイヤー移動処理

  # 左右キーで横移動
  # x速度に、キー入力に応じて加速度を加算
  dx += Input.x * 0.2

  # 横方向の最大速度を超えないようにする
  spdmax = 6.0
  dx = spdmax if dx >= spdmax
  dx = -spdmax if dx < -spdmax

  # 左右キーを押してなければ、速度を減らしていく
  dx *= 0.95 if Input.x == 0

  # 速度を加算
  px += dx
  py += dy

  # 床アタリで補正する
  if pimgnum == 16
    # 落下中
    yadd = 0
  else
    # 床の上に居る
    # 足元よりちょっと下の座標でアタリを取る
    yadd = 16
  end
  nx, ny = bgatari.adjust_bg_hit(px, py + yadd, BgAtari::ADJUST_UP)

  if nx == nil
    # 足元に床が無い
    dy += gravity # 重力加速度を、速度に加算
    pimgnum = 16 # 落下ポーズに変更
  else
    # 足元に床がある
    py = ny
    dy = 0 # y速度を0にする
    pimgnum = 0 # 床の上に居るポーズに変更
  end

  # プレイヤー移動処理ここまで

  # プレイヤーの位置から、BGスクロール座標を決定
  bx += ((px.to_i - (scrw / 2) - bx) * 0.2).to_i
  by += ((py.to_i - (scrh / 2) - by) * 0.2).to_i

  # BG描画
  Window.drawTile(0, 0, bg_layer3, bgimg, bx / 8, by / 8, bgtw, bgth)
  Window.drawTile(0, 0, bg_layer2, bgimg, bx / 4, by / 4, bgtw, bgth)
  Window.drawTile(0, 0, bg_layer1, bgimg, bx / 2, by / 2, bgtw, bgth)
  Window.drawTile(0, 0, bg_layer0, bgimg, bx, by, bgtw, bgth)

  # プレイヤー描画
  x = px - bx
  y = py - by
  img = pimg[pimgnum]
  Window.draw(x - 40, y - 68, img)

  # プレイヤー座標にカーソルを描画
  draw_cursor(x, y, C_RED)
end
_playermove1.rb.txt

プレイヤーキャラの移動の様子その1

BGアタリ(地形アタリ)で座標補正してるから、ちゃんと床の上をするすると動いているように見えますな。

しかし…。GIFアニメの後半、どんどん怪しい動作に…。

結局、床で座標補正しかしてない状態だと、一度壁の中にめり込んだが最後、こんなことになるわけですね。市販ゲームでもこういうバグを、(稀だろうとは思いますが) 目撃してしまった人も居るのではないかと。

ということで、こんなヒドイことにならないように、明日は、壁で補正する処理も入れてみたいと思います。

実験用に、プレイヤーキャラ用画像も置いときますね。Public Domain ってことで。

プレイヤーキャラ画像
画像サイズは640x640ドット、1パターン80x80ドット、8x8個のパターン入り、です。ってパターン入ってない隙間がたくさんあるけど。

GPU側の都合としては、256x256、512x512、1024x1024といった、キリのいい画像サイズ(テクスチャサイズ)のほうが良いのでしょうな…。

2013/12/24追記。 :

実験用のプレイヤーキャラ画像を、画像サイズ512x256ドット、1パターン64x64ドットに描き直してみたので置いときます。Public Domain ってことで。
プレイヤーキャラ画像、64x64ドット版

以上です。

過去ログ表示

Prev - 2013/12 - 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 31

カテゴリで表示

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


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

Powered by hns-2.19.6, HyperNikkiSystem Project