ページ 11

[java][Android]SurfaceView又はGameMgrから別Activityに飛ぶインテントを渡したい

Posted: 2014年11月17日(月) 14:42
by LL
お久しぶりです。
今回は[Androidの館]を参考に今作っているSurfaceViewを使った簡単なゲームで、ゲームクリアもしくはゲームオーバー時に別アクティビティ(今回具体的に言えばタイトルのアクティビティ)に
飛ばす処理を作ろうとしています。しかし、Intentを渡そうにもうまくいかず、下記サイトを参考に組んだところ、該当箇所を通った瞬間一瞬タイトル画面に戻りますがその後フリーズし、
『Android』その物が強制終了してシャットダウンすると言う悪夢のような物が出来上がりました。
https://groups.google.com/forum/#!topic ... Z19WJQbJ_0

そこでお伺いしたいのですが、ゲームクリア時にタイトルのアクティビティに飛ぶといったような処理を組み込もうと思うならどんな実装をすればいいでしょうか?
一部のだけですがソースコードをあげます。
また、OSが強制終了したコードは即刻消してしまったのでありません。
GameMgr.java

コード:

package jp.denpa.testaplcation;

import java.util.ArrayList;
import java.util.LinkedList;

import jp.denpa.testaplication.data.Enemy;
import jp.denpa.testaplication.data.Collision;
import jp.denpa.testaplication.data.Player;

import android.content.Intent;
import android.graphics.Canvas;
import android.graphics.Color;

public class GameMgr {
	//ゲームステータス
	private enum GameStatus{
		GAME_NORMAL,			//継続中
		GAME_CLEAR,			//クリア
		GAME_OVER,				//ゲームオーバー
	};
	
	private LinkedList<Task> mTaskList = new LinkedList<Task>();			//タスクリスト(基本的に一つしか存在せず、タスクという機能が共通しているオブジェクトを突っ込む)
	private ArrayList<Enemy> mEnemyList = new ArrayList<Enemy>();			//エネミーリスト(敵のオブジェクトを突っ込む)
	private Player mPlayer;			//当たり判定やパラメータ変更などでオブジェクトの情報がいるので変数名で指名できるようにする必要がある。
	private GameStatus mStatus = GameStatus.GAME_NORMAL;						//ゲームの状態
	private Timer mTimer;
	
	//コンストラクタ
	GameMgr(){
		mPlayer = new Player();
		mTimer = new Timer(100, 30);
		
		mEnemyList.add(new Enemy());
		mEnemyList.add(new Enemy());
		mEnemyList.add(new Enemy());
		mEnemyList.add(new Enemy());
		mEnemyList.add(new Enemy());
		mEnemyList.add(new Enemy());
		
		mTaskList.add(mPlayer);
		mTaskList.add(new FpsController());
		mTaskList.add(mTimer);
	}
	
	//コンストラクタを通さない初期化(リソースがらみなどでコンストラクタで処理できない初期化など)(onLoadと言うメソッド名の方がいいか?)
	public boolean onInit(){
		//プレイヤーの初期化
		mPlayer.onInit();
		//エネミーリストの初期化
		for(int i = 0; i < mEnemyList.size(); i++){
			if(mEnemyList.get(i).onInit() == false){
				mEnemyList.remove(i);						//初期化失敗したらそのオブジェクトを消す
			}
			mEnemyList.get(i).setPos((MainActivity.mDispSize.x / (mEnemyList.size() + 1)) * (i + 1), (MainActivity.mDispSize.y / 3));
		}
		return true;
	}
	
	public boolean onUpdate(){
		//ゲーム継続中以外なら更新しない
		if(mStatus != GameStatus.GAME_NORMAL){
			return true;
		}
		
		//タスクリストの更新
		for(int i = 0; i < mTaskList.size(); i++){
			if(mTaskList.get(i).onUpdate() == false){		//更新失敗なら
				mTaskList.remove();							//そのタスクを消す
				i--;
			}
		}
		//エネミーリストの更新
		for(int i = 0; i < mEnemyList.size(); i++){
			if(mEnemyList.get(i).onUpdate() == false){
				mEnemyList.remove(i);						//更新失敗したらそのオブジェクトを消す(不必要になったら更新でfalseを返すようにする)
			}
		}
		
		//当たり判定
		CollisionCheck();
		return true;
	}
	
