• ベストアンサー

SurfaceViewの一時停止や再開方法

はじめてのjavaで、はじめてAndroidのゲームを作ってます。 SurfaceviewでThreadを使って簡単なSTGゲームを作ってるのですが (1)端末のメニューボタンを押した時に、ゲームを一時停止したいのですがどうすればいいのかわかりません。 (2)端末のホームボタンを押して中断した場合、すぐに復帰してもゲームが最初からになってしまいます。 ホームボタンを押したら一時的に中断して、復帰したときに途中から続行させたいのですが、どうすれば途中から続行できるようになるのかわかりません。 ググってもちんぷんかんぷんでした!どうか教えてください。よろしくお願いします!

質問者が選んだベストアンサー

  • ベストアンサー
  • hirotn
  • ベストアンサー率59% (147/246)
回答No.1

アプリケーションを切り替えた時・ホームボタンを押した時に、アプリケーションが発行されるイベントを調べ、その時にアプリケーションの状態をファイルに書き込みます。 自分のアプリケーションに復帰した時のイベントもあるので、その時ファイルからメモリに情報を読み戻します。 別の方法として同じイベントにおいて、Bundleという方法があるようですが…調べてみてください。申し訳ありません。 http://y-anz-m.blogspot.jp/2010/03/androidbundle.html http://techbooster.jpn.org/andriod/application/3706/

hsptarou
質問者

お礼

すみません。上の補足は気にしないでください。 普通に出来ました。runの中で初期化してたというアホみたいな理由で毎回最初からになっていただけでした。。 でも結果的に解決できたので嬉しいです! 本当にありがとうございました!

hsptarou
質問者

補足

