#!ruby -Ks # -*- mode: ruby; encoding: sjis -*- # Last updated: <2013/12/24 06:15:17 +0900> # # プレイヤーキャラを動かしてみるサンプルその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 # 床アタリで補正する(あえて、バグを再現) # 足元しか見ないとどうなるかな…? yadd = 1 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