MobileSocial

海賊王をめざす男 マツです。こんにちは。

Unity をはじめたころにやりたいことで、Scene に配置されている GameObject を子も含めて一括でアクティブ/非アクティブを変更するのがあります。

function Awake () {
	ActiveChange(gameObject.transform, false);
}
function ActiveChange(targetGO : Transform, activedFlag : boolean) {
	targetGO.active = activedFlag;
	for (var child : Transform in targetGO) {
		ActiveChange(child, activedFlag);
	}
}

しかし、これはすぐにやめました。リファレンスをよく読んでみると SetActiveRecursively というのがあります。

targetGO.gameObject.SetActiveRecursively(false);

これで、子も含めて一括でアクティブ/非アクティブを変更することが可能です。


Unity Script Reference ? GameObject.SetActiveRecursively
http://unity3d.com/support/documentation/ScriptReference/GameObject.SetActiveRecursively.html

Unity GameObject の子を含め一括でアクティブ/非アクティブを変更する

海賊王をめざす男 マツです。こんにちは。 Unity をはじめたころにやりたいことで、Scene に配置されている GameObject を子も含めて一括でアクティブ/非アクティブを変更するのがあり…

MobileSocial

海賊王をめざす男 マツです。こんにちは。

Unity で、ツイートするサンプルがあったのでためしてみました。
http://u3d.as/content/young-wook-yang/let-s-tweet-in-unity/1Dq

簡単に Twitter アカウントの "access token & secret" を取得&保存することができ、OAuth 認証を必要とする全ての Twitter 機能を扱うことが可能になります。


手順

1. Create an application
Twitter にアプリ登録
http://dev.twitter.com/apps/new
Twitter アカウントでログイン

2. Application details を入力
Name:M3UnityTest0
Description:Unity Game Test
WebSite:http://creator.ms
Callback URL:

3. Developer Rules of the Road
Yes, I agree 同意するチェックを入れる。

4. CAPTCHA を入力。

5. [Create your Twitter application]ボタンをクリック。

6. My applications
"Consumer key", "Consumer secret" のそれぞれが表記されます。

7. Settings
Application type
Access:Read, Write and Access direct messages
に変更します。

8. Unity サンプルの Demo シーン ( demo.unity ) を開く。

9. Hierarchy の Demo という GameObject を選択します。

10. Inspector の CONSUMER_KEY, CONSUMER_SECRET に取得した "Consumer key", "Consumer secret" を入力します。

11. Demo シーンを実行。

12. [You need to register your game or application first.]ボタンをクリック。

13. ブラウザが立ち上がって、twitter がアカウント許可を求めてきます。

14. [連携アプリを認証]ボタンをクリック。

15. PIN コードが表示されます。

16. [Please enter your PIN here.]テキストエリアに取得した PIN コードを入力し、[Enter PIN]ボタン

17. [Please enter your tweet here.]テキストエリアにつぶやく内容をエントリーして、[Post Tweet]ボタン

18. Tweet 完了


サンプルソースでは、GetHeaderWithAccessToken() で Twitter API の url を実行していました。

GetHeaderWithAccessToken(
	string httpRequestType, 
	string apiURL, 
	string consumerKey, 
	string consumerSecret, 
	AccessTokenResponse response, 
	Dictionary parameters)


Android テスト

Android にアプリをビルドして、テストしてみたところ、無事ツイートできました。
ただし、現時点で Unity の GUI.TextField は、モバイルだとダイナミックテキストは使えないので、日本語は使用できません。

Unity で Twitter テスト

海賊王をめざす男 マツです。こんにちは。 Unity で、ツイートするサンプルがあったのでためしてみました。 http://u3d.as/content/young-wook-yang/let-s-…

MobileSocial

海賊王をめざす男 マツです。こんにちは。

最新各地で動きのある Unity ですが、初歩の進めとしてアングリーバード的なゲームをつくる簡単なデモを紹介します。

Demo
画面をクリックするとボールが発射します。

ブラウザでも確認できるように Unity の Web プレイヤーで書きだしています。
Unity Web Player ダウンロード
http://unity3d.com/webplayer/

これが今回のサンプルの完成形

グラウンドとボール、ブロックだけのシンプルなものです。

Unity を起動し、[File]_[New Project] でプロジェクトを新規作成をしたら TestScene という名前のシーンを保存します。


Hierarchy

このような GameObject 構成です。それぞれの作成方法は―

Player となるボール Sphere を作成
[GameObject]_[Create Other]_[Sphere]
Sphere に Rigidbody コンポーネントを追加
[Component]_[Physics]_[Rigidbody]
Sphere から Player に名前を変更。
(名前は、適当なもので OK です。)


Ground となる Cube を作成
[GameObject]_[Create Other]_[Cube]
Scale を調整して、地面とみたてます。


ブロック となる Cube を作成
[GameObject]_[Create Other]_[Cube]
Cube に Rigidbody コンポーネントを追加
[Component]_[Physics]_[Rigidbody]

Inspector の Mass で、Cube の質量を調整します。
値が小さくなると軽い Cube となります。
Cube を複製してブロックを積み上げます。
それぞれの Cube の Scale を調整して、縦長、横長のブロックを用意します。


明りとなる Point Light を作成
[GameObject]_[Create Other]_[Point Light]
GameObject がよくみえるところに配置してください。


ボールを発射する

