I’m loser, baby.

So why don't you kill me?

メモ

  • LÖVEで音周りを弄っています。
    • シーケンスのタイミングは画面書き換えのフレーム単位に合わせると安定しているけれど、今の知識、理解ではかなり厳しい。
      • アンビエントみたいなやつならいい感じで出来そう。
      • なので、引き続き遊んではいます。取り敢えず、シーケンサーのバージョン1を作るまではやる。
    • あとLuaで配列作る場合、配列に何も入れないとその分メモリを食わないので、LÖVEでラングトンのアリの格子を書かないようにすると大幅に高速になりました。
  • Luaは引き続き勉強するにして、LÖVEの他にもLua使えるゲームエンジンあったよなあと思ってちょっとググったり自分専用のWiki検索したりしました。
    • マルチプラットホームだとCocos2D-Xが一番有名ドコロだと思うんですが、今、公式IDEだとJavaScriptだけでLuaが使えなくなってますね。
    • あとMaratisていうのが良い感じなんですけど、開発止まってるようで悲しい。
    • WindowsってことだとAIMとかAEnなんてのもちょっと触ってみました。

Cocos2d-x - World's #1 Open-Source Game Development Platform
http://www.maratis3d.org/
AIMS Headquarters
AEnオンラインヘルプ

  • あとJavaScript
    • 今はLuaをイジってますが、j5.jsもボチボチと。
      • 音のタイミングとかはこっちのほうが自由度は高いかも。
      • とはいえウェブブラウザなんで厳密にって訳には行かないかもですな。ちょっと実験してみよう
    • UnityもJavaScriptで書けるんだよな。
      • あと、Unityで音の加工も色々出来そう。

ラングトンのアリ

  • 引き続きLÖVEで遊んでいます。
  • いろんな言語をとっかえひっかえ試しては形にならずに放置していましたが、取りあえず今回はこのLÖVEとLuaで前にQB64で大雑把に作ったシーケンサーの骨組みから完成させるまで作ってみようと自分に課しました。
    • なんか、今の自分にとっては出来る事とやりたい事とやるべき事のバランスがLÖVEだとちょうどいい感じがします。
    • 作りたいのはテノリオン+グルーヴ地獄Vみたいなの。
      • そこはDEPTHにしておけよ、という話もありますが。
  • まあでも最初は公式Wikiチュートリアルを写経するわけです。
    • 写経ついでにちょっとアレンジしたりして勉強するのが速いですよね。下みたいに点を打つついでに動かしてみるとか。
  • 写経だけっていうのも飽きてきて、そろそろゼロから何か書こうかということで、目標アプリではテノリオンみたいな感じにしたいので取りあえずみんな大好きライフゲームでも、と思ったんですが、ふと思いついて同じセル・オートマトンでもラングトンのアリを書くことにしました。簡単だし。
  • それでやってみたらサクッと書けました。まだこのレベルならLuaとLÖVEで引っかかることは無いですね。配列が1始まりなのが変わっているくらい?
    • 途中までライフゲーム作るつもりだったので効率が悪いコードですが、Luaに慣れるためなので、まあいいでしょうということで。
    • 上のWikipediaの画像はかなり早回しで、これを1セルずつの書き換えにすると非常にかったるいので20倍速にしました。

f:id:SenjiNiban:20161010161307j:plain

  • Wikiを見るとセルの色でのバリエーションが研究されているみたいだけど、アリの歩く幅を色々変化せてみたりしました。
    • 向きによって歩く幅が違うようにしつつ、縦横での一定の比率にするとか、ある一方向だけ他の方向と違う歩幅にするとか。
  • で、やってみた結果
    • 縦横の歩幅の比が整数の場合はオリジナルと同じような挙動の場合が多いようです。
    • 縦横比が整数でない場合、一方向だけ異なる値の場合、はパターンを描きながら直進するパターンが多いようです。
      • ただし、どういう理屈でそうなるのか判らないのですが、突如後戻りしたり曲がりだしたりするので油断がならない。
      • そうとう大きいフィールドを作らないと詳しく調べられないので、このプログラムでは探索に限界がありそう。
    • 全くのランダム、カオスなパターンというのは今のところは出てきてません。
  • オリジナルのパターンでも10000ステップ超えたあたりで必ず直進パターンに移行するとか、直進開始後に適切なパターンに衝突すると巻き戻しが起こるとか、ライフゲームに負けず劣らず面白い挙動をするラングトンのアリですが、バリエーションも探すと色々面白そう。