	public void onDraw(Canvas c){
		c.drawColor(Color.WHITE);							//背景を白で塗りつぶし
		//タスクリスト描画
		for(int i = 0; i < mTaskList.size(); i++){
			mTaskList.get(i).onDraw(c);						//描画する
		}
		
		//エネミーリスト描画
		for(int i = 0; i < mEnemyList.size(); i++){
			mEnemyList.get(i).onDraw(c);					//敵の描画
		}
		
	}
	
//privateメソッド--------------------------------------------------------------------
	//当たり判定処理
	private void CollisionCheck(){
		//プレイヤーが死んでたらゲームオーバーテロップ出して当たり判定しない。
		if(mPlayer.getLife() <= 0){
			//ゲームオーバーテロップを一度だけ生成(配置の関係上、一回しかここを通らない)
			mTaskList.add(new Telop("GAME OVER", MainActivity.mDispSize.x / 2, MainActivity.mDispSize.y / 2, Color.RED, 50));
			mStatus = GameStatus.GAME_OVER;
			mTimer.onPause();

			return;
		}
		//敵が全滅してたらゲームクリアテロップ出して当たり判定しない
		if(mEnemyList.size() == 0){
			mTaskList.add(new Telop("GAME CLEAR", MainActivity.mDispSize.x / 2, MainActivity.mDispSize.y / 2, Color.GREEN, 50));
			mStatus = GameStatus.GAME_CLEAR;		
			mTimer.onPause();
			return;
		}
		for(int i = 0; i < mEnemyList.size(); i++){		
			if(Collision.circleToCircle(mPlayer.getCircle(), mEnemyList.get(i).getCircle())){
				mEnemyList.get(i).setColor(Color.RED);
				mEnemyList.get(i).isHit(0, mPlayer.getMoveVec());
				mPlayer.setColor(Color.YELLOW);
				mPlayer.isHit(0, mEnemyList.get(i).getMoveVec());
			}else{
				mEnemyList.get(i).setColor(Color.BLACK);
				mPlayer.setColor(Color.CYAN);
			}
		}
	}
}


GameSurfaceView.java

コード:

//ゲームを作る最小限の構成をまとめたクラス
//参考元↓
//http://dixq.net/Android/s02_01.html
package jp.denpa.testaplcation;
import android.content.Context;
import android.content.Intent;
import android.graphics.Canvas;
import android.view.SurfaceHolder;
import android.view.SurfaceView;


public class GameSurfaceView extends SurfaceView implements SurfaceHolder.Callback, Runnable{
	private GameMgr mGameMgr = new GameMgr();		//
	private Thread mThread;							//スレッド
	
	//コンストラクタ
	public GameSurfaceView(Context context) {
		super(context);
		getHolder().addCallback(this);
	}

	
	//メインループとかの処理を突っ込む場所
	@Override
	public void run() {
		//Initを入れるとしたらここか・・・(コンストラクタはオブジェクトが生成される前に通る場所なのでリソース関連で問題を[十中八九]起こす)
		//例:コンストラクタで画面サイズを取得して初期座標の決定=>無理
		mGameMgr.onInit();
		//ゲームのメインループ
		while(mThread != null){
			mGameMgr.onUpdate();
//			if(mGameMgr.getGameStatus() != GameMgr.GameStatus.GAME_NORMAL){
//				Intent intent = new Intent(getContext(), TitleActivity.class);
//				getContext().startActivity(intent);
//			}
			onDraw(getHolder());
		}
		
	}

	//ゲームの描画処理を書く
	private void onDraw(SurfaceHolder holder){
		//キャンバスクラスを使い描画する
		Canvas c = holder.lockCanvas();		//キャンバスをロック
		if(c == null){return;}
		//ゲームの描画処理
		mGameMgr.onDraw(c);
		
		
		holder.unlockCanvasAndPost(c);		//キャンバスのロックを外す
	}
	
	//解像度情報変更通知
	@Override
	public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
		
	}

	@Override
	public void surfaceCreated(SurfaceHolder holder) {
		//別スレッドでメインループを作る
		mThread = new Thread(this);
		mThread.start();
	}

	@Override
	public void surfaceDestroyed(SurfaceHolder holder) {
		//スレッドの破棄
		mThread = null;
	}

}
MainActivity.java(ゲームの中心となるActivity)