PlayerConntroller となる空の GameObject を作成
[GameObject]_[Create Empty]

Project に JavaScript ファイルを作成します。
Project [右クリック]_[Create]_[JavaScript]

PlayerController.js

var player : GameObject;
var shootPowerX : float = 400.0;
var shootPowerY : float = 400.0;
function Update () {
	if ( Input.GetButtonDown("Fire1") ) {
		player.rigidbody.AddForce(shootPowerX, shootPowerY, 0);
	}
}

マウスクリックされたら、player に対して、力を加えるという簡単なお仕事です。

PlayerController.js を Hierarchy の PlayerConntroller(空の GameObject) にドラッグ&ドロップします。
自作のコンポーネントをつくり、GameObject に対して適応させたということになります。
Hierarchy の PlayerConntroller を選択すると Inspector にコンポーネントのパラメータが表示されます。

Player のところに Hierarchy の Player をドラッグしましょう。


リセットボタンをつくる

空の GameObject を作成
[GameObject]_[Create Empty]
名前を Trigger とします。

Project に JavaScript ファイルを作成します。
Project [右クリック]_[Create]_[JavaScript]
名前を Trigger.js とします。

Trigger.js

function OnGUI () {
	if ( GUI.Button(Rect(10, 10, 50, 50), "Reset") ) {
		Application.LoadLevel("TestScene");
	}
}

Reset ボタンをクリックしたら、シーンを再読み込みをするものです。

Trigger.js を Hierarchy の Trigger(空の GameObject) にドラッグ&ドロップします。


デモ

Demo
画面をクリックするとボールが発射します。

ブラウザでも確認できるように Unity の Web プレイヤーで書きだしています。
Unity Web Player ダウンロード
http://unity3d.com/webplayer/


ボールやブロックの数や設定を調整することで面白いゲームがつくれると思います。
Unity のゲームエンジンの可能性がなんとなくつかめたでしょうか。
Unity は 3D 描画や物理演算に加えて、パーティクルなどの GUI もそろっています。

今年の夏休みの自由研究は、Unity で決まりです!

爆速! Unity でアングリーバード的なゲームをつくる。

海賊王をめざす男 マツです。こんにちは。 最新各地で動きのある Unity ですが、初歩の進めとしてアングリーバード的なゲームをつくる簡単なデモを紹介します。 【Demo】 画面をクリックするとボー…

MobileSocial

海賊王をめざす男 マツです。こんにちは。

Unity で iPhone & Android アプリをつくろう。

Unity for iPhone and Android
http://unity3d.com/japan/mobile.html

Unity Spring 2010 Highlight Reel from Unity3D on Vimeo.

Unity は、本格的なゲームの開発を誰でも可能にすることを目標に作られたゲーム開発ツールです。
iPhone や Android などのプラットフォームに対して効率よくゲームを提供することが可能です。


ダウンロード

UNITY: Download and Start Creating Games
http://unity3d.com/unity/download/


Unity から MonoDevelop を関連付ける

Unity といっしょにインストールされる MonoDevelop を Unity のエディタとして関連付けます。

Windows の場合
Unity [Edit]_[Preferences]_[External Script Editor]
Unity\MonoDevelop\bin\MonoDevelop.exe を選択

Mac の場合
Unity [Unity]_[Preferences]_[External Script Editor]
アプリケーション/Unity/MonoDevelop.app を選択

これで、Unity の Project パネルから js, C# ファイルを MonoDevelop で開くことができます。


Mac MonoDevelop の GUI 日本語 文字化け対応

MonoDevelop.app を右クリックで、[パッケージの内容を表示]
/Contents/Frameworks/Mono.framework/Versions/Current/etc/gtk-2.0/gtkrc
font = "Lucida Grande 12"
の下に
font_name ="Hiragino Kaku Gothic Pro 12"
を追加する。

sd-tech: MonoDevelop(Unity) for Macの日本語文字化けを直す
http://www.sd-tech-blog.com/2011/01/monodevelopunity-for-mac.html


Mac MonoDevelop の 日本語 文字化け対応(表示)

MonoDevelop [Prefarences]_[テキストエディタ]_[一般]_[フォント]_[カスタム]
"Hiragino Kaku Gothic Pro W3, 12" を選択。
ただし、表示だけで、直接 日本語の入力はできません。テキストエディット等をコピペで入力は可能。


デバッグ

ブレークポイントを指定してデバッグするには、Unity を MonoDevelop から起動する必要があるみたいです。一度、Unity を閉じて、
MonoDevelop [Run]_[Debug] を実行すると Unity が起動して、デバッグが開始します。


Unity の基本

Unity は、GameObject と Component の関係を理解することがまず一歩目。

Component
メッシュ、マテリアル、地形データ、パーティクルシステムなどの描画要素を表します。
カメラ、ライトなどの抽象的なものもあります。

GameObject
Componentのコンテナ。
全ての GameObject は、位置と向きを指定する transform コンポーネントを持ちます。
複数の Component をひとつの GameObject に付加できます。また、複数のスクリプトも格納できます。
しかし、パーティクルシステムを定義するようなコンポーネントは、1つの GameObject に1つだけです。
もし、複数のパーティクルシステムを使用したい場合は、ゲームオブジェクトを階層化し、複数がパーティクルシステムを保持するようにします。

