09-03 PhysicsHandler のメソッド – 2

CatmullRomMoveModifierConfig にどはまり。。。orz

結果として、ソースファイルにミスがあって、修正しないと使えないメソッドでした。
修正箇所は下のファイルの (ここっ!) に static を入れます。
※2013/02/21 現在のお話です。git でダウンロードした人は修正済みのはずですが zip の場合は最新版をダウンロードしてもダメでした。
AndEngine-GLES2\src\org\andengine\entity\modifierCatmullRomSplineMoveModifier.java

// 修正前
public (ここっ!) class CatmullRomMoveModifierConfig extends CardinalSplineMoveModifierConfig {

↓↓↓

// 修正後
public static class CatmullRomMoveModifierConfig extends CardinalSplineMoveModifierConfig {

 

以下は見つけるまで苦労したのでメモです 😉

CardinalSplineMoveModifier とまったく同じ方法でやっていたのですが

private static final CatmullRomMoveModifierConfig pCatmullRomMoveModifierConfig = new CatmullRomMoveModifierConfig(5);

↑のところでエラー。。。

No enclosing instance of type CatmullRomSplineMoveModifier is accessible. Must qualify the allocation with an enclosing instance of type CatmullRomSplineMoveModifier (e.g. x.new A() where x is an instance of CatmullRomSplineMoveModifier).

ご丁寧に CatmullRomSplineMoveModifier の instance だから “x.new A()” って感じで書いてね!って出てくれてたので “CatmullRomSplineMoveModifier.new CatmullRomMoveModifierConfig()” とかやってみてもダメで。。。
調べると

January 11, 2013
nicolasgramlich closed issue nicolasgramlich/AndEngine#195
Minor but important fix in CatmullRomMoveModifierConfig
https://github.com/nicolasgramlich/AndEngine/issues/195 のやり取りで、public → static になったんだ~

というところまでは分かったのですが、いかんせん java(というか オブジェクト指向を) を知らないので static に代わるとどうなるのかわかりません X(
てことで static を調べまくって。。。。 むしろ static の方がいちいち instance 生成(?)しなくてもいいのかー。。。とか ↓ のように
http://stackoverflow.com/questions/4413000/how-do-i-properly-delcare-an-instance-of-a-subclass-in-java

private static CatmullRomSplineMoveModifier pCatmullRomSplineMoveModifier = new CatmullRomSplineMoveModifier().new CatmullRomMoveModifierConfig(); 
private static CatmullRomSplineMoveModifier pCatmullRomSplineMoveModifier = new CatmullRomSplineMoveModifier();
private static CatmullRomSplineMoveModifier pCatmullRomSplineMoveModifier = CatmullRomSplineMoveModifier.new pCatmullRomSplineMoveModifier();

とかとか、いろいろやりまくってもダメダメ。。。ecilpse さんの修正候補もことごとく外れまくりです X(

唯一、↓はコンパイルエラーにはならなかったですけど、実行すると null pointer…
※これは薄々そうではないかと思ってたのですが(汗

private static CatmullRomSplineMoveModifier pCatmullRomSplineMoveModifier

にっちもさっちもいかなくなり、自分のプログラムではなく自分の環境の AndEngine のソースをじっくり見てみることに。。。

するとっ!

CatmullRomSplineMoveModifier.java

public (ここっ!) class CatmullRomMoveModifierConfig extends CardinalSplineMoveModifierConfig {

static が入ってないじゃないかあああああ!

最新版をダウンロードしてるはずなのに。。。。。orz
今ダウンロードしてもやっぱり修正されていないので github の zip ダウンロードは release 版のみなのですね?
やっぱり git を入れないとダメっぽいですね><

んまぁ、とりあえず動いたのでよしとしますか。。。

09-02 PhysicsHandler のメソッド – 1

setVelocity(float pVelocity)

設定した速度で直線に移動 (値が大きい程早い)

faceSprite.setVelocity(100); // 斜め右下に 100 の速度で移動

値 1 つの場合は X, Y を同時指定

faceSprite.setVelocity(100);

値は X, Y を別々に指定可能

faceSprite.setVelocity(100, 200);

X のみ, Y のみを指定可能

faceSprite.setVelocityX(100); // X のみ指定
faceSprite.setVelocityY(200); // Y のみ指定

 

setAcceleration(float pAcceleration)

指定した加速度で直線に移動 (値が大きい程早く加速する)

faceSprite.setAcceleration(100); // 斜め右下に 100 の速度で加速

 

setAngularVelocity(float pAngularVelocity)

指定した速度で回転 (正:右回転、負:左回転)
 ※このメソッドは X, Y の指定ができません。

faceSprite.setAngularVelocity(100);

 

setEnabled(boolean pEnabled)

 true:移動や回転などがはじまる
 false:移動や回転などが止まる

faceSprite.setEnabled(false);

 

AlphaModifier(float pDuration, float pFromAlpha, float pToAlpha, IEntityModifierListener pEntityModifierListener, IEaseFunction pEaseFunction)

pDuration 時間で pFromAlpha から pToAlpha に変える

faceSprite.registerEntityModifier(new AlphaModifier(5.0f, 0.0f, 1.0f));

 

CardinalSplineMoveModifier(float pDuration, VardinalSplineMoveModifierConfig pCardinalSplineMoveModifierConfig, IEntityModifierListener pEntityModifierListener, IEaseFunction pEaseFunction)

CardinalSplineMoveModifierConfig(int pControlPointCount, float pTension)

pDuration 時間で 指定された point を pTension で指定された緩やかさ(値が大きいほどカクカク、マイナスだと丸びを帯びる感じ)で移動

pControlPointCount で指定した point と setControlPoint した数がアンマッチの場合はエラー

※1.0f でほぼ直線的?、2.0f だとなんかぐるっとバックする。-1.0f だと丸びを帯びて、-2.0f だと 2.0f とは反対方向にぐるっと回る感じでした

AndEngine Examples は -0.5f ~ 0.5f の範囲だったのでそれくらいがちょうどいいのかもです。
とりあえず CardinalSpline を画像検索するとわかりやすいと思います。

private static final CardinalSplineMoveModifierConfig pCardinalSplineMoveModifierConfig = new CardinalSplineMoveModifierConfig(5, -0.5f);

public void move() {
	pCardinalSplineMoveModifierConfig.setControlPoint(0, 120,  60);
	pCardinalSplineMoveModifierConfig.setControlPoint(1, 180, 120);
	pCardinalSplineMoveModifierConfig.setControlPoint(2, 240, 120);
	pCardinalSplineMoveModifierConfig.setControlPoint(3, 300,  60);
	pCardinalSplineMoveModifierConfig.setControlPoint(4, 360, 120);

	this.registerEntityModifier(new CardinalSplineMoveModifier(5.0f, catmullRomMoveModifierConfig));
}

 

CatmullRomSplineMoveModifier(float pDuration, CatmullRomMoveModifierConfig pCatmullRomMoveModifierConfig, IEntityModifierListener pEntityModifierListener, IEaseFunction pEaseFunction)

CatmullRomMoveModifierConfig(int pControlPointCount)

CardinalSplineMoveModifier とほとんど同じですが、CardinalSplineMoveModifier がすべての線がなめらかになるのに対して、CatmullRomSplineMoveModifier は Point 間のみなめらかになるようです。(<1 href="http://markun.cs.shinshu-u.ac.jp/learn/cg/cg3/index5.html">http://markun.cs.shinshu-u.ac.jp/learn/cg/cg3/index5.html ← めっちゃわかりやすかったです)

private CatmullRomMoveModifierConfig pCatmullRomMoveModifierConfig = new CatmullRomMoveModifierConfig(5);

public void move() {
	pCatmullRomMoveModifierConfig.setControlPoint(0, 120,  60);
	pCatmullRomMoveModifierConfig.setControlPoint(1, 180, 120);
	pCatmullRomMoveModifierConfig.setControlPoint(2, 240, 120);
	pCatmullRomMoveModifierConfig.setControlPoint(3, 300,  60);
	pCatmullRomMoveModifierConfig.setControlPoint(4, 360, 120);

	this.registerEntityModifier(new CatmullRomSplineMoveModifier(5.0f, pCatmullRomMoveModifierConfig));
}

 

ColorModifier(float pDuration, float pFromRed, float pToRed, float pFromGreen, float pToGreen, float pFromBlue, float pToBlue, IEntityModifierListener pEntityModifierListener, IEaseFunction pEaseFunction)

pDuration 時間で pFromColor から pToColor へ色を変化させる
 ※アルファを指定しても(new Color(1, 1, 1, 1))エラーはでませんでしたが、アルファは適用されませんでした

oAnimatedSprite.registerEntityModifier(new ColorModifier(5.0f, new Color(1, 1, 1), new Color(0, 0, 0)));

 


CubicBezierCurveMoveModifier(float pDuration, float pX1, float pY1, float pX2, float pY2, float pX3, float pY3, float pX4, float pY4, IEntityModifierListener pEntityModifierListener, IEaseFunction pEaseFunction)

pDuration 時間で (3 次元) ベジェ曲線を描きながら移動する
サンプルは↓の画像をセットした際の動き
http://www.w3.org/TR/SVG/images/paths/cubic02.svg

oAnimatedSprite.registerEntityModifier(new CubicBezierCurveMoveModifier(5.0f, 100f, 200f, 100f, 100f, 400f, 100f, 400f, 200f));

09-01 registerEntityModifier というか PhysicsHandler というか Modifier(?) というか

Sprite を移動させたいだけなのですが、単なる移動と物理学的(?) 移動とあるようです。
単純な移動の方がメモリを食わない気がしますが

package com.example.mytestproject;

import org.andengine.engine.camera.Camera;
import org.andengine.engine.handler.physics.PhysicsHandler;		// 追加
import org.andengine.engine.options.EngineOptions;
import org.andengine.engine.options.ScreenOrientation;
import org.andengine.engine.options.resolutionpolicy.RatioResolutionPolicy;
import org.andengine.entity.scene.Scene;
import org.andengine.entity.scene.background.Background;
// import org.andengine.entity.sprite.Sprite;					// 削除
import org.andengine.entity.sprite.AnimatedSprite;				// 追加
import org.andengine.opengl.texture.TextureOptions;
import org.andengine.opengl.texture.atlas.bitmap.BitmapTextureAtlas;
import org.andengine.opengl.texture.atlas.bitmap.BitmapTextureAtlasTextureRegionFactory;
// import org.andengine.opengl.texture.region.ITextureRegion;	// 削除
import org.andengine.opengl.texture.region.TiledTextureRegion;	// 追加 (ITextureRegion でも 動きます)
import org.andengine.opengl.vbo.VertexBufferObjectManager;
import org.andengine.ui.activity.SimpleBaseGameActivity;

/**
 * (c) 2010 Nicolas Gramlich
 * (c) 2011 Zynga
 *
 * @author Nicolas Gramlich
 * @since 14:27:22 - 14.06.2011
 */
public class MyShowImage extends SimpleBaseGameActivity {
	// ===========================================================
	// Constants
	// ===========================================================
	private static final int CAMERA_WIDTH  = 480;
	private static final int CAMERA_HEIGHT = 720;
	private static final float DEMO_VELOCITY = 100.0f;		// 追加

	// ===========================================================
	// Fields
	// ===========================================================
	private BitmapTextureAtlas mBitmapTextureAtlas;
	private TiledTextureRegion mFaceTextureRegion;

	@Override
	public EngineOptions onCreateEngineOptions() {
		final Camera camera = new Camera(0, 0, CAMERA_WIDTH, CAMERA_HEIGHT);
		return new EngineOptions(true, ScreenOrientation.PORTRAIT_FIXED, new RatioResolutionPolicy(CAMERA_WIDTH, CAMERA_HEIGHT), camera);
	}

	@Override
	public void onCreateResources() {
		BitmapTextureAtlasTextureRegionFactory.setAssetBasePath("gfx/");

		this.mBitmapTextureAtlas = new BitmapTextureAtlas(this.getTextureManager(), 32, 32, TextureOptions.BILINEAR_PREMULTIPLYALPHA);
//		this.mFaceTextureRegion = BitmapTextureAtlasTextureRegionFactory.createFromAsset(this.mBitmapTextureAtlas, this, "face_box.png", 0, 0);				// 削除
		this.mFaceTextureRegion = BitmapTextureAtlasTextureRegionFactory.createTiledFromAsset(this.mBitmapTextureAtlas, this, "face_box.png", 0, 0, 1, 1);	// 追加
		this.mBitmapTextureAtlas.load();
	}

	@Override
	public Scene onCreateScene() {
		final Scene scene = new Scene();
		scene.setBackground(new Background(0.09804f, 0.6274f, 0.8784f));

		/* Calculate the coordinates for the face, so its centered on the camera. */
		final float centerX = (CAMERA_WIDTH  - this.mFaceTextureRegion.getWidth())  / 2;
		final float centerY = (CAMERA_HEIGHT - this.mFaceTextureRegion.getHeight()) / 2;

//		final Sprite faceSprite = new Sprite(centerX, centerY, this.mFaceTextureRegion, this.getVertexBufferObjectManager()); 	// 削除
		final Ball faceSprite = new Ball(centerX, centerY, this.mFaceTextureRegion, this.getVertexBufferObjectManager());		// 追加

		scene.attachChild(faceSprite);

		return scene;
	}

	// 以下、すべて追加
	private static class Ball extends AnimatedSprite {
		private final PhysicsHandler mPhysicsHandler;

		public Ball(final float pX, final float pY, final TiledTextureRegion pTextureRegion, final VertexBufferObjectManager pVertexBufferObjectManager) {
			super(pX, pY, pTextureRegion, pVertexBufferObjectManager);
			this.mPhysicsHandler = new PhysicsHandler(this);
			this.registerUpdateHandler(this.mPhysicsHandler);
			this.mPhysicsHandler.setVelocity(MyShowImage.DEMO_VELOCITY, MyShowImage.DEMO_VELOCITY);
		}

		@Override
		protected void onManagedUpdate(final float pSecondsElapsed) {
			if(this.mX < 0) {
				this.mPhysicsHandler.setVelocityX(MyShowImage.DEMO_VELOCITY);
			} else if(this.mX + this.getWidth() > MyShowImage.CAMERA_WIDTH) {
				this.mPhysicsHandler.setVelocityX(-MyShowImage.DEMO_VELOCITY);
			}

			if(this.mY < 0) {
				this.mPhysicsHandler.setVelocityY(MyShowImage.DEMO_VELOCITY);
			} else if(this.mY + this.getHeight() > MyShowImage.CAMERA_HEIGHT) {
				this.mPhysicsHandler.setVelocityY(-MyShowImage.DEMO_VELOCITY);
			}

			super.onManagedUpdate(pSecondsElapsed);
		}
	}
}

CentOS (32bit) に mod_spdy

古めのコンテンツしか見つからない。。。
と、思ったらパッケージが提供されているので簡単すぎてあまり情報提供するほどのもんじゃなかったみたいで。。。:O

wget https://dl-ssl.google.com/dl/linux/direct/mod-spdy-beta_current_i386.rpm
yum install --nogpgcheck mod-spdy-beta_current_x86_64.rpm
/etc/init.d/httpd restart

mod_spdy
http://code.google.com/p/mod-spdy/

download & install
https://developers.google.com/speed/spdy/mod_spdy/

    9月末時点で配布されていたパッケージ

  • mod_spdy 32-bit .deb (Debian/Ubuntu)
  • mod_spdy 64-bit .deb (Debian/Ubuntu)
  • mod_spdy 32-bit .rpm (CentOS/Fedora)
  • mod_spdy 64-bit .rpm (CentOS/Fedora)

08-01 Titanium Studio で作成した project を Android-x86 4.0 でデバッグする

[修正] 前に掲載したやり方ではダメだったので
 ※なぜかインストールされてたのですが、どうやらいろいろやっていた時に手動インストールを試してしまっていたようです。。。 😳

今度はちゃんといけるようになりました!

原因としては Titanium Studio が実行している adb コマンドのオプション (‘-d’) を指定されているので実機に対してインストールしようとしてしまっていたようです。
なので ‘-d’ オプションを指定しないように、builder.py の下の個所を修正しました。

builder.py の場所(自分の環境の場合)

C:\Users\[user name]\AppData\Roaming\Titanium\mobilesdk\win32\2.1.1.GA\android\builder.py

修正 – 1 (自分の環境の場合は 1758 行目付近)

#self.device_args = ['-d'] #←をコメントアウトして↓を追加
self.device_args = None

修正 – 2 (自分の環境の場合は 2240 行目付近)

#self.device_args = ['-d'] #←をコメントアウトして↓を追加
self.device_args = None

ホスト OS 側で↓の設定をする。

adb connect [ip address]

 ex. adb connect 192.168.0.10

後は project を右クリック → “Install to Android Device” で Android-x86 内に install されました!
 ※’-d’ の代わりに ‘-e’ オプションがつくので、emulator を含め複数の device を起動している場合はご注意ください。
  ’-e’ もつけたくない場合も builder.py の修正でいけると思います。

※追記
Titanium Studio 3.0.0 になってから上の手順だけではまたエラーがでるようになってしまいました。
さらに下の処理を行うことで Android-x86 でもデバッグできるようになりました。

#device_args = ['-d'] #←をコメントアウトして↓を追加
device_args = ['-e']

※確認したバージョン:Titanium Studio, build: 3.0.1.201212181159

以下、間違っている記事 :O

 

Android-x86 でデバッグした方がめちゃめちゃ早いのはいろいろなサイトで紹介されていますが、いざ体感してみたらほんとにすごかったです 🙂

Android-x86 側で↓の設定をする。

setprop service.adb.tcp.port 5560
kill `pgrep adbd`

ホスト OS 側で↓の設定をする。

adb connect [ip address]:5560

 ex. adb connect 192.168.0.10:5560

Titanium Studio を起動後
project を右クリック → “Install to Android Device” で Android-x86 内に install されると思います。

ちなみに自分のお気に入りの emo-framework はそのままでは Android-x86 を用いたデバッグはできないようです。(emo-framework が悪いのではなく、自分が emo-framework を x86 で build できないだけなのですが 😥

07-01 Android-x86 4.0 有線ネットワークの固定 IP 設定

Android-x86 2.x は “Ethernet configuration” があるのですが Android-x86 の配布元の “Android4.x RC2” では、どれも “Ethernet configuration” 設定が出てこなかったです :O
調べてみたら(英語なのでよくわかりませんが 🙂 ) 下でディスカッションされていて、Ron M さんが patch を作ってくださり、さらに patch 適用 & build 済みの iso を配布してくださっているようなのでそれを利用させていただきました。

でも、デフォルトインストールの場合、私の環境では NAT しかうまく使えなかったのですが、下の手順にて static ip でもいけました!

ディスカッション
https://groups.google.com/forum/?fromgroups=#!topic/android-x86/YmWjtOLLdDs

Ethernet 対応 patch 適用済み Android-x86 4.0.4 iso (desktop_generic.iso) の ダウンロード
https://groups.google.com/forum/#!topic/android-x86/MPoj2Bzd-rE の中の http://www.sendspace.com/file/l2gebz

static ip 設定
下のコマンドをそれぞれ実行

ifconfig eth0 [ip address] up
route add default gw [gw ip address] dev eth0
setprop net.dns1 [dns ip address]

  • “/init.rc” とかを編集しておけばいいみたいなのですが、それらの保存は私にはまだ敷居が高そうなので保留です 🙁
  • Shell 画面への移行は [alt] + [F1]、戻るのは [alt]+[F7] (Tips – Android-x86 のショートカットキー)
  • 06-04 Windows 8 のコントロールパネル を スタート画面 (Metro UI) に追加

    画面のどこでもいいので “右クリック” → (画面下部にパネルが表示される)
    → [すべてのアプリ] をクリック

     

    画面を右にスクロールするとコントロールパネルアイコンがありますので、アイコンを右クリック
    → 画面下部にメニューが表示されるので、一番左の “スタート画面にピン留めする” をクリック

     

    スタート画面にアイコンが追加されています。
    ※追加される位置は一番右ですが、アイコンはドラッグ&ドロップで好きな位置に移動できるようです 🙂

     

    06-03 Windows 8 のコントロールパネル を表示

    Google 先生で Hit した方法では表示できなかったのでー
    同じような方は試してみてください 🙂

    画面のどこでもいいので “右クリック” → (画面下部にパネルが表示される)
    → [すべてのアプリ] をクリック

     

    画面を右にスクロールするとコントロールパネルアイコンがありますので、そこから起動できます。
    ※コンパネアイコンをクリックすると、従来のデスクトップも有効になるみたいです。