mieki256's diary



2013/12/25(水) [n年前の日記]

#1 [cg_tools][dxruby] EDGEとEDGE2ってファイルの互換性は無かったのね

_あおたくノート - [Ruby][DXRuby] AnimeSpriteを使おう を参考にしながら、EDGE2で保存したアニメファイル(.anm)を読み込んでDXRubyで表示、という実験をしようとしたら、エラーが出てしまって。

EDGE2で保存した anmファイルをエディタで開いてみたら、どう見てもバイナリファイル。テキストファイルの形になってるはずでは…? はてな? どういうこと?

_EDGE2 Ver.0.90 beta006 アップ|TAKABO SOFT に、「EDGEとEDGE2は、ファイル互換性無いっス」と書かれていた。ガーン。

仕方ないので、EDGE をインストールして anmファイルを作ってみたけど。うむ。EDGE2に比べると、EDGE は地味に操作がツラい。 EDGE はフリーソフトだけど、EDGE2 はシェアウェアなので、細かいところで使い勝手が改善されているのだなと再認識。

さておき。EDGE で出力した anm は、たしかにテキストファイルだった。なるほどこれなら簡単に利用できそう。

それにしても、どうして EDGE2 で、わざわざバイナリにしちゃったんだろう…。テキストファイルにしておけば、他のツールとの連携がやりやすくなっただろうに。 _マップエディタの Platinum もそうだったけど、独自データをバイナリ保存しちゃうツールって、どうしても世界が閉じてしまう…。 *1 ファイルを開いて、「あ、テキストファイルだ。これならなんとかなる」と思う場面って、結構多い印象もあるのだけど。

まあ、EDGE2 は EDGE2 で、アニメーションデータを xml でエクスポート/インポートできるので、それでどうにかしなさい、ということなのだろうな…。

でも、これだと、EDGE と EDGE2 が混在してる環境では困りそう。と思ったけど、ビットマップデータを格納しているedgファイル自体は、EDGE → EDGE2 も、EDGE2 → EDGE もOKだった。すると、anmファイルだけは別、という状態なのか…。

EDGEでアニメ作成について。 :

解説ページを参考にしながら作業すればよかったのだなと今頃気付いたり。

_ドット絵描こうZ : アニメーションの作り方
_かんたんGIFアニメアイコン制作講座
_大学生の悩み ロボ太の日記

そういや、Adobe も「Adobe Edge」というツールを出してきちゃったから、ドットエディタのEDGEのほうで検索する時、ちょっと困りますな…。

*1: Platinum は CSV出力できるから、それで助かった記憶もあるけれど。

#2 [xyzzy] xyzzy + complete+.l を動かそうとして四苦八苦

_complete+.l を使ってみようとしたら、C-x C-f を押すだけで、「complete+::*virtual-file-mode* がねえよ」みたいなエラーダイアログが表示される状態に。

netinstaller で virtual-file* を全部と、ffap を入れて、ダンプファイル作り直したら動いてくれた、ような気がする。

でも、complete+ を有効にしておくと、時々 xyzzy が一瞬固まる時があるような。なんでだろ。とりあえず、やっぱり無効にしておいたり。

#3 [dxruby][game] DXRubyで地形アタリを取りながらプレイヤーキャラの移動その3ひとまず完結編

今日も、DXRubyを使って、プレイヤーキャラを動かしてみますよ。

_昨日の時点 では、壁にめり込まなくなったものの、穴に落ちるとそこから脱出できなくなったので、今日はジャンプ処理を追加してみようかと。

下のようなソースになりました。

playermove3.rb
# プレイヤーキャラを動かしてみるサンプルその3
#
# 横移動、落下処理、床補正、壁補正、
# ジャンプ、天井補正をする。

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

font = Font.new(12)

# 画像読み込み
pimg = Image.loadTiles("player_512x256_64x64.png", 512 / 64, 256 / 64)
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)

# 空中床
float_floor = 21

# カーソル描画用メソッド
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

# プレイヤーのアニメパターンを定義
ppat = { "walk" => 0, "jump" => 16}
pimgnum = ppat["jump"]

bx, by = 0, 0
px, py = scrw / 2, scrh / 2
dx, dy = 0, 0
gravity = 0.45
bgatari_disp = false

wall_dist = 16 # 壁アタリをチェックする距離
ceiling_dist = 54 # 天井アタリをチェックする距離