Prefabs
テンプレート定義されたアセット。
Project で、Prefabs をクリックし、設定(Inspector)を変更すると Scene 中の全てのインスタンスに即座に適応されます。
ゲームに登場する敵など再利用可能な要素。敵の動きを変更したい場合、Scene 中のそれぞれの敵の設定を変更するのではなく、
オリジナルの Prefab に設定されたスクリプトを変更すれば OK です。
Scene 中の特定のインスタンスだけに個別に設定を行うことも可能です。


Flash 技術者のための Unity 講座

Unity for Flash Developers - Tutorial 1

Unity for Flash Developers - Tutorial 1 from Richard Hart on Vimeo.

こちらに Flash 技術者のための Unity のチュートリアル動画があります。動画は、Tutorial 1 ~ Tutorial 7 まであります。
Flash Lite や AS2 以降の Flash 経験者であれば、理解できる内容になっています。

Unity は、C#, または js でコードを書きます。

例)Project にある Prefab を動的に生成するには、Instantiate を使用します。

var object:GameObject;	// Prefab
var instance:GameObject = Instantiate(object, transform.position, transform.rotation);

例)Instantiate は最上層に生成されるので親となる GameObject を指定します。

var object:GameObject;	// Prefab
var parentObject:GameObject;
var instance:GameObject = Instantiate(object, transform.position, transform.rotation);
instance.transform.parent = parentObject.transform;

例)Scene 中にある GameObject を削除します。削除する GameObject 名と何秒後を指定します。

Destroy(gameObject.Find("Hoge"), 3);

例)Scene 遷移

Application.LoadLevel("シーン名");

例)Scene 中にある Hand ( GameObject ) の OtherScript ( Component ) の変数 foo に値をセットします。

transform.Find("Hand").GetComponent(OtherScript).foo = 2;

例)Scene 中にある Hand ( GameObject ) の OtherScript ( Component ) のメソッド DoSomething に引数 ("Hello") で実行します。

transform.Find("Hand").GetComponent(OtherScript).DoSomething("Hello");

Unity Script Reference ? Overview: Accessing Other Game Objects
http://unity3d.com/support/documentation/ScriptReference/index.Accessing_Other_Game_Objects.html


iTween

iTween for Unity by Bob Berkebile (pixelplacement)
http://itween.pixelplacement.com/index.php

Unity に移植された Tweener ライブラリです。Plugins に設置して使用できます。

使用例


iTween.MoveTo(gameObject,{"x":3,"time":4,"delay":1,"onupdate":"myUpdateFunction","looptype":"pingpong"});
iTween.MoveTo(gameObject,Vector3(2,0,0),2);

iTween ドキュメント
http://itween.pixelplacement.com/documentation.php


Unity はじめてみて

以前、Android で OpenGL でつくったゲームと同じ内容のものを Unity でつくってみたのですが、1 週間かかったものを 数時間でつくることができました。
ガラケーからスマホへという流れで、ゲーム開発に必要だったものは、Flash と同等(それ以上)の表現力、そして iPhone と Android の同時リリースといったものが挙げられます。
Unity は今後のゲーム開発の鍵となるでしょう。毎日が発見の連続で、Flash をはじめてさわったワクワク感を思い出します。
これからも Unity の情報を載せていきたいと思います。

Unity はじめました。

海賊王をめざす男 マツです。こんにちは。 Unity で iPhone & Android アプリをつくろう。 Unity for iPhone and Android http://unity3d…

Android

海賊王をめざす男 マツです。こんにちは。

Flash Builder Burrito で Android アプリを開発しました。

WORDDICT!-ワーディクト - Android マーケット
https://market.android.com/details?id=air.Worddict

「WORDDICT!」は、画面に並ぶアルファベットから、英単語を見つけては指でなぞってつないでいく英単語パズルゲームです。
ゲームは、『お菓子を奪いに来る悪役バグバグから、お菓子を守れ!』というストーリーのもとに展開。
英単語をつくらなければ、時間の経過とともに画面上の文字がバグバグのテリトリーに変わっていきます。
ユーザーはアルファベットの配置を入れ替えながら、できるだけ多くの英単語をつくって悪役から自分のテリトリーを守り、高得点を目指すゲームです。
単語の最後のアルファベットを使い、続けて英単語をつくる「連鎖(チェイン)」といった技を連発したり、長い単語をつくることで高得点を得ることができます。

今回チャレンジしたことは、ふたつです。

・AIR for Android をつくる。
・パズルゲームをつくる。


AIR for Android をつくる。

Flash Builder Burrito で、AIR for Android を制作しました。過去のリソースが使用できるのが最大のポイント。
Flex SDK 4.5 の Spark コンポーネントには、モバイルに最適化されていないものも含まれているので、注意が必要です。
また、端末によってタッチ イベントの精度が違うということも十分に調べておかないといけません。
エミュレータによるデバッグも可能となっています。タッチイベントは、端末でないとテストできない様です。
また端末によるデバッグは、私の環境だとできたりできなかったりします。
android-sdk の tools ディレクトリにある ddms.bat( Dalvik Debug Monitor )を起動するとデバッグできる!
とおもったら次の日にはできなくなっていたり...。要調査です。
AIR for Android のパフォーマンスは、現時点ではネイティブのそれよりも もっさり感があります。
アニメーションのパフォーマンスの向上には、FlashLite の知識が役に立ちました。
同時に Flash のタイムラインによる表現をネイティブの Java 環境でも実現させる試みも検証されました。
スクリプトによる表現と画像をつなぎ合わせたコマアニメの表現のバランスが鍵となる感じです。