コード:

package jp.denpa.testaplcation;


import android.app.Activity;
import android.content.Intent;
import android.graphics.Point;
import android.os.Bundle;
import android.view.Display;
import android.view.Window;
import android.view.WindowManager;
import android.widget.RelativeLayout;

public class MainActivity extends Activity {
	
	public static Display mDisplay;				//ディスプレイ情報
	public static Point mDispSize;				//ディスプレイサイズ(ステータスバーも含めた画面全体描画領域)
	public static Point mViewSize;				//ビューサイズ(実際にコンテンツが描画される領域)

	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		// タイトルバーを隠す
		requestWindowFeature(Window.FEATURE_NO_TITLE);		//なお、このメソッドはSetContantViewを通る前に指定すること(しないとエラー)
        // ステータスバーを隠す
		getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);		
		
		setContentView(new GameSurfaceView(this));

		mDispSize = new Point();	
		mViewSize = new Point();	

		//ディスプレイ情報の取得
		mDisplay = getWindowManager().getDefaultDisplay();	
		mDisplay.getSize(mDispSize);	//ディスプレイサイズの格納
		
		//センサーの初期化
		AcSensor.Inst().onCreate(this);
	}
	
	//xmlで指定した高さや幅はOnCreate時に取得すると0しか取得できない。
	//しかしOnWindowFocusChangedメソッド内で取得するとアプリ起動時にViewSizeが取得できる
	@Override
	public void onWindowFocusChanged(boolean hasForcus){
		super.onWindowFocusChanged(hasForcus);
		
	    //Viewサイズを取得する
		//描画用[xml]の情報を取得
//	    RelativeLayout rl = (RelativeLayout) findViewById(R.id.relativeLayout1);
//		mViewSize.x = rl.getWidth();
//		mViewSize.y = rl.getHeight();
	}
	
	
	//アクティビティが動き始めるとき
	@Override
	protected void onResume(){
		super.onResume();
		
		//アクティビティが動くときセンサーを動かし始める
		AcSensor.Inst().onResume();
	}
	
	//アクティビティが一時停止する時
	@Override
	protected void onPause(){
		super.onPause();
		//アクティビティ中断時センサーを停止
		AcSensor.Inst().onPause();
	}
}
ちなみに悪夢のような動作を起こしたのは、GameMgrのゲームステータス[ private GameStatus mStatus]を外部[GameSurfaceView]のUpdateで取得させ、ゲーム続行以外であれば
Intentを作って該当のActivityへ飛ばすという処理をした部分でした(該当個所のソースコードは危険を感じたので消しました。)

Re: [java][Android]SurfaceView又はGameMgrから別Activityに飛ぶインテントを渡

Posted: 2014年11月19日(水) 10:34
by softya(ソフト屋)
たぶんですが、スレッドからstartActivity()で起動しているせいだと思います。
UIスレッドから呼び出す様にして下さい。

あと、前のトピックが放置されてませんか?

Re: [java][Android]SurfaceView又はGameMgrから別Activityに飛ぶインテントを渡

Posted: 2014年11月19日(水) 11:00
by LL
解決しました。
原因はスレッドのrunメソッドでインテントを使ったことが原因だったみたいです。
解決法はいくつか見つけました。
一つはGameMgrクラス内にContextを保持させてそこから利用するか、もう一つはゲームのActivity(この場合はMainActivity)にゲームの情報を渡し、ゲームが継続以外の情報が渡ったらタップしたときにインテントを利用するかでした。
今回はゲーム終了時にタップすることでタイトルに戻るような処理を実装したかったので後者の方を採用しました。
以下コードです。コードが汚くなってしまいましたので今後は可読性をあげるのが目的でしょうか・・・(ですが今度短期間でOpenGLESを組まなければならないので後になりそうですが・・・)
MainActivity.java

コード:

package jp.denpa.testaplcation;


import android.app.Activity;
import android.content.Intent;
import android.graphics.Point;
import android.os.Bundle;
import android.view.Display;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.Window;
import android.view.WindowManager;
import android.widget.RelativeLayout;

public class MainActivity extends Activity {
	
	public static Display mDisplay;				//ディスプレイ情報
	public static Point mDispSize;				//ディスプレイサイズ(ステータスバーも含めた画面全体描画領域)
	public static Point mViewSize;				//ビューサイズ(実際にコンテンツが描画される領域)