f:id:SenjiNiban:20161010164852j:plain
f:id:SenjiNiban:20161010164905j:plain

  • 見てて面白かったパターンのソースを晒してみます。LÖVE0.10.1なら動くはず。
    • 最初見ていて予想するのとは違う展開になると思います。
    • Web上でも動きますがかなり遅いので100倍速にしています。
--ラングトンのアリ・バリエーション for LÖVE0.10.1
function love.load()
--
	width = 198
	height = 148
--
	ant = {}
	ant.x = width / 2
	ant.y = height / 2
	ant.direction = 1
--
	map = {}
	for i=1, width do
		map[i] = {}
		for j=1, height do
			map[i][j] = 0
		end
	end
end
 
function love.update()
for i=1, 20 do 
	if map[ant.x][ant.y] == 0 then
		map[ant.x][ant.y] = 1
		ant.direction = ant.direction + 1
		if ant.direction > 4 then
			ant.direction = 1
		end
		next_pos(ant.direction)
	else
		map[ant.x][ant.y] = 0
		ant.direction = ant.direction - 1
		if ant.direction < 1 then
			ant.direction = 4
		end
		next_pos(ant.direction)
	end
end
end
 
function love.draw()
	for x=1, width do
		for y=1, height do
			if map[x][y] == 0 then
				love.graphics.rectangle("line", x * 4, y * 4, 4, 4)
			else
				love.graphics.rectangle("fill", x * 4, y * 4, 4, 4)
			end
		end
	end
end
 
function next_pos(a)
--
	if a == 1 then
		ant.x = ant.x - 2
		elseif a == 2 then
		ant.y = ant.y + 1
		elseif a == 3 then
		ant.x = ant.x + 1
		elseif a == 4 then
		ant.y = ant.y - 1
	end
--
	if ant.x < 1 then
		ant.x = width
	end
	if ant.x > width then
		ant.x = 1
	end
	if ant.y < 1 then
		ant.y = height
	end
	if ant.y > height then
		ant.y = 1
	end
end

LÖVEメモ その3

  • LÖVEを色々いじって遊んでいます。
  • 公式サイトのチュートリアルに一通り作例があるのでそれ見ると大体どんな風に書けばいいのかが判ってきます。
  • あと日本語の解説ページだとここが詳しかった。
  • 英語の解説ページも結構ありますが、Luaはバージョン違うと結構動かないことが多いので、出来るだけ作例とバージョンは合わせた方がいいのだけれど、英語ページでバージョンまで言及してなくて、あれっ?て事になったりするので、今最新の0.10.1を使うなら上の二つのページを見た方が確実かも知れない。
  • 文法というか書き方は、まんまLuaなのでLuaが判っている人なら戸惑うことなくどんどん書けそう。
    • 自分は買ったままで積読だったLua公式本を読みつつ、チュートリアルを触ったり人のプログラムを読んだりって感じです。
    • 洋書でLÖVEの解説本もありますね。

Programming in Lua プログラミング言語Lua公式解説書

Programming in Lua プログラミング言語Lua公式解説書

  • 構造としてはj5.jsなんかと似ている。
    • ゲームというのはある種のステートマシンなので大体似てしまうのかも。
    • ケルトンとしてはこんな感じで3つのコールバックがメインになっている。
      • updateとdrawはデルタタイム毎に呼び出されて更新されてて、その他、キーやジョイスティックの入力なんかも、この3つの関数に書いても、入力の都度などその都度処理が行われる。