# スクロール座標の範囲
scrl_spc = 16
bx_min = scrl_spc
by_min = scrl_spc
bx_max = tmx.map_width - Window.width - scrl_spc
by_max = tmx.map_height - Window.height - scrl_spc

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

  # Bキーを押したらBGアタリ表示と切替
  bgatari_disp = !bgatari_disp if Input.keyPush?(K_B)

  # プレイヤー移動処理

  # 左右キーで横移動
  # 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

  # ジャンプボタン(Zキー/ゲームパッドのボタン0)が押されていたら、ジャンプする
  # …このままだと空中でもジャンプできちゃうけど、なんだか面白いから残しとく

  # if Input.padPush?(P_BUTTON0)
  if Input.padDown?(P_BUTTON0)
    # dy = -16 # y速度を上向きに設定
    dy = -10 # y速度を上向きに設定
    pimgnum = ppat["jump"] # ジャンプポーズにする
  end

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

  # 天井アタリで補正する
  if dy < 0
    # y速度が上向きの時だけ天井アタリを見る
    xadd, yadd = 0, -ceiling_dist
    nx, ny = bgatari.adjust_bg_hit(px + xadd, py + yadd, BgAtari::ADJUST_DOWN)
    if nx and bgatari.bg_code != float_floor
      # 天井側に、空中床以外のBGアタリがある
      py = ny - yadd # 座標を補正
      dy = 0 # y速度を0にする
    end
  end

  # 壁アタリで補正する

  # 右側にBGアタリがあるかチェック
  # xadd, yadd = 32, -32
  xadd, yadd = wall_dist, -32
  nx, ny = bgatari.adjust_bg_hit(px + xadd, py + yadd, BgAtari::ADJUST_LEFT)
  if nx and bgatari.bg_code != float_floor
    # 右方向に、空中床以外のアタリがある
    px = nx - xadd # 座標を補正
    dx = 0 # x速度を0に
  end

  # 左側にBGアタリがあるかチェック
  # xadd, yadd = -32, -32
  xadd, yadd = -wall_dist, -32
  nx, ny = bgatari.adjust_bg_hit(px + xadd, py + yadd, BgAtari::ADJUST_RIGHT)
  if nx and bgatari.bg_code != float_floor
    # 左方向に、空中床以外のアタリがある
    px = nx - xadd # 座標を補正
    dx = 0 # x速度を0に
  end

  # 床アタリで補正する
  if dy < 0
    # 上向きに飛んでいる
    dy += gravity # 重力加速度を、速度に加算
  else
    # 下向きに飛んでいる、もしくは、床の上に居る

    # 床の上に居る時だけ、足元よりちょっと下の座標でアタリを取る
    yadd = (pimgnum == ppat["jump"])? 0 : 12
    nx, ny = bgatari.adjust_bg_hit(px, py + yadd, BgAtari::ADJUST_UP)

    if nx == nil
      # 足元に床が無い
      dy += gravity # 重力加速度を、速度に加算
      pimgnum = ppat["jump"] # 落下ポーズに変更
    else
      # 足元に床がある
      py = ny # 座標補正
      dy = 0 # y速度を0にする
      pimgnum = ppat["walk"] # 床の上に居るポーズに変更
    end
  end

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

  # プレイヤーの位置から、BGスクロール座標を決定
  bx += ((px.to_i - (scrw / 2) - bx) * 0.25).to_i
  by += ((py.to_i - (scrh / 2) - by) * 0.25).to_i
  if true
    # スクロール範囲を制限する場合
    bx = bx_min if bx < bx_min
    by = by_min if by < by_min
    bx = bx_max if bx > bx_max
    by = by_max if by > by_max
  end

  # BG描画
  if bgatari_disp
    Window.drawTile(0, 0, atari_layer, bgimg, bx, by, bgtw, bgth)
  else
    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)
  end

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

  # プレイヤー座標にカーソルを描画
  draw_cursor(x, y, C_RED)
  draw_cursor(x + wall_dist, y - 32, C_RED)
  draw_cursor(x - wall_dist, y - 32, C_RED)
  draw_cursor(x, y - ceiling_dist, C_RED)

  Window.drawFont(8, 8, "Move: ← → / Jump: Z / BG atari: B", font)
end
これで、穴に落ちても脱出できるかなと。

動作画面
ホントは、床の上に居る時だけジャンプ可能にすべきかもしれませんが。なんだかこのほうが面白かったので、そのままにしておきました。…きっと、彼の背中には翼がついてて、ジャンプボタンを押してる間は翼がバタバタ動いてるんです。心の目で見ればそう見える。ということにしておこう。

途中で、空中床(?)にも飛び乗れてますが…。どうやっているのかと言うと…。 たったこれだけです。BGアタリの種類を色々用意していけば、こんな風に、できることが増えていくのかなと。…でも、アタリ種類がどんどん増えていくので、これもこれでどうなんだろうという気もしますけど。もっとスマートなやり方はないのかな。まあ、そこは今後の課題ってことで。

ちなみに、マップの一番右のほうに、怪しいことが起きそうな地形を、いくつか置いておきました。個人的には、小さい段差で「ガクッ」と補正されるあたりが、気になりますなあ…。

とりあえず、ここまでのソースも画像も、zipファイルにまとめて、Dropboxに置いときますね。exeファイル以外は Public Domain ってことで。(exeファイルだけは、MIT License の tmxライブラリを含んでるので、ライセンスがよく分からず…。再配布するぐらいなら問題ないと思ってるんですが、どうなんだろう?)

_dxruby_map_disp_20131225.zip
他にも実装したい部分はありますが…。 まあ、ここまでやってきたことを参考にすれば、作り込みはできると思いますので…。