	GameSurfaceView mView;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		// タイトルバーを隠す
		requestWindowFeature(Window.FEATURE_NO_TITLE);		//なお、このメソッドはSetContantViewを通る前に指定すること(しないとエラー)
        // ステータスバーを隠す
		getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);		
		
		mView = new GameSurfaceView(this);
		setContentView(mView);

		mDispSize = new Point();	
		mViewSize = new Point();	

		//ディスプレイ情報の取得
		mDisplay = getWindowManager().getDefaultDisplay();	
		mDisplay.getSize(mDispSize);	//ディスプレイサイズの格納
		
		//センサーの初期化
		AcSensor.Inst().onCreate(this);
	}
	
	//xmlで指定した高さや幅はOnCreate時に取得すると0しか取得できない。
	//しかしOnWindowFocusChangedメソッド内で取得するとアプリ起動時にViewSizeが取得できる
	@Override
	public void onWindowFocusChanged(boolean hasForcus){
		super.onWindowFocusChanged(hasForcus);
		
	    //Viewサイズを取得する
		//描画用[xml]の情報を取得
//	    RelativeLayout rl = (RelativeLayout) findViewById(R.id.relativeLayout1);
//		mViewSize.x = rl.getWidth();
//		mViewSize.y = rl.getHeight();
	}
	
	
	//アクティビティが動き始めるとき
	@Override
	protected void onResume(){
		super.onResume();
		
		//アクティビティが動くときセンサーを動かし始める
		AcSensor.Inst().onResume();
	}
	
	//アクティビティが一時停止する時
	@Override
	protected void onPause(){
		super.onPause();
		//アクティビティ中断時センサーを停止
		AcSensor.Inst().onPause();
	}
	
	@Override
	public boolean onTouchEvent(MotionEvent event){
		if(event.getAction() == MotionEvent.ACTION_DOWN){
			//ゲーム状態を取得し、継続以外を探知したらタップ(液晶に触れた瞬間)でタイトルに戻り、このActivityを停止してゲームを終了させる
			if(mView.putGameMgr().putGameStatus() != GameMgr.GameStatus.GAME_NORMAL){	
				startActivity(new Intent(this, TitleActivity.class));
				finish();											//finishしてActivityを停止しておかないと古いゲーム情報が残ってしまう
			}			
			//デバッグ用:強制的にゲームをクリアし、データを記録
			//mView.putGameMgr().debugGameClear();
		}
		return true;		
	}
	
}
GameSurfaceView.java

コード:

//ゲームを作る最小限の構成をまとめたクラス
//参考元↓
//http://dixq.net/Android/s02_01.html
package jp.denpa.testaplcation;


import android.content.Context;
import android.content.Intent;
import android.graphics.Canvas;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;


public class GameSurfaceView extends SurfaceView implements SurfaceHolder.Callback, Runnable{
	private GameMgr mGameMgr;						//ゲームマネージャ
	private Thread mThread;							//スレッド
	//private Context mContext = null;
	
	//コンストラクタ
	public GameSurfaceView(Context context) {
		super(context);
		getHolder().addCallback(this);
		mGameMgr = new GameMgr(context);
		//mContext = context;
	}

	
	//メインループとかの処理を突っ込む場所
	@Override
	public void run() {
		//Initを入れるとしたらここか・・・(コンストラクタはオブジェクトが生成される前に通る場所なのでリソース関連で問題を[十中八九]起こす)
		//例:コンストラクタで画面サイズを取得して初期座標の決定=>無理
		mGameMgr.onInit();
		//ゲームのメインループ
		while(mThread != null){
			mGameMgr.onUpdate();
			onDraw(getHolder());
		}
		
	}

	//ゲームの描画処理を書く
	private void onDraw(SurfaceHolder holder){
		//キャンバスクラスを使い描画する
		Canvas c = holder.lockCanvas();		//キャンバスをロック
		if(c == null){return;}
		//ゲームの描画処理
		mGameMgr.onDraw(c);
		
		
		holder.unlockCanvasAndPost(c);		//キャンバスのロックを外す
	}
	
