IT日々是好日

Webエンジニア。あと色々。

Corona SDKを使ったお気軽ゲームを多数の人に見てもらった

ひょんなことからWeb制作に関わっている方々の交流会に誘われました。

初参加なので自己紹介・・・と思ったのですが、ニートです。」で終わってしまいそうなのでデザインのセンスがないプログラマ寄りの人間であることを知って欲しくてサンプルゲームを見てもらうことにしました。

アクションゲームが熱かろうということでCorona SDK物理エンジンを使って書いてみました。

ゲーム画面がコチラ

Andoroid風(NexusOne)なシミュレータ画面になってますが、iPhoneiPadでも動くようになってます。
プログラムはLua言語で書かれていて非常に短いコードです。

メインのコードはこんな感じです。
ファイル名:main.lua

local physics = require("physics")
physics.start()

local screenW, screenH = display.contentWidth, display.contentHeight
local friction = 0.8
local gravity = .09
local speedX, speedY, prevX, prevY, lastTime, prevTime = 0, 0, 0, 0, 0, 0

local background = display.newImage( "BackGround.png" )
background.x = screenW / 2
background.y = screenH / 2

local player = display.newImage("Player.png");
player.x = screenW / 2
player.y = 240
physics.addBody( player, "static", { friction=0.5, bounce=0.3 } )

-- Falling object.
local function newCrate()
	rand = math.random( 100 )
	local j

	if (rand < 33) then
		j = display.newImage("Udon.png");
		j.x = 60 + math.random( 160 )
		j.y = -100
		physics.addBody( j, { density=0.9, friction=0.3, bounce=0.1 } )
	elseif (rand < 66) then
		j = display.newImage("Cake.png");
		j.x = 60 + math.random( 160 )
		j.y = -100
		physics.addBody( j, { density=1.4, friction=0.3, bounce=0.2 } )
	else
		j = display.newImage("Rock.png");
		j.x = 60 + math.random( 160 )
		j.y = -100
		physics.addBody( j, { density=0.3, friction=0.2, bounce=0.3 } )
	end
end

-- Move character.
local function startDrag( event )
	local t = event.target
	local phase = event.phase

	if "began" == phase then
		display.getCurrentStage():setFocus( t )
		t.isFocus = true

		-- Store initial position
		t.x0 = event.x - t.x

	elseif t.isFocus then
		if "moved" == phase then
					
			t.x = event.x - t.x0
			-- t.y = event.y - t.y0

		elseif "ended" == phase or "cancelled" == phase then
			lastTime = event.time

			display.getCurrentStage():setFocus( nil )
			t.isFocus = false
		end
	end

	return true
end

-- Run games.
player:addEventListener("touch", startDrag)
local dropCrates = timer.performWithDelay( 500, newCrate, 120 )

うん、短い。70ステップぐらい。
0.5秒おきに上からモノが降ってくる処理と、画面をタップしてキャラクターを動かす処理だけです。

続いて、アプリケーションの定義ファイル。
ファイル名:config.lua

application =
{
	content =
	{
		width = 320,
		height = 480,
		scale = "letterbox" -- zoom to screen dimensions (may add extra space at top or sides)
	},
}

画面の解像度を設定しています。iPadのような高解像度の端末でも低解像度のものに合わせます。

そして、画面の向きの定義ファイル。
ファイル名:build.settings

settings =
{
	orientation =
 	{
		default = "landscapeRight",
 		supported =
 		{
 		"landscapeLeft", "landscapeRight"
		}
	}
}

端末を横長の方向で動かすように定義しています。
このファイルが無い場合は、画面は縦長の方向となります。

自分で用意するファイルは、これらのコードと背景やキャラクターの画像ファイルです。

触っているうちに気になったこととして、iPhone系とAndoroid系の双方で動かすためのポイントがいくつかあります。

  • iPhone系、Andoroid系どちらか一方しかサポートしない関数を使わない
  • ハードによる差を吸収するため座業は絶対値ではなく仮想のスクリーン座標を使う
  • Mac OS Xでは文字コードUTF-8、改行コードLFを使い、Windows版では文字コードShift-JIS、改行コードCR+LFを使うのでファイルコピーする場合は注意
  • Windows版のCorona SDKは、まだベータ版

iPhone版をApp Storeに登録しようと考えている方は、いずれにせよMacが必要なのでMac版の方がいいでしょう。

交流会での反応としては、3DCGを専門にやっている方とかスマートフォンアプリの開発に興味がある方にはおおむね好評。
絵がバリバリかける人、ニーズをつかんでいる人、いろんな意見出して何か作りたいねって感じで閉幕しました。

ニートが久しぶりに対話らしい対話したので疲れました。