今回は、というか今年の DXRuby関係の記事は、これで最後にしたいと思います。どうにか、「一人DXRuby Advent Calendar 201」 も、そこそこやり遂げられたような気もしますし…! *1

課題のヒント。 :

床の上に立っている時だけジャンプさせたい。
床の上に立っている時だけ、ジャンプボタンが押されたかチェック。
空中床から真下に飛び降りたい。
飛び降り始めてから一定距離は、床アタリを無視。ただし、空中床の上に居ると分かってる時だけ、飛び降り操作を受け付ける。
崖(?)のギリギリ端っこにも立ちたい。
床補正時に見る位置を、足元の一点だけではなく、両脇にも増やす。
崖から落ちるときにガクッと動くのが気になる。
崖のギリギリ端っこに立てるようになれば、気にならないかも。
天井にぶら下がりたい。
床アタリに対してやってることを、上下逆にして、頭のあたりの座標を使って行う。
壁をよじ登りたい。
床アタリに対してやってることを(以下略
ぶら下がり棒に、ぶら下がりたい。
床アタリに対してやってることを、頭のあたりの座標を使って行う。ただし、ぶら下がり棒のBGアタリ番号以外は無視。
壁を蹴って三角飛びしたい。
ジャンプ中、かつ、壁補正された時に、ジャンプボタンを受け付ける。
斜め床の上では移動速度を変えたい。平らな床と同じ速度で動くのは気になる。
BGアタリ種類と、速度もしくは角度の対応表を作っておく。足元のBGアタリ番号を見て速度を決定。
小さい段差の上に乗るとガクッと動くのが気になる。
これ、どうやればいいんでしょうね? たぶん、対処を入れると、斜め床絡みでバグが出そうな予感…。「こういう地形は作らない」というルール適用が一番安直だけど…。
動く足場を作りたい。
動く足場のアタリ範囲と当たったら、床補正時と同じノリでプレイヤー座標を補正。ただし、動く足場の移動量をプレイヤー座標にも加える。足場側が自分の移動量を保持していて、プレイヤー側がソレをゲットして座標変更するか、あるいは、プレイヤー側が、乗ってる足場に、「お前に乗ってるよ」と知らせてあげて、足場側でプレイヤー座標を変更、等の処理になるのかなと。

参考になりそうなページ。 :

_地形判定させてみる の、真ん中あたりにある説明図が、今回のソースの問題点をズバリ示してる、ように思います。

また、前にも書きましたが、 _2D当たり判定超入門(pdf) は、大変参考になりそうです。件のpdfは図形で地形判定してますが、タイルで地形判定する場合と共通する問題点にも触れていますので…。

2017/03/19追記。 :

Dropboxのpublicフォルダが死んだのでファイルの置き場所を変更。

*1: や。「一人DXRuby Advent Calendar 2013」なんてする気はなかったですけど…。そもそも、ほとんどの記事は、DXRubyと関係ないですよね…。HSP、PyGame、pyglet、Processing、等々何を使ってもいいような話ばかりでしたし。

#4 [anime][game][neta] 牛男が気になる

昔目にしていた牛男のゲームのタイトルが気になり始めて検索。

「Wild West Cowboy of Moo Mesa」というタイトルだったらしい。 _Chibi Resena Wild West Cowboy of Moo Mesa - YouTube を眺めた感じでは…アニメ版はカッコイイな…。ゲーム版はちょっと頭身を縮め過ぎてしまった気もする。でも、アチラから「キャラを大きく表示しろ」と要求されつつも、ゲームとして成立させるために、このバランスになったのかなと想像したり。

_wild west cowboys konami - YouTube を眺めた感じでは、結構人気があったのかしら。「俺のお気に入りだぜ!」なんてコメントもあるような。

とは言え。例えばPCE版と○メモチームの画面に、代わりにコレが映ってたら、あのチームはあそこまで踏ん張れなかったんじゃないかという気がして。やっぱり画面の中に可愛い女の子が出てるか否かって、地味に効いてくるような気がしたり。

自分も、起動直後の「(ピピン!) おはようございます! 今日も一日〜」で、もう色々とグッタリ状態だったのに、「…よし…頑張らねば…この娘のためにも…な…」てな気分になった記憶もあって。

つまり、赤い矩形や、青い矩形じゃ、ソース単体で事足りるとは言え、「勉強してみようかな」てな気分にならないよなと。そんなわけで、自分、その手の実験をする時すら、まずはドットエディタを起動しちゃうのでした。でも、 _ワイデス40 モドキが関の山という…。

む。なんとなく思ったけど、Ruby のソース内に画像バイナリを記述して、ソースのみをblogに張ってるのに、コピペして動かすと可愛い画像が、みたいなことはできないのかしら。…考えてみたら、ARGB値を並べておけばいいだけ、なのかな。いやいや、それだと圧縮が効かないか。

Rubyで、テキスト化されたバイナリ圧縮データを解凍するのって、どんな形式がメジャーなんだろう…。

以上、1 日分です。

過去ログ表示

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