パズルゲームをつくる。

ゲーム開発で学んだこと、それはとにかくモックで面白いと思えるところをまずつくれ!ということです。
まだゲームの面白さが曖昧なまま、ゲームシステムをがっつりつくってしまうと後の変更が大変に。
システムの方ばかり気になって、ゲームの演出や面白いところを開発の終盤の方にもっていってしまうと
「ここはこうしたほうがいいよね」という仕様変更になかなか対応できなくなってしまいます。
今回はまさにその典型的なパターンにハマりました。
文字つなげてワードをつくるという漠然としたコンセプトだけだったのですが、文字をチェンジできる仕組みやシャッフルなど、技術者の方から上がってきました。
ちなみに、「WORDDICT!」のバグバグといったキャラクターの世界観が出来上がったのは、リリースの2週間前です。テスト期間を除くと1週間ほどでこのゲームの面白い演出を加えたことになります。
それまでは、無機質なグリッド上に文字が並んでいるだけのものでした。やはり、開発の終盤に面白いところをあてるとゲームシステムやレベルデザインに大きく影響することがわかりました。
ゲームの面白いところは、まず最初につくる!システムは後!これが今回学んだことです。


Android Market 公開するも端末からマーケット検索できない

アプリを公開して、さぁインストール!とおもったら、あれ?端末の Android Market で検索かけてもヒットしない。なんだろう。

それならばと、PC のブラウザから、Android Market を開き
[インストール]ボタンを押してインストールする端末を選択するウィンドウが開くのですが、
「このアイテムはお使いの端末と互換性がありません」
となってしまい Android Market からインストールすることができませんでした。

互換性がありませんといわれた機種(社内確認)
・HTC Desire HD
・Xperia arc
・Galaxy S
・NexusS
・SIRIUS α IS06

互換性があり、インストールできた機種(社内確認)
・Nexus One
・HTC Desire X06HTII

互換性がありませんといわれた機種は、端末の Android Market でアプリ検索の対象になっていないみたいです。
古い機種がつかえて新しい機種がつかえないことに違和感を感じる。

manifest の設定だろうか? Flex モバイルプロジェクトを作成するとできる Hoge-app.xml に AndroidManifest を記述することができます。そこに SDK のバージョンを設定すればいいのかな?

Adobe?AIR * モバイルデバイス向けの AIR アプリケーションの開発
http://help.adobe.com/ja_JP/air/build/WSfffb011ac560372f-5d0f4f25128cc9cd0cb-7ffe.html#WSfffb011ac560372f-5d0f4f25128cc9cd0cb-7ffc

uses-sdk エレメントを含めることはできません。となっていて指定できません。Android アプリに必要な AndroidManifest.xml は、AIR だとビルド時に自動生成されるみたいで手がだせません。


解決

そういや他の AIR for Android はどうなんだろう。インストールできるものあるなと思っていたら、他のスタッフのひとりが気になる点をみつけてくれました。

---
なんか僕、
さっき頂いたapkは解凍したりして
中のandroidmanifest.xmlを読んでいるのですが、
そのタグあったんでひょっとしたら・・
---

みつけてくれた記事
「アメーバピグ for Android」 開発事例 | デベロッパーセンター
http://www.adobe.com/jp/joc/devnet/air/articles/pigg_ameba.html

「ギャラクシー端末からマーケット検索できない現象がありましたので5 方向ナビゲーション制御の設定は記述しませんでした。」というところ

確認すると Hoge-app.xml に確かに記述しています。


これがいけませんでした。方向ナビゲーション制御の設定が紛れ込んでいたので削除することで無事、互換性ありと Android Market にみとめてもらえました。よかった。


Adoobe AIR がすでにインストールされている場合

さて、いよいよ公開されたアプリをインストールします。

1. Android Market から、「WORDDICT!」をインストールする

2. インストール後、「WORDDICT!」を開始する。


AIR をインストールしていない状態で、AIR for Android アプリ「WORDDICT!」をインストールする

AIR for Android のアプリを使用するには、Adobe AIR を別途インストールしていないといけません。

1. Android Market から、「WORDDICT!」をインストールする

2. インストール後、「WORDDICT!」を開始する。

3. 「このアプリケーションを使用するには Adoobe AIR が必要です。今すぐ Adobe AIR をインストールしますか?」というメッセージが表示されます。

4. [インストール]ボタンをクリックすると Android Market の Adoobe AIR のページに移動します。

5. Adoobe AIR をインストール

6. 「WORDDICT!」起動OK


Android Market からインストールできた機種(社内確認)

・HTC Desire HD
・HTC Desire X06HTII
・Xperia arc
・Galaxy S
・NexusS
・Nexus One
・SIRIUS α IS06

上記以外にも、Android OS 2.2 の機種で、Flash Player 10.1 以上が動作する端末がインストール可能です。

HTC Aria は、Android OS 2.2 ですが、ハード的な問題でインストール対象外機種となっています。

米Adobe社は『Flash Player 10.1』の動作環境として、OSにAndroid 2.2とCPUに『ARMv7-A』以上で、ベクター浮動小数点演算(FPU)がハードウェアで実行可能なことと記載しています。
Android 2.2だからといって『Flash Player 10.1』が動くわけではない - ガジェット通信
http://getnews.jp/archives/89453


