2019/12/23(月) [n年前の日記]
#1 [love2d] love2dで多関節というか蛇モドキを書いてみたり
せっかく love2d をまた触り始めたので、ちょっと何か書いてみようかと。多関節、というか蛇モドキのソレを書いてみたり。
動作確認環境は、Windows10 x64 1909 + love2d 11.3。
こんな感じになった。
動作確認環境は、Windows10 x64 1909 + love2d 11.3。
こんな感じになった。
◎ ソース。 :
ソースは以下。
_conf.lua
_main.lua
動作に必要な画像は以下。自作した画像なので、CC0 / Public Domain ってことで。
_circle01_96x96_32col.png
上記の3つのファイル、conf.lua、main.lua、circle01_96x96_32col.png を、任意のフォルダに置いて、「love フォルダ名」で実行できる。
_conf.lua
function love.conf(t) t.version = "11.3" -- love2d version t.window.title = "Snake - love2d" t.window.vsync = 1 t.window.width = 1280 t.window.height = 720 -- t.window.fullscreen = true -- t.window.fullscreentype = "exclusive" end
_main.lua
-- Snake on love2d function love.load() love.graphics.setDefaultFilter("nearest", "nearest") img = love.graphics.newImage("circle01_96x96_32col.png") x = love.graphics.getWidth() / 2 y = love.graphics.getHeight() / 2 pos_buf = {} for i = 1, 128 do pos_buf[i] = {x, y} end idx = #pos_buf end function love.update(dt) -- move head mx, my = love.mouse.getPosition() local dx = (mx - x) * 0.1 local dy = (my - y) * 0.1 x = x + dx y = y + dy -- Updated index to record head position idx = idx - 1 if idx <= 0 then idx = #pos_buf end -- record head position pos_buf[idx] = {x, y} end function love.draw() -- fill window background love.graphics.clear(0.4, 0.7, 0.8, 1.0) -- draw snake local ox, oy = img:getWidth() / 2, img:getHeight() / 2 love.graphics.setColor(1.0, 1.0, 1.0, 1.0) for i = 16, 0, -1 do local n = ((idx + i * 4) % #pos_buf) + 1 local px = pos_buf[n][1] local py = pos_buf[n][2] love.graphics.draw(img, px, py, 0, 1.0, 1.0, ox, oy) end -- draw FPS txet love.graphics.print("FPS: " .. tostring(love.timer.getFPS()), 2, 2) end function love.keypressed(key, isrepeat) if key == "escape" then -- ESC key to exit love.event.quit() end end
動作に必要な画像は以下。自作した画像なので、CC0 / Public Domain ってことで。
_circle01_96x96_32col.png
上記の3つのファイル、conf.lua、main.lua、circle01_96x96_32col.png を、任意のフォルダに置いて、「love フォルダ名」で実行できる。
◎ 解説。 :
やってることは簡単。頭の座標を毎フレーム、バッファに記録し続けて、体の部分は、バッファから座標値を取り出して描画してるだけ。
後は、頭だけをイイ感じに動かしてやれば、その動きに体が追従してくれるわけで。
上記のソースでは、頭はマウスカーソルを追いかけるようにしてみたり。love2d でマウスカーソルの座標を取得したい場合、以下のように書けばいい。
余談。大昔に関わった某ゲームに出てくる、蛇みたいな敵(2種類)は、この処理で動かしていました。頭は、sin,cos で動かした記憶が…。たしかそのはず…。
頭の座標を記録するバッファ ┌─────┐ │ x, y │ ├─────┤ │ x, y │ ← 頭の座標を記録 ├─────┤ │ x, y │ ├─────┤ │ x, y │ ← 体1の座標 ├─────┤ │ x, y │ ├─────┤ │ x, y │ ← 体2の座標 ├─────┤ ... ├─────┤ │ x, y │ ← 体nの座標 ├─────┤ │ x, y │ ├─────┤ │ x, y │ └─────┘
後は、頭だけをイイ感じに動かしてやれば、その動きに体が追従してくれるわけで。
上記のソースでは、頭はマウスカーソルを追いかけるようにしてみたり。love2d でマウスカーソルの座標を取得したい場合、以下のように書けばいい。
mx, my = love.mouse.getPosition()mx, my に、マウスカーソル座標 x, y が入る。
余談。大昔に関わった某ゲームに出てくる、蛇みたいな敵(2種類)は、この処理で動かしていました。頭は、sin,cos で動かした記憶が…。たしかそのはず…。
◎ 課題。 :
この処理はフレームレートが安定していることを前提にして書いてるし、手元の Windows環境では約60FPSで動いちゃってるので、それらしく見えてはいるけれど。
love2d で更新処理を担当する love.update(dt) が、dt に前フレームからの経過時間が入る仕様であることを考えると、場合によっては可変フレームレートで動く場面もありそうだなと。そうなると、おそらくおかしな見た目になりそうな予感。
さて、可変フレームレートにも対応させようとした場合、どう書けばいいのだろう…。
love2d で更新処理を担当する love.update(dt) が、dt に前フレームからの経過時間が入る仕様であることを考えると、場合によっては可変フレームレートで動く場面もありそうだなと。そうなると、おそらくおかしな見た目になりそうな予感。
さて、可変フレームレートにも対応させようとした場合、どう書けばいいのだろう…。
[ ツッコむ ]
#2 [pc][tv] 液晶ディスプレイにしみができていた
自分が使っている液晶ディスプレイ、MITSUBISHI RDT233WX-3D の画面右上に、しみができていることに気づいてしまった。いつからできていたんだろう…。困った…。まあ、画面端の、滅多に凝視しない部分で発生したのが救いではあるけれど。
ググってみたら、長期に渡って使っていると経年劣化でしみができてしまう時があるようで。できてしまう原因までは分からなかった。
買い替えが必要なのかな…。しかし、この製品はもう売ってないわけで…。そもそも MITSUBISHI は、2013年頃に、液晶ディスプレイ市場から撤退しているし。
_三菱電機が液晶ディスプレイ事業から撤退 | スラド ハードウェア
ググってみたら、長期に渡って使っていると経年劣化でしみができてしまう時があるようで。できてしまう原因までは分からなかった。
買い替えが必要なのかな…。しかし、この製品はもう売ってないわけで…。そもそも MITSUBISHI は、2013年頃に、液晶ディスプレイ市場から撤退しているし。
_三菱電機が液晶ディスプレイ事業から撤退 | スラド ハードウェア
◎ 3D対応液晶ディスプレイが入手不可なのが悲しい。 :
この RDT233WX-3D は、偏光フィルタ方式で3D表示に対応しているのが売りで。かつ、PIP表示にも対応してる製品なのだけど。同等スペックの製品を探してみても、今では選択肢が無く…。
PIP表示が可能な液晶ディスプレイは今でも存在しているようだけど、3D表示に対応してる製品は、もはや市場では皆無。あったとしても、TNパネル + NVIDIA 3D Vision のタイプで、これまた NVIDIA 3D Vison 自体がサポート終了状態で。
液晶ディスプレイ市場には無くても、TV市場なら3D対応製品があるのではないかとググってみたけれど、そちらも既に壊滅状態。
_3Dテレビ時代の終焉。'17年テレビから3D対応機種が無くなった理由 - AV Watch
つまり、今から3D表示・立体視を楽しもうと思っても対応機器が存在しない。3Dコンテンツを各御家庭でも比較的安価で視聴できていたのは、ほんの少し前の一時期に過ぎなかった、ということになりそうだなと…。 *1
PIP表示が可能な液晶ディスプレイは今でも存在しているようだけど、3D表示に対応してる製品は、もはや市場では皆無。あったとしても、TNパネル + NVIDIA 3D Vision のタイプで、これまた NVIDIA 3D Vison 自体がサポート終了状態で。
液晶ディスプレイ市場には無くても、TV市場なら3D対応製品があるのではないかとググってみたけれど、そちらも既に壊滅状態。
_3Dテレビ時代の終焉。'17年テレビから3D対応機種が無くなった理由 - AV Watch
つまり、今から3D表示・立体視を楽しもうと思っても対応機器が存在しない。3Dコンテンツを各御家庭でも比較的安価で視聴できていたのは、ほんの少し前の一時期に過ぎなかった、ということになりそうだなと…。 *1
◎ 偏光フィルタ方式が復権しないかな。 :
せっかく4K/8Kのパネル、かつ、HDRが市場に出てきたのだから、今こそ偏光フィルタ方式が活きる時ではないのか、という気もするのだけどなあ。
偏光フィルタ方式は、縦解像度が半分になる + 映像が暗くなりがち、というデメリットがあるけれど。
とは言っても、世間様は「3Dで見えても別に嬉しくはないなあ」てな空気になってそうだし…。SF映画でたまに出てくる、立体映像が当たり前、てなシーンは、この調子だと実現しないのかもしれないなあ…。浪漫が無い…。
偏光フィルタ方式は、縦解像度が半分になる + 映像が暗くなりがち、というデメリットがあるけれど。
- 4K/8Kパネルなら、解像度が半分になっても、フルHDの縦解像度は得られるはず。
- HDRなら、より明るい画面も出せるはず。
とは言っても、世間様は「3Dで見えても別に嬉しくはないなあ」てな空気になってそうだし…。SF映画でたまに出てくる、立体映像が当たり前、てなシーンは、この調子だと実現しないのかもしれないなあ…。浪漫が無い…。
◎ 2019/12/25追記。 :
上記リンク先の記事を読んでいたら、「4Kパネルに偏光フィルタを貼ると光量が減るからHDRが実現できなくなる」との話が書いてあった。そういう理由で偏光フィルタ方式は復権できないのか…。でも、そのあたり改良できる見込みは無いのかな…。
[ ツッコむ ]
以上、1 日分です。