function love.load()
--ここでデータの読み込みやテーブルの定義などをする
end
function love.update()
--ここでフレーム毎の処理を行う
end
function love.draw()
--ここで画面描画を行う
end
  • 上の公式本はRenoiseのスクリプトLuaが使われていて、何かできるかしらと思って買って積読になっていたんだけれど、LÖVEで慣れたらRenoiseに再挑戦するのも良いかも。
  • でもって改めてLuaを勉強しているんだけれども、割合判りやすいと思いますが、いくつか課題もあって、以下自分用メモ
    • データ構造はテーブル一択。でもテーブルに何でも放り込めるのでこれで何とかなってしまう。
      • いわゆる配列として使える
      • テーブルの要素にテーブルも使えるので多次元配列はもちろんできる
      • 連想記憶としても使える
    • 関数もテーブルの要素として扱えるので関数型言語っぽい使い方も出来る
    • 配列の要素にアクセスするときにx["a"]でもx.aでもいけるので、オブジェクト指向ぽく書くことも可能
    • コルーチンのところまでまだ読み進んでいないんだけれど、コルーチンはschemeの継承ぽいようなので、ゲームのような並行処理をいっぱいするものには便利に使えそう
  • あと、いま使っているLÖVE0.10.1はLua5.1ベースなんだけれど、当然のことながらLua5.1で書かれたらLua用のライブラリならそのまま使える。
    • LuafftというLuaだけで書かれた高速フーリエ変換ライブラリがあって、それを使ったLÖVEのアプリとかあった。前のエントリーでも書いたけれど、音をいじるライブラリをLuaだけで書いて十分実用になるというのはさすがスクリプト言語最速を謳っているだけのことはあるのかも。

LÖVEメモ その2

github.com

play.google.com

メモっていうかLÖVE

  • 結局ワナビーでコーディングも出来てないので見聞きしたことのメモ書き
  • 自分が使いたいプログラム言語やフレームワークというのはこんな感じ
    • 音と画像が簡単に操作できる
      • それらがリアルタイムに動いてほしい
      • 3Dも簡単に扱えたらなお良し
    • 音に関してはサウンドファイルの再生だけではなくて、もう少しディープにいじれて欲しい
    • マルチプラットホームでスマホも視野に入っていたら嬉しい
    • 単独アプリとして配布できると嬉しい
  • それに合うもので触っていたものはこんな感じでどれもモノになってないという

p5js.org
Processing.org
WarmPlace.Ru. Pixilang Programming Language
LÖVE - Free 2D Game Engine

  • それで一番最後のLÖVEを久しぶりに調べていたら音をサウンドファイルの再生じゃなくていじるってページがあって楽しそうだった

www.headchant.com

  • LÖVEはLuaで書けるSDLを中心とした2Dゲーム向けフレームワークで、公式ページとか何だかファンシーなテイストなのが持ち味
    • スクリプト読ませず立ち上げるとそれぞれのバージョンごとにカワイイサンプルが立ち上がる
    • 最新バージョンはこれ

f:id:SenjiNiban:20161004114402j:plain

  • 公式Wikiも一部日本語訳されていたのは知っていたのだけれど、結構ごっそり日本語訳されてDLできるようにもなっていて調べやすくなった
  • LinuxMintでも0.10.Xバージョン対応していたから対応速いのかも

p5.js素晴らしいですね。

アルバムも無事発売になって、完全放置だった自分のHPも少し手を入れていました。
senjiniban.hatenablog.com

それでようやくp5.js触り始められて、機能確認以上のものではないですが、今日はこんなもの作っていました。音が出るので注意。
f:id:SenjiNiban:20160904184658p:plain
http://onbangdo.net/testone/
ちょっとずつ、色々作ってみる予定。