まとめ

改善の余地はありますが、AIR for Android の可能性を感じることができました。
Flash Builder 4.5 では、iOS への対応も可能になる様ですし、今後に期待です。

iOS, Android などクロスプラットフォームでの開発がこれからどんどん需要がでてくると思います。
ネイティブはもちろんのこと、AIR や Corona、Unity といった選択肢がある分岐点なのかもしれません。

ゲーム開発は、まず面白いところからつくる。技術を身に着けてしまうとマネージャークラスなどそちらのシステム設計にとりかかってしまいがちですが、ゲームの本質的な「面白い」ところを忘れてはいけません。
ゲーム開発には仕様変更がつきものです。ゲームの面白さを後回しにするとガラッと仕様変更が発生した場合、システム全体を見直す必要がでてきてしまいます。ゲームをつくること自体が面白いパズルの様なものかもしれませんね。

AIR for Android でお菓子なパズルゲーム「WORDDICT!」

海賊王をめざす男 マツです。こんにちは。 Flash Builder Burrito で Android アプリを開発しました。 WORDDICT!-ワーディクト - Android マーケット h…

Android

海賊王をめざす男 マツです。こんにちは。

Corona で、タップするとその位置に画像が追加され、地面に落下するアプリをつくってみます。

local screenW, screenH = display.contentWidth, display.contentHeight
local physics = require("physics")
physics.start()
display.setStatusBar( display.HiddenStatusBar )
local ground = display.newImage( "ground.png" )
ground.x = 160; ground.y = 445
physics.addBody( ground, "static", { friction=0.5, bounce=0.3 } )
local scaleFactor = 1.0
local physicsData = (require "matsu").physicsData(scaleFactor)
local matsuShape = display.newImage("matsu.png")
physics.addBody( matsuShape, physicsData:get("matsu") )
matsuShape.x = screenW / 2;
matsuShape.y = matsuShape.height / 2;
local xyText = display.newText( "xy", 0, 0, native.systemFont, 24 )
xyText.x = display.contentWidth / 2
xyText.y = 0
xyText:setTextColor( 255,110,110 )
local idText = display.newText( "id", 0, 0, native.systemFont, 24 )
idText.x = display.contentWidth / 2
idText.y = 30
idText:setTextColor( 255,110,110 )
system.activate( "multitouch" )
-- Display the Event info on the screen
local function showEvent( event )
	xyText.text = "(" .. event.x .. "," .. event.y .. ")"
	idText.text = "Id: " .. tostring( event.id )
end
local function onTouch( event )
	local t = event.target
	showEvent( event )
	local phase = event.phase
	-- タッチ 開始
	if "began" == phase then
		display.getCurrentStage():setFocus( t )
		t.isFocus = true
		-- 最初の位置を保存
		t.x0 = event.x - t.x
		t.y0 = event.y - t.y
	-- タッチ フォーカス中
	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
			display.getCurrentStage():setFocus( nil )
			t.isFocus = false
		end
	end
	return true
end
local function otherTouch( event )
	print( "otherTouch: event(" .. event.phase .. ") ("..event.x..","..event.y..")" .. tostring(event.id) )
	local s = display.getCurrentStage()
	if "began" == event.phase then
		showEvent( event )
		local scaleFactor = 1.0
		local physicsData = (require "matsu").physicsData(scaleFactor)
		local matsuMiniShape = display.newImage("matsu_mini.png")
		physics.addBody( matsuMiniShape, physicsData:get("matsu_mini") )
		matsuMiniShape.x = event.x;
		matsuMiniShape.y = event.y;
		matsuMiniShape.isFocus = true
		matsuMiniShape.id = event.id
		matsuMiniShape:addEventListener( "touch", onTouch )
		--event.target = matsuMiniShape
	end	
end
Runtime:addEventListener( "touch", otherTouch )
matsuShape:addEventListener( "touch", onTouch )

ここで注目するのは、physicsData に外部 matsu.lua ファイルを使用しているところ。

local physicsData = (require "matsu").physicsData(scaleFactor)


matsu.lua