ありがとうございます! 一時的な保存で良いので、まさにBundleの方法で作りたいのですが、 onRestoreInstanceStateが呼び出されなくて、書き出しできませんでした・・・。 surfaceview側にも構成の違うParcelable onSaveInstanceState(),onRestoreInstanceState(Parcelable state)があるようで調べても、うまくできません。 もしよければ、↓のソースのScoreの値をホームボタン押したら一時的に保存して、すぐに復帰した場合に続きからカウントされるように書き換えたソースを教えてください。よろしくお願いします。 //---- public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(new MySurfaceView); } } //---- public class MySurfaceView extends SurfaceView implements SurfaceHolder.Callback, Runnable { int score; Thread thread; public MySurfaceView(Context context) { super(context); getHolder().addCallback(this); } public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {} public void surfaceCreated(SurfaceHolder holder) { thread = new Thread(this); thread.start(); } public void surfaceDestroyed(SurfaceHolder holder) { thread = null; } public void run() { Canvas canvas = null; Paint paint = new Paint(); paint.setColor(Color.WHITE); paint.setTextSize(50); while (thread != null) { score++; canvas = getHolder().lockCanvas(); if (canvas != null){ canvas.drawColor(Color.BLACK); canvas.drawText("score" + score, 0, 50, paint); getHolder().unlockCanvasAndPost(canvas); } } }

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • スレッドの一時停止と再開について

    こんばんは。 VC++.NET2003でC言語にて、UDPソケットプログラミングを行っています。 A:送信端末 B:受信端末 とし、送信端末から受信端末へ各パケットにシーケンス番号を付加し1024Byteずつパケットを送信。受信端末は、送信端末からのパケットを受信するのですが、受信できなかったパケットがある場合、シーケンス番号を送信端末へ送信します。 これらから、送信端末は、送信と受信スレッドを持つ、マルチスレッドを行っています。 以下に送信端末のプログラムを示します。 main{  //受信スレッド生成  hTh = (HANDLE)_beginthreadex(NULL, 0, Sequence_Number, NULL, 0, &thID);  UDPSending(s_port,szServer);  //受信スレッド終了待ち  WaitForSingleObject( hTh, INFINITE );  CloseHandle(hTh); } //送信スレッド UDPSending(s_port,szServer){  //fread関数にて、1024Byteずつ区切る  while((n = fread(send_Buf,1,SEND_DATA_SIZE,fp)) != 0) {   UDPDataSend(s_port, szServer, send_Buff, n+mojisuu);  } } UDPDataSend(unsigned short s_port, char *szServer, char *send_Buff, int n){   sendtoにて受信端末へ送信 } //受信端末からの未受信シーケンス番号を受信(受信スレッド) unsigned __stdcall Sequence_Number(void *lpx){   recvfrom関数によりシーケンス番号を受信 } [付け加えたい機能] 送信スレッドにおいて100個のパケットを送信したら、一時的に送信スレッドを停止させ、受信スレッド内の処理を行い、受信スレッド内の処理が終えたら、再度、送信スレッドを再開させる方法はありますでしょうか? イメージでは・・・ S:送信スレッド R:受信スレッド とした場合、 S(100個パケット送信)→Sの休止→Rの処理→Rの処理が終えたら→Sの再開(再度100パケット送信)・・・・ の繰り返しです。 よろしくお願いします。

  • Chorometerで一時停止した後再開の実装

    Chorometerで一時停止後リスタートの実装がわからないんです。 ソースコード上ではあってるはずなのに現状ではどうしても画面が呼び出されたときにChorometerが開始される、0:05時に一時停止ボタンを押す→5秒後に0:05にはならず0:10になってしまいます。 どうしてそうなるかをお願いします。 package com.exploreralpha; import java.io.IOException; import java.text.BreakIterator; import android.media.MediaPlayer.OnCompletionListener; import android.app.Activity; import android.app.AlertDialog; import android.content.Intent; import android.media.MediaPlayer; import android.os.Bundle; import android.os.SystemClock; import android.provider.MediaStore; import android.provider.MediaStore.Audio.AudioColumns; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.Chronometer; import android.widget.Chronometer.OnChronometerTickListener; import android.widget.ProgressBar; import android.widget.SeekBar; import android.widget.SeekBar.OnSeekBarChangeListener; import android.widget.TextView; import android.widget.Toast; //音楽再生,音楽停止,巻き戻し,繰り返し再生,一時停止,自前コントローラの機能を保有するクラス public class MusicPlayer extends Activity implements OnClickListener, OnCompletionListener { TextView textView; TextView musicEndTime; MediaPlayer music; Button playButton;//音楽再生/一時停止ボタン Button rewindButton;//巻き戻しボタン Button repetMusicButton;//繰り返し再生ボタン Chronometer chorotemer; Long startTime;//開始時間 Long stopTime;//停止時間 int duration;//ファイルの長さ(時間)を取得する変数 int currnetPosion;//現在の再生位置を取得する変数 TextView title;//曲名 TextView artst;//アーティスト名 TextView album;//アルバム名 AlertDialog.Builder dialog; SeekBar seekBar; boolean startFlag; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.music); music =new MediaPlayer(); musicPlay(); //それぞれのリソースIDを取得 playButton=(Button)findViewById(R.id.musicPuse_id); rewindButton=(Button)findViewById(R.id.rewind_id); repetMusicButton=(Button)findViewById(R.id.repetMusic_id); musicEndTime =(TextView)findViewById(R.id.musicEndtime); chorotemer=(Chronometer)findViewById(R.id.startTimer_id); artst =(TextView)findViewById(R.id.artstText_id); //それぞれのボタンが押された時の処理をセットするためsetOnClickListenerインタフェースを //それぞれのボタンにセットしてMusicPlayer本体に実装する playButton.setOnClickListener(this); rewindButton.setOnClickListener(this); repetMusicButton.setOnClickListener(this); music.setOnCompletionListener(this); chorotemer=(Chronometer)findViewById(R.id.startTimer_id); //最初に画面が生成した時に再生ボタンの画像を割り当てる playButton.setBackgroundResource(R.drawable.pause); initMediaDate(); duration =music.getDuration(); String timeStr=TimeText(duration); musicEndTime.setText(timeStr); // 初期値の設定 設定しないと端末が起動してからの時間からスタート if(music.isPlaying()){ startTime=SystemClock.elapsedRealtime(); chorotemer.setBase(startTime); chorotemer.start(); } } /** *@param v * 音楽再生ボタン,音楽停止ボタン,音楽一時停止ボタン,巻き戻しボタンが繰り返し再生ボタンが押された時の処理 */ public void onClick(View v) { if(v==playButton){//一時停止ボタンが押された時の処理 stopTime=SystemClock.elapsedRealtime(); if(music.isPlaying()){//音楽が再生されている時 playButton.setBackgroundResource(R.drawable.musicplay); //Toast.makeText(this, "一時停止されました。", Toast.LENGTH_LONG).show(); music.pause();//一時停止する chorotemer.stop(); }else{//音楽が再生されていない時 playButton.setBackgroundResource(R.drawable.musicpause); //Toast.makeText(this, "再生されました。", Toast.LENGTH_LONG).show(); Long time_1=stopTime-startTime; chorotemer.setBase(SystemClock.elapsedRealtime()-time_1); chorotemer.start(); music.start(); } }

  • 一時停止しなくてもキャプチャのできるソフト

    AVIやWMV、DivX等の動画の静止画キャプチャを撮るためのソフトでいちいち動画を一時停止してからキャプチャボタンを押したら取れるものではなくキャプチャのボタンを押しただけで静止画キャプチャを撮れるソフトってないんでしょうか? 動画を見ている途中に毎回一時停止で中断されるのが嫌なもので・・・しかも結構な枚数を毎回撮ってるので・・・ 有料無料は問わないのでそういうソフトがあったら教えていただけないでしょうか? よろしくお願いいたします。

  • VB Loopを一時停止し再開あるいはキャンセル

    Loopで処理を回しています。処理件数が多く、処理の途中で一時停止させ、DataGridViewに表示されている処理結果を目で確認ないしマウスでコピーしてから、処理を再開ないしキャンセルして終了させる仕様を作成中です。 MessageBoxを使用すれば、Loopは一時停止出来たのですが、MessageBoxだとDataGridView上の処理結果をマウスでコピーなど出来ません。 そこで、MessageBoxを使用せずに、以下のコマンドを書いてみたのですが、最初のStopFlag=Trueが効くだけで次のコマンドは一瞬で処理されLoopが続いてしまいます。いかにすればLoopを一時停止できるか教えてください。 <変数宣言> Public StopFlag As Boolean Public CancelFlag As Boolean <前処理> TextBox1.Text = "処理待ち" 'テキストボックスに処理ステータスを表しています。 TextBox1.Refresh() <処理> Do Me.Cursor = Cursors.WaitCursor '砂時計開始 TextBox1.Text = "処理中" ’ステータスを処理中として表示 TextBox1.Refresh() ~ Application.DoEvents() 'ストップボタンを押下したらここでDoEventsさせます。 If StopFlag = True Then ’ここでLoopを一時停止させておきたいのです。 Me.Cursor = Cursors.Default '一旦砂時計を止めます TextBox1.Text = "処理一時停止" TextBox1.Refresh() If StopFlag = False Then ’再開ボタンが押下されたらここで再開させたい。 TextBox1.Text = "処理中" ’処理中と表示させます TextBox1.Refresh() Me.Cursor = Cursors.WaitCursor '砂時計再開です ElseIf CancelFlag = True Then ’キャンセルボタンが押下されれば、処理はLoopを抜けます。 TextBox1.Text = "キャンセル" TextBox1.Refresh() Exit Do End If Loop '----------ストップボタン---------- Private Sub Button2_Click~ StopFlag = True End Sub '----------再開ボタン---------- Private Sub Button3_Click~ StopFlag = False End Sub '----------キャンセルボタン---------- Private Sub Button4_Click~ CancelFlag = True End Sub この質問に補足する

  • Solaris 9 インストール途中で一時停止される

    Sun Ultra5 にSolaris 9をインストールしています。Solaris Installationの次にSoftware 1 of 2を挿入しインストールを行いました。 しかし、インストール途中で一時停止を促すWindowが現れ、継続ボタンを押すとインストール途中にもかかわらず、Software 2of2を入れるように支持されます。 Software 2of2のインストールでも同様にインストール途中に一時停止されてしまいます。 Solaris9にデフォルトでインストールされているはずのSSHなどが入っていないため、正しくインストールできていないようです。 ネットワークインストールも試したため、CDドライブの問題ではないようです。 5回ほど試しましたが、全て同様の現象が発生し、インストールができず困っています。 どなたかご存知の方、ご教授願います。 (2重投稿していたらすみません)

  • 停止の仕方が…

    Scythe製のDIGITAL MUSIC PLAYER MEGATREK spec.Aの512MB MODELを使用しています。 一時停止と、電源オフには出来るのですが、停止が出来ず、再度電源を入れても途中からの再生になり、困っています。 再生中にボタンを軽く押すと一時停止、3秒以上押すと電源オフになるのですが、どうにかして、停止に出来ないでしょうか?

  • YouTube画面の停止は?

    最近YouTubeにはまっております初心者です。(今頃遅れてル~ なんて言われそう) 1.使用方法ですが、「動画を再生していて途中で停止したい時には、どのような操作をすればよろしいでしょうか?」 画面下には一時停止のボタンはありますが停止のボタンはありません。 今まではタブで画面を出して、停止のときはそのタブを消しています? 戻るボタンでもどって別の画面を選択すると、前の動画の音声だけダブって聞こえてきます。 2.音声だけダウンロードすることはできるのでしょうか? どうぞよろしくおねがいいたします。

  • ウイルスバスター2007の手動検索が出来ない

    ウイルスバスター2007で手動検索を始めると間もなく一時停止します。 右下の「停止ボタン」と「一時停止ボタン」は、一時停止ボタンの色が薄くなっていてポインタに反応しません。 したがって検索を続行が出来ない状態です。 前回の検索で一時停止を使った記憶は全くないのですが? この2007の有効期限は来年三月まであります。 よろしくお願い致します。

  • 三洋電機製のICレコーダーICR-PS603RMの録音ボタンは一時停止ボタンを兼ねているか?

     三洋電機のホームページにアクセスして取り扱い説明書をダウンロードしようとしましたが、当方の端末の都合により出来ませんでした(現在、パソコンは所有しておりません)。 (1)カタログの写真では録音ボタンが一時停止ボタンを兼ねていないようで(現在所有しているソニー製のICD-AX70は兼ねている)、同一フォルダー内での一時停止はどのようにするのだろうと思ったのです。同社の ICR-PS1000M、PS390RM、PS285RMは、録音ボタンの所に一時停止の表記があります。もし出来ないと、例えば、電車に乗っていて駅のアナウンスを一つの路線で続けて録音して行きたい場合、停止ボタンで止めると、再生の時に駅ごとにフォルダーが変わってしまい、機器のボタンをいちいち押さなければならず、不便だなと思ったのです。  ほかの場所に一時停止の為のスイッチあるいはボタンがあるのでしょうか。 (2)カタログの写真では、液晶の表示部はバックライトが点灯している状態のようで、おそらく、無操作状態が30秒あるいは1分ほど続いた場合に自動で消灯するものと思うのですが、バックライト点灯中ははもしかしたら、〈ツーン〉と 言うようなわずかな雑音が出ると思ったので(手持ちの目覚まし時計が、そうです。表示部の面積は時計の方が2倍以上あります)、その影響はどの程度のものであるか知りたいです。  以上、購入前の参考にしたいと思い、質問いたします。(操作時のガサゴソ音をマイクが拾ってしまう などもあるかも知れません)

  • iphoneで停止した位置から再生したい

    私はiphoneに落語を入れて聞いているのですが、途中まで再生して停止すると、次に再生するときまた頭から再生になってしまいます。 停止直後や1時間2時間程度だったらまた続きから再生されるのですが、5時間とかそのくらい経つと頭から再生になってしまうのです。 何回も同じ話を聞くことになってしまいます。 どうしたら止めたところから再生することができるのでしょうか? ちょっと前までは停止したところから再生できたのですができなくなってしまったのです。 止め方はまず電源ボタンを押して、ロック画面にしてからホームボタンをダブルクリックして音楽再生画面にしてから停止ボタンを押すという止め方です。 ですがいろんな止め方をやってみても時間がたつとまた戻ってしまうのです。 バージョンは6.1.3です。 教えてください

このQ&Aのポイント
  • 常陽銀行で電話番号を変更する方法について教えてください。手続きは簡単で、オンラインや電話で申し込むことができます。
  • 電話番号変更には何か条件はありますか?特定の書類が必要ですか?通知期間はどのくらい必要ですか?
  • 電話番号を変更する際には、身分証明書や銀行口座情報などの書類の提出が必要となる場合があります。通知期間は約1週間前までとなっています。
回答を見る