mieki256's diary



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

#1 [love2d] love2dで多関節

love2d を使って、多関節の触手っぽい動きを書いてみたり。動作確認環境は、Windows10 x64 1909 + love2d 11.3。

こんな感じになった。マウスカーソルの位置で曲がり方が変わるようにしてみたり。

ソース。 :

_conf.lua
function love.conf(t)
  t.version = "11.3" -- love2d version
  t.window.title = "Arm - love2d"
  t.window.vsync = 1
  t.window.width = 1280
  t.window.height = 720

  -- t.window.fullscreen = true
  -- t.window.fullscreentype = "exclusive"
end

_main.lua
-- Arm on love2d

function love.load()
  love.graphics.setDefaultFilter("nearest", "nearest")

  img = love.graphics.newImage("circle02_64x64_take1_05_5bit32col_edit.png")

  scrw = love.graphics.getWidth()
  scrh = love.graphics.getHeight()
  bx = scrw / 2
  by = scrh / 2

  angles = {}
  pos_buf = {}
  for i = 1, 16 do
    angles[i] = 0
    pos_buf[i] = {bx, by}
  end

  ang = 0
  a0 = 15
  a1 = 30
end

function love.update(dt)
  ang = ang + 90 * dt

  mx, my = love.mouse.getPosition()
  a0 = 45 * (mx - (scrw / 2)) / (scrw / 2)
  a1 = 45 * (my - (scrh / 2)) / (scrh / 2)

  -- angles[1] = 0
  angles[1] = ang

  for i = 2, #angles do
    -- angles[i] = a1 + a1 * math.sin(math.rad(a0 * (i - 2)))
    angles[i] = a1 * math.sin(math.rad(ang * 0.75 + (i - 1) * a0))
  end

  local x = pos_buf[1][1]
  local y = pos_buf[1][2]
  local a = angles[1]

  -- local distance = 30
  local distance = 24 + 12 * math.cos(math.rad(ang * 1.4))

  for i = 2, #angles do
    a = a + angles[i]
    x = x + distance * math.cos(math.rad(a))
    y = y + distance * math.sin(math.rad(a))
    pos_buf[i] = {x, y}
  end
end

function love.draw()
  -- fill window background
  love.graphics.clear(0.4, 0.7, 0.8, 1.0)

  -- draw arm
  local ox, oy = img:getWidth() / 2, img:getHeight() / 2
  love.graphics.setColor(1.0, 1.0, 1.0, 1.0)
  for i = 1, #pos_buf do
    local px = pos_buf[i][1]
    local py = pos_buf[i][2]
    love.graphics.draw(img, px, py, 0, 1.0, 1.0, ox, oy)
  end

  love.graphics.print("a0=" .. tostring(a0), 2, 16)
  love.graphics.print("a1=" .. tostring(a1), 2, 32)

  -- 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 ってことで。

circle02_64x64_take1_05_5bit32col_edit.png
_circle02_64x64_take1_05_5bit32col_edit.png

この3つのファイル、conf.lua、main.lua、*.png を適当なフォルダに置いて、「love フォルダ名」で実行できる。

解説。 :

仕組みは…。DXRuby で多関節のソレを書いた際の記事が参考になるはず。アレと同じ仕組みだし。

_mieki256's diary - DXRubyで例の多関節を実験

各関節が角度を持っていて、親の角度+自分の持ってる角度を使って位置を決めていく、という説明でいいのかな。

余談。class を作って書いたほうがいいのかなと思ったけれど、この程度の処理なら、各関節の角度を保持しておく配列さえあれば動かせるなと思えてきたので、だらだらと書いてしまったり。

以上です。

過去ログ表示

Prev - 2019/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