ページ 11

androidのイライラ棒アプリの自機をbitmapで表示したい

Posted: 2012年9月18日(火) 23:12
by tama
ここのサイトのAndroidプログラミングの館で、イライラ棒アプリを作るページがあり、
s2.4 自機を作る  ではdrawCircle関数で円を自機として表示しています。

そこで円の代わりに画像で自機を表示しようと考えたのですが、
画像のリソースをどのようにして取得させればいいのかよく分かりません。
Player.javaの部分を"chara.png"を読み込むために、

コード:

public class Player extends Task {
        private Paint _paint = new Paint();     //描画設定
        //画像読み込み
        Resources res = this.getContext().getResources();
        Bitmap chara = BitmapFactory.decodeResource(res, R.drawable.chara);
        
        public Player(){
        }

        @Override
        public boolean onUpdate(){
                return true;
        }

        @Override
        public void onDraw( Canvas c ){
	        c.drawBitmap(chara,0, 0, _paint);
        }

}
このような文に変更したのですが、getContextが未定義の為使用できないと出てきます。
PlayerクラスからBitmapを表示させる方法が分かる方がいらっしゃったら、
教えていただけると有り難いです。

Re: androidのイライラ棒アプリの自機をbitmapで表示したい

Posted: 2012年9月18日(火) 23:30
by Dixq (管理人)
ContextはGameSurfaceViewが持っています。

GameSurfaceViewはGameMgrを持っています。
GameMgrはPlayerを持っています。

従って
GameSurfaceView→GameMgr→Playerの順にContextをコンストラクタ等で渡してやれば良いでしょう。

Activityが変化しないゲームなのであれば、Contextが変わることはないので、
シングルトンにContextを持たせてどこからでも取得できるようにしても良いと思います。

Re: androidのイライラ棒アプリの自機をbitmapで表示したい

Posted: 2012年9月19日(水) 00:25
by tama
ご回答ありがとうございます。
contextに引き継ぎの仕組みは理解できたのですが、
実際にどのように書けばいいのかまだ分かりません。
↑の例のPlayer関数を

コード:

    public Player(Context context){
    	super(context);
	}
のように置き換えて、それを同様に
GameMgrにも行うということでしょうか?

Re: androidのイライラ棒アプリの自機をbitmapで表示したい

Posted: 2012年9月19日(水) 00:51
by Dixq (管理人)
そういうことですが、superに渡すならTaskにContextを持たせるようにしてすべてに持たせるべきでしょうか。
しかしそうする位なら手っ取りばやくシングルトンで良いかもしれません。

Re: androidのイライラ棒アプリの自機をbitmapで表示したい

Posted: 2012年9月19日(水) 22:39
by tama
ご回答ありがとうございます。

・Taskクラスにextend SurfaceViewを付ける
・Playerクラスのコンストラクタにsuper(context)の文を付ける
・GameMgrクラスでPlayerクラスへの引数にcontextを付ける

これでエラーが出なくなりました。
他の部分もいじっているのでまだ実行はしていませんが、
bitmapを表示させる事に関しては問題なくなったと思います。

Re: androidのイライラ棒アプリの自機をbitmapで表示したい

Posted: 2012年9月20日(木) 00:22
by Dixq (管理人)
Taskクラスの親をSurfaceViewにするのはまずいです。
TaskはViewではありません。

やるなら以下のようにTaskにContextを持たせ、子クラスから渡して持てるようにしてはどうでしょう。

コード:

public abstract class Task {
	protected Context _context;
	public Task(Context c){
		_context = c;
	}
	public boolean onUpdate(){
		return true;
	}
	public void onDraw(Canvas c){		
	}
}