	//解像度情報変更通知
	@Override
	public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
		
	}

	@Override
	public void surfaceCreated(SurfaceHolder holder) {
		//別スレッドでメインループを作る
		mThread = new Thread(this);
		mThread.start();
	}

	@Override
	public void surfaceDestroyed(SurfaceHolder holder) {
		//スレッドの破棄
		mThread = null;
	}
	
	//デバッグ用ゲームマネージャー(GameMgr)情報取得
	public GameMgr putGameMgr(){
		return mGameMgr;
	}
	
//以下、デバッグ用メソッド--------------------------------------------------------------------------------
}
GameMgr.java

コード:

package jp.denpa.testaplcation;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.LinkedList;

import jp.denpa.testaplication.data.Enemy;
import jp.denpa.testaplication.data.Collision;
import jp.denpa.testaplication.data.Player;
import jp.denpa.testaplication.data.TimeData;

import android.content.Context;
import android.content.Intent;
import android.graphics.Canvas;
import android.graphics.Color;
import android.util.Log;

public class GameMgr {
	//ゲームステータス
	public enum GameStatus{
		GAME_NORMAL,			//継続中
		GAME_CLEAR,			//クリア
		GAME_OVER,				//ゲームオーバー
	};
	
	private LinkedList<Task> mTaskList = new LinkedList<Task>();			//タスクリスト(基本的に一つしか存在せず、タスクという機能が共通しているオブジェクトを突っ込む)
	private ArrayList<Enemy> mEnemyList = new ArrayList<Enemy>();			//エネミーリスト(敵のオブジェクトを突っ込む)
	private Player mPlayer;			//当たり判定やパラメータ変更などでオブジェクトの情報がいるので変数名で指名できるようにする必要がある。
	private GameStatus mStatus = GameStatus.GAME_NORMAL;						//ゲームの状態
	private Timer mTimer;
	private Context mContext = null;
	
	//コンストラクタ
	GameMgr(Context c){
		mContext = c;
		
		mPlayer = new Player();
		mTimer = new Timer(100, 30);
		
		mEnemyList.add(new Enemy());
		mEnemyList.add(new Enemy());
		mEnemyList.add(new Enemy());
		mEnemyList.add(new Enemy());
		mEnemyList.add(new Enemy());
		mEnemyList.add(new Enemy());
		
		mTaskList.add(mPlayer);
		mTaskList.add(new FpsController());
		mTaskList.add(mTimer);
	}
	
	//コンストラクタを通さない初期化(リソースがらみなどでコンストラクタで処理できない初期化など)(onLoadと言うメソッド名の方がいいか?)
	public boolean onInit(){
		//プレイヤーの初期化
		mPlayer.onInit();
		//エネミーリストの初期化
		for(int i = 0; i < mEnemyList.size(); i++){
			if(mEnemyList.get(i).onInit() == false){
				mEnemyList.remove(i);						//初期化失敗したらそのオブジェクトを消す
			}
			mEnemyList.get(i).setPos((MainActivity.mDispSize.x / (mEnemyList.size() + 1)) * (i + 1), (MainActivity.mDispSize.y / 3));
		}
		return true;
	}
	
	public boolean onUpdate(){
		//ゲーム継続中以外なら更新しない
		if(mStatus != GameStatus.GAME_NORMAL){
			return true;
		}
		
		//タスクリストの更新
		for(int i = 0; i < mTaskList.size(); i++){
			if(mTaskList.get(i).onUpdate() == false){		//更新失敗なら
				mTaskList.remove();							//そのタスクを消す
				i--;
			}
		}
		//エネミーリストの更新
		for(int i = 0; i < mEnemyList.size(); i++){
			if(mEnemyList.get(i).onUpdate() == false){
				mEnemyList.remove(i);						//更新失敗したらそのオブジェクトを消す(不必要になったら更新でfalseを返すようにする)
			}
		}
		
		//当たり判定
		CollisionCheck();
		return true;
	}
	
	public void onDraw(Canvas c){
		c.drawColor(Color.WHITE);							//背景を白で塗りつぶし
		//タスクリスト描画
		for(int i = 0; i < mTaskList.size(); i++){
			mTaskList.get(i).onDraw(c);						//描画する
		}
		
		//エネミーリスト描画
		for(int i = 0; i < mEnemyList.size(); i++){
			mEnemyList.get(i).onDraw(c);					//敵の描画
		}
		
	}
	
