Android タッチイベントの取得について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
北星

Android タッチイベントの取得について

#1

投稿記事 by 北星 » 12年前

『Androidプログラミングの館』を見てアプリを作っています。
『ゲーム イライラ棒アプリ作成』を途中まで作って、タッチして
ボールを動かし迷路を抜けると言う風にしようと思ったのですが、上手くできません。

コード:

public class IrairaBarActivity extends Activity {
 Player pl ;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView( new GameSurfaceView(this) );
    }
    
    public boolean onTouchEvent(MotionEvent event){
		pl=new Player();
		pl._cir._x=event.getX();
		pl._cir._y=enent.getY();
		return true;
	}
}
このように追加しました。
Log.d()で調べてみると、
画面がタッチされたらonTouchEvent()が呼び出され、
onTouchEvent()の中で_cirの値は変化しているのですが、
Player()の側ではの値が変化しません。
どうすればタッチした所の座標を_cirにセットできるのでしょうか。

_cirはpublicにしています。
プログラム全体は『ゲーム イライラ棒アプリ作成』と同じです。

アバター
bitter_fox
記事: 607
登録日時: 13年前
住所: 大阪府

Re: Android タッチイベントの取得について

#2

投稿記事 by bitter_fox » 12年前

北星 さんが書きました:

コード:

    public boolean onTouchEvent(MotionEvent event){
		pl=new Player();
		pl._cir._x=event.getX();
		pl._cir._y=enent.getY();
		return true;
	}
}
画面がタッチされたらonTouchEvent()が呼び出され、
onTouchEvent()の中で_cirの値は変化しているのですが、
Player()の側ではの値が変化しません。
どうすればタッチした所の座標を_cirにセットできるのでしょうか。

コード:

public class GameMgr {

        private LinkedList<Task> _taskList = new LinkedList<Task>();//タスクリスト
        
        GameMgr(){
                _taskList.add( new Player() ); // 実際に表示されるPlayerのインスタンス(1)
                _taskList.add( new FpsController() );
        }

}
表示されいているPlayerのインスタンスは(1)で作成されたインスタンスです。
一方、IrairaBarActivity#onTouchEventで作成されているPlayerのインスタンスは実際に表示されいている(1)のインスタンスとは違います。
オフトピック

コード:

new Object() == new Object()
は常に偽です。
なので、IrairaBarActivity#onTouchEventで作成されたPlayerのインスタンスのフィールドを変更しても、表示されているPlayerには変更が及びません。

それから無闇にフィールドをpublicにするのは良くありません。

修正方法としてはいくつかありますが、その内の一つを載せておきますので参考にしてください。(変更はs2.4からの変更です)

Playerクラス[追加:setLocation(float, float)]

コード:

	public void setLocation(float x, float y) {
		_cir._x = x;
		_cir._y = y;
	}
GameMgr[変更:コンストラクタ, 追加:Player player[フィールド], onTouchEvent(MotionEvent)]

コード:

public class GameMgrr {
	private Player player = new Player();

	public GameMgr(){
		_taskList.add(player);
		_taskList.add( new FpsController() );
	}

	public boolean onTouchEvent(MotionEvent e) {
		player.setLocation(e.getX(), e.getY());

		return true;
	}
}
GameSurfaceViewクラス[追加:onTouchEvent(MotionEvent)]

コード:

	public boolean onTouchEvent(MotionEvent e) {
		return _gameMgr.onTouchEvent(e);
	}
[hr][変更]ソースコードのスタイルをオールマンからK&Rに統一
[変更]変更例を全面的に変更

北星

Re: Android タッチイベントの取得について

#3

投稿記事 by 北星 » 12年前

丁寧な説明ありがとうございます。
説明の通りに修正して解決できました。

閉鎖

“C言語何でも質問掲示板” へ戻る