-- This file is for use with Corona Game Edition
--
-- This file is automatically generated with PhysicsEdtior (http://physicseditor.de). Do not edit
--
-- Usage example:
--			local scaleFactor = 1.0
--			local physicsData = (require "shapedefs").physicsData(scaleFactor)
--			local shape = display.newImage("objectname.png")
--			physics.addBody( shape, physicsData:get("objectname") )
--
-- copy needed functions to local scope
local unpack = unpack
local pairs = pairs
local ipairs = ipairs
module(...)
function physicsData(scale)
	local physics = { data =
	{ 
		["matsu"] = {
				{
					density = 2, friction = 0.3, bounce = 0.3, 
					filter = { categoryBits = 1, maskBits = 65535 },
					shape = {   33, 29.5  ,  49.5, 21  ,  53.5, 45  }
				}  ,
				{
					density = 2, friction = 0.3, bounce = 0.3, 
					filter = { categoryBits = 1, maskBits = 65535 },
					shape = {   49.5, 21  ,  61.5, 8  ,  65.5, 34  }
				}  ,
				{
					density = 2, friction = 0.3, bounce = 0.3, 
					filter = { categoryBits = 1, maskBits = 65535 },
					shape = {   -40.5, 28  ,  -30, 31.5  ,  -33.5, 39  }
				}  ,
				{
					density = 2, friction = 0.3, bounce = 0.3, 
					filter = { categoryBits = 1, maskBits = 65535 },
					shape = {   -43.5, 62  ,  -36, 48.5  ,  -24.5, 44  ,  29, 30.5  ,  30, 48.5  ,  -40.5, 72  ,  -45.5, 68  }
				}  ,
				{
					density = 2, friction = 0.3, bounce = 0.3, 
					filter = { categoryBits = 1, maskBits = 65535 },
					shape = {   -24.5, 44  ,  -36, 48.5  ,  -30, 42.5  }
				}  ,
				{
					density = 2, friction = 0.3, bounce = 0.3, 
					filter = { categoryBits = 1, maskBits = 65535 },
					shape = {   71, 14.5  ,  65, 5.5  ,  71.5, 3  ,  76.5, 17  }
				}  ,
				{
					density = 2, friction = 0.3, bounce = 0.3, 
					filter = { categoryBits = 1, maskBits = 65535 },
					shape = {   -73.5, 3  ,  -66, 5.5  ,  -73.5, 16  ,  -77.5, 16  }
				}  ,
				{
					density = 2, friction = 0.3, bounce = 0.3, 
					filter = { categoryBits = 1, maskBits = 65535 },
					shape = {   34.5, 72  ,  -42, 89.5  ,  -40.5, 72  ,  30, 48.5  ,  39.5, 68  }
				}  ,
				{
					density = 2, friction = 0.3, bounce = 0.3, 
					filter = { categoryBits = 1, maskBits = 65535 },
					shape = {   -42, 89.5  ,  34.5, 72  ,  36, 89.5  }
				}  ,
				{
					density = 2, friction = 0.3, bounce = 0.3, 
					filter = { categoryBits = 1, maskBits = 65535 },
					shape = {   65, 5.5  ,  -55, -70.5  ,  -39, -81.5  ,  15, -89.5  ,  33, -82.5  ,  67.5, -43  ,  71.5, -25  ,  71.5, 3  }
				}  ,
				{
					density = 2, friction = 0.3, bounce = 0.3, 
					filter = { categoryBits = 1, maskBits = 65535 },
					shape = {   67.5, -43  ,  33, -82.5  ,  56.5, -64  }
				}  ,
				{
					density = 2, friction = 0.3, bounce = 0.3, 
					filter = { categoryBits = 1, maskBits = 65535 },
					shape = {   -73.5, -35  ,  -64.5, -59  ,  -66, 5.5  ,  -73.5, 3  }
				}  ,
				{
					density = 2, friction = 0.3, bounce = 0.3, 
					filter = { categoryBits = 1, maskBits = 65535 },
					shape = {   15, -89.5  ,  -39, -81.5  ,  -13, -90.5  }
				}  ,
				{
					density = 2, friction = 0.3, bounce = 0.3, 
					filter = { categoryBits = 1, maskBits = 65535 },
					shape = {   33, 29.5  ,  29, 30.5  ,  61.5, 8  ,  49.5, 21  }
				}  ,
				{
					density = 2, friction = 0.3, bounce = 0.3, 
					filter = { categoryBits = 1, maskBits = 65535 },
					shape = {   -64.5, -59  ,  -55, -70.5  ,  65, 5.5  ,  29, 30.5  ,  -30, 31.5  ,  -40.5, 28  ,  -55, 18.5  ,  -66, 5.5  }
				}  ,
				{
					density = 2, friction = 0.3, bounce = 0.3, 
					filter = { categoryBits = 1, maskBits = 65535 },
					shape = {   -21.5, 38  ,  29, 30.5  ,  -24.5, 44  }
				}  ,
				{
					density = 2, friction = 0.3, bounce = 0.3, 
					filter = { categoryBits = 1, maskBits = 65535 },
					shape = {   -30, 31.5  ,  29, 30.5  ,  -21.5, 38  }
				}  ,
				{
					density = 2, friction = 0.3, bounce = 0.3, 
					filter = { categoryBits = 1, maskBits = 65535 },
					shape = {   29, 30.5  ,  65, 5.5  ,  61.5, 8  }
				}  
		}
		, 
		["matsu_mini"] = {
				{
					density = 2, friction = 0.5, bounce = 0.5, 
					filter = { categoryBits = 1, maskBits = 65535 },
					shape = {   11.5, 12.5  ,  20, 10  ,  20, 18  }
				}  ,
				{
					density = 2, friction = 0.5, bounce = 0.5, 
					filter = { categoryBits = 1, maskBits = 65535 },
					shape = {   20, 10  ,  23.5, 4.5  ,  25.5, 12.5  }
				}  ,
				{
					density = 2, friction = 0.5, bounce = 0.5, 
					filter = { categoryBits = 1, maskBits = 65535 },
					shape = {   -12.5, 16.5  ,  14.5, 34.5  ,  -16, 35  ,  -18.5, 25.5  }
				}  ,
				{
					density = 2, friction = 0.5, bounce = 0.5, 
					filter = { categoryBits = 1, maskBits = 65535 },
					shape = {   -30.5, -9.5  ,  -26.5, -23.5  ,  -26, 3  ,  -30.5, 6.5  }
				}  ,
				{
					density = 2, friction = 0.5, bounce = 0.5, 
					filter = { categoryBits = 1, maskBits = 65535 },
					shape = {   11.5, 12.5  ,  -19, -31  ,  -8, -36  ,  6, -36  ,  18, -30  ,  26.5, -17.5  ,  23.5, 4.5  ,  20, 10  }
				}  ,
				{
					density = 2, friction = 0.5, bounce = 0.5, 
					filter = { categoryBits = 1, maskBits = 65535 },
					shape = {   -26.5, -23.5  ,  -19, -31  ,  11.5, 12.5  ,  15.5, 26.5  ,  14.5, 34.5  ,  -12.5, 16.5  ,  -26, 3  }
				}  ,
				{
					density = 2, friction = 0.5, bounce = 0.5, 
					filter = { categoryBits = 1, maskBits = 65535 },
					shape = {   23.5, 4.5  ,  26.5, -17.5  ,  29.5, 6.5  }
				}  
		}
	} }
	-- apply scale factor
	local s = scale or 1.0
	for bi,body in pairs(physics.data) do
		for fi,fixture in ipairs(body) do
			for ci,coordinate in ipairs(fixture.shape) do
				fixture.shape[ci] = s * coordinate
			end
		end
	end
	function physics:get(name)
		return unpack(self.data[name])
	end
	return physics;
end

これは、サードパーティ製の PhysicsEditor というソフトからビルドしたファイルです。


PhysicsEditor

PhysicsEditor | Edit your box2d and chipmunk shapes with ease
http://www.physicseditor.de/

透過 png のアウトラインパスを解析して .lua ファイルに書き出すソフトです。
これで、物理演算などのオブジェクトの形状衝突に利用できます。


実行すると画面をタップした場所にオブジェクトが追加され、地面に向かって落下するアプリが実行できました。


Corona をつかってみて

Flash をやってきた方にはとてもとっつきやすい感じです。

心配なこととして、

Corona SDK は、Android 2.1以下のサポートをしない方向で動いているみたいです。
http://developer.anscamobile.com/forum/2011/03/01/android-update-please-read


現状 Corona は、ビルドの際に Ansca 社(Corona 開発元)のサーバーを見に行くようです。
なので、Ansca 社のサーバーがなんらかの理由(メンテナンスなど)で利用できないことがあるとビルドができないということになります。
Corona のバージョンアップは、サーバーのバージョンアップと同義なので、過去に Corona でつくったものがビルドできないということになりかねないです。
ビルド時に旧バージョンのものも選択できるように、日本コロナの会のみなさんが積極的に Ansca 社に働きかけているので解決できるといいですね。

日本コロナの会
https://groups.google.com/group/coronaja?hl=ja


Corona は魅力あるソフトなのでこれからもその動向を追ってみます!

Corona で スマートフォン アプリ開発をしよう。開発編

海賊王をめざす男 マツです。こんにちは。 Corona で、タップするとその位置に画像が追加され、地面に落下するアプリをつくってみます。 local screenW, screenH = displ…

Android

海賊王をめざす男 マツです。こんにちは。

Corona で、HelloWorld を表示させます。

新規 Lua Project を作成します。
Eclipse [ファイル]_[新規]_[New Lua Project]

プロジェクト名
HelloWorld

Eclipse [ファイル]_[新規]_[その他]

[Lua]_[New Lua File]
main.lua

local myText = display.newText( "Hello, World!", 0, 0, native.systemFont, 40 )
myText.x = display.contentWidth / 2
myText.y = display.contentWidth / 4
myText:setTextColor( 255,110,110 )


config.lua

application =
{
	content =
	{
		width = 320,
		height = 480,
		scale = "letterbox" -- zoom to fill screen, possibly cropping edges
	},
}

ここで、Corona で動作確認をします。HelloWorld プロジェクトの main.lua を開きます。
(Corona で実行するのは main.lua じゃないといけないみたいです。)

HelloWorld 表示されました。

次は、画像(world.jpg)を表示しましょう。

main.lua

local background = display.newImage( "world.jpg" )
local myText = display.newText( "Hello, World!", 0, 0, native.systemFont, 40 )
myText.x = display.contentWidth / 2
myText.y = display.contentWidth / 4
myText:setTextColor( 255,110,110 )

画像が表示されました。

こんな感じに Flash 感覚で、Android, iPhone とも同じソースからつくれるのは、Corona の魅力ですね。

Corona で スマートフォン アプリ開発をしよう。HelloWorld 編

海賊王をめざす男 マツです。こんにちは。 Corona で、HelloWorld を表示させます。 新規 Lua Project を作成します。 Eclipse [ファイル]_[新規]_[New L…

Android

海賊王をめざす男 マツです。こんにちは。

Corona は、Adobe で FlashLite を開発してた人たちによって設立された AnscaMobile 社が提供するゲーム開発用 SDK です。同じソースから iPhone, Android といったスマートフォンのアプリが開発できます。
iPhone 用だったので開発は mac マシンがないとできなかったのですが、Android の普及で Windows でも開発が可能になりました。また、トライアル使用が 30 日間限定だったが、無期限になりました。

Corona: The fastest and easiest way to create mobile apps
http://jp.anscamobile.com/corona/


Corona インストール

今回は、Windows 環境でのインストール。

Corona SDK on Windows BETA
http://developer.anscamobile.com/subscribe-registration?destination=downloads/corona-sdk

Shining Light Productions - Win32 OpenSSL
http://www.slproweb.com/products/Win32OpenSSL.html

Java SE ダウンロード - Sun Developer Network (SDN)
http://java.sun.com/javase/ja/6/download.html

現状 JDK は、32 bit 版でないと Corona が動かない様です。


システムの詳細設定

コントロール パネル\すべてのコントロール パネル項目\システム

システムの詳細設定
[詳細設定]_[環境変数]
[システム環境設定]_[Path]編集
C:\Program Files\Java\jdk1.6.0_23\bin;
を追加。


サンプル

サンプルをうごかしてみます。

Corona を起動するとサンプルリストが表示されます。

Examples から Bridge を選択するとアプリが起動します。うごいたー。

ちなみにサンプルファイルは、
C:\Program Files\Ansca\Corona Simulator\Sample Code
の中に入っています。

.lua ファイルは、テキストエディタでも編集可能ですが、せっかくなので、Lua 開発用の Eclipse プラグインを導入しましょう。


Eclipse プラグイン

Corona は、Lua という言語で作成します。

Corona Project Manager
http://coronaprojectmanager.com/

Corona Project Manager というのもありますが、今回は、Eclipse で開発できるように Lua 用プラグインをインストールします。Eclipse ということで、Flash Builder でも OK です。

LuaForge: LuaEclipse: Project Filelist
http://luaforge.net/frs/?group_id=9

ダウンロードし、解凍すると features, plugins フォルダができるので、それらを eclipse の features および plugins にコピーします。

Eclipse [ヘルプ]_[新規ソフトウェアをインストール]

[追加]ボタン

LuaEclipse Update Site
http://luaeclipse.luaforge.net/update-site/site.xml

LuaEclipse 1.2
Lua Development Tool 1.2.0.200802220021
LuaProfiler Support for LuaEclipse 1.0.0.200802220021

を選択してインストールします。


Lua インタプリタ

Lua Binaries Download
http://luabinaries.sourceforge.net/download.html

Windows
lua5_1_4_Win32_bin.zip

C:\Program Files\Eclipse\LuaBinaries
に解凍。

Eclipse [ウィンドウ]_[設定]_[Lua]_[Installed Interpreters] Add ボタンで追加する。
Name
lua5.1
Path
C:\Program Files\Eclipse\LuaBinaries\lua5.1.exe

mac の場合
Name:
lua5.1
Path:
/Developer/Applications/lua5_1_4_MacOS106_bin/lua5.1

追加した lua5.1 にチェックし、[OK]ボタン。

これで、開発環境は整いました。

Corona で スマートフォン アプリ開発をしよう。インストール編

海賊王をめざす男 マツです。こんにちは。 Corona は、Adobe で FlashLite を開発してた人たちによって設立された AnscaMobile 社が提供するゲーム開発用 SDK です。…

Android

海賊王をめざす男 マツです。こんにちは。

AIR for Android で欠かせないイベントであるタッチイベントについて調べてみました。


タッチ(一瞬で離す)

Begin
End
Tap

一瞬だと Move, RollOver, Over, Out, RollOut が呼ばれません。


タッチ(ゆっくり離す)

Begin
Move
RollOver
Over
---
Move
Move
Move
---
End
Tap
Out
RollOut

タッチして、オブジェクト上を動く間 Move が続きます。


タッチ→ドラッグアウト

Begin
Move
RollOver
Over
---
Move
Move
Move
---
Out
RollOut

タッチして、ドラッグアウトするまでオブジェクト上を動く間 Move が続きます。
ドラッグアウトでは、End, Tap が呼ばれません。


ドラッグイン→ドラッグアウト

Move
RollOver
Over
---
Move
Move
Move
---
Out
RollOut

ドラッグしながらオブジェクトに触れると Begin が呼ばれません。
そのままドラッグしながらオブジェクトを通過すると End, Tap が呼ばれません。


これらのイベントが発動する条件を理解することで、より良いアプリ制作が可能になりますね。

AIR for Android でタッチイベントが実行される順番

海賊王をめざす男 マツです。こんにちは。 AIR for Android で欠かせないイベントであるタッチイベントについて調べてみました。 タッチ(一瞬で離す) Begin End Tap 一瞬だと…

Android

海賊王をめざす男 マツです。こんにちは。

AIR for Android で mp3 を再生する方法として、以下の2通りを比べてみました。

・Embed した mp3 を Sound として再生する
・SoundEffect コンポーネントを利用する


Embed した mp3 を Sound として再生する

import flash.media.Sound;
[Embed(source="assets/se/GridTouch.mp3")] public var GridTouch:Class;
private var _gridTouchSound:Sound = new GridTouch() as Sound;
// mp3 再生
_gridTouchSound.play();


SoundEffect コンポーネントを利用する


SoundEffect はまだ spark コンポーネントで提供されていないので、mx コンポーネントのものを使用。

AIR for Android 用に最適化されたものではないせいか、SoundEffect による mp3 の再生は、若干重い気がしました。


AIR for Androidでの効果音の再生方法 - PHP,MySQL,Flexな日々+イラストとか
http://d.hatena.ne.jp/haru-komugi/20101109/1289279599

AIR for Android で mp3 を再生する

海賊王をめざす男 マツです。こんにちは。 AIR for Android で mp3 を再生する方法として、以下の2通りを比べてみました。 ・Embed した mp3 を Sound として再生する…