	public GameStatus putGameStatus(){
		return mStatus;
	}
	
//privateメソッド--------------------------------------------------------------------
	//当たり判定処理
	private void CollisionCheck(){
		//プレイヤーが死んでたらゲームオーバーテロップ出して当たり判定しない。
		if(mPlayer.getLife() <= 0){
			//ゲームオーバーテロップを一度だけ生成(配置の関係上、一回しかここを通らない)
			mTaskList.add(new Telop("GAME OVER", MainActivity.mDispSize.x / 2, MainActivity.mDispSize.y / 2, Color.RED, 50));
			mStatus = GameStatus.GAME_OVER;
			mTimer.onPause();
			return;
		}
		//敵が全滅してたらゲームクリアテロップ出して当たり判定しない
		if(mEnemyList.size() == 0){
			mTaskList.add(new Telop("GAME CLEAR", MainActivity.mDispSize.x / 2, MainActivity.mDispSize.y / 2, Color.GREEN, 50));
			mStatus = GameStatus.GAME_CLEAR;		
			mTimer.onPause();
			//記録の保存(旧記録の比較及び塗り替えはこのメソッド内で。)
			bestTimeDataOutput(mTimer.putTimeData());
			return;
		}
		for(int i = 0; i < mEnemyList.size(); i++){		
			if(Collision.circleToCircle(mPlayer.getCircle(), mEnemyList.get(i).getCircle())){
				mEnemyList.get(i).setColor(Color.RED);
				mEnemyList.get(i).isHit(0, mPlayer.getMoveVec());
				mPlayer.setColor(Color.YELLOW);
				mPlayer.isHit(0, mEnemyList.get(i).getMoveVec());
			}else{
				mEnemyList.get(i).setColor(Color.BLACK);
				mPlayer.setColor(Color.CYAN);
			}
		}
	}
	
	//ベストタイムの保存
	//openFileInputの使用にcontentが必要なのでここで作る
	public boolean bestTimeDataOutput(TimeData newdata){
		//ファイルを読み込み前のデータ比較
		FileInputStream fis = null;
		ObjectInputStream objFis = null;
		TimeData oldData = new TimeData();
		
		try{
			fis = mContext.openFileInput("testapi.txt");
			objFis = new ObjectInputStream(fis);
			oldData = (TimeData)objFis.readObject();
			//旧情報と新情報を比較して更新していなかったらそのままファイルを閉じて終了
			if(oldData.putTime() < newdata.putTime()){
				fis.close();
				objFis.close();
				return false;
			}
		}catch(IOException e){
			e.printStackTrace();
			Log.e("FILE_INPUT", "ファイルがないので生成出来ない_ResultActivity.savedBattleDataClass");
		}catch(ClassNotFoundException e) {
			e.printStackTrace();
			Log.e("FILE_INPUT", "FiileInputError_ResultActivity.savedBattleDataClass");
		}
		
		
		//旧記録を塗り替えたか、ファイルが無いか、ファイルの読み込みに問題が起きたら新規でファイルを作って記録
		FileOutputStream fos = null;
		ObjectOutputStream objFos = null;
		
		try{
			fos = mContext.openFileOutput("testapi.txt", Context.MODE_PRIVATE);
			objFos = new ObjectOutputStream(fos);
			objFos.writeObject(newdata);
			fos.close();
			objFos.close();
			return true;
		}catch(IOException e){
			e.printStackTrace();
			Log.e("FileInput","ファイルの書き込みに失敗。");
			return false;
		}	
	}
//以下、デバッグ用メソッド--------------------------------------------------------------------------------
	//デバッグ用ゲームを強引にクリア状態にする
	public void debugGameClear(){
		bestTimeDataOutput(mTimer.putTimeData());
		//mStatus = GameStatus.GAME_CLEAR;
		//自分が所属するActivityのContextを入手しておけば下記のような記述でインテントできる(ただしActivityを閉じたければちゃんとfinish()で終了させておくこと)
		//mContext.startActivity(new Intent(mContext, TitleActivity.class));
	}
	
}
前のトピックスについてはもう少しお待ちください・・・・

Re: [java][Android]SurfaceView又はGameMgrから別Activityに飛ぶインテントを渡

Posted: 2014年11月19日(水) 11:01
by LL
解決チェック忘れました。申し訳ありません。