質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

Q&A

解決済

3回答

2599閲覧

当たり判定の処理を一時的に止めるにはどうしたらいいですか?

taiyokarasu

総合スコア27

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

0グッド

0クリップ

投稿2016/11/22 03:15

編集2016/11/23 15:08

//mysocoreが○○より高く、レベルが○ならレベルが上昇
if((Score.myscore > 160)&&(Level.level==0)){

Level.addLevel(); }

//myscoreが○○より高く、○○より低いか等しい場合、さらにレベルが○ならばクリアの文字を表示する
if((Score.myscore<=180)&&(Score.myscore> 160)&&(Level.level==1)){

title.drawGameclear(gBuf); }

質問を変えます
上のプログラムは、クラスMyCanvasのプログラムの一部です。レベル上昇の条件と、クリアという文字を表示する処理をしています。

void gameMain()
{
//ゲームオーバーか?
if (objectpool.isGameover())
{
//ゲームオーバー文字を表示
title.drawGameover(gBuf);

これが、ゲームオーバーの文字を表示するプログラムです
ゲームオーバーかどうかを返すプログラムはObjectPoolというクラスにあります

ゲームオーバーになってSPACEキーを押すと、タイトル画面に戻る仕組みです

レベル上昇して、しばらく当たり判定のプログラムを停止させたいです
そうすれば、レベル上昇と同時にゲームオーバーになることは防げると思います

しかし、当たり判定はゲームオーバーと同じくObjectPoolで書かれていて、どうやってMyCanvasで当たり判定のプログラムを停止させる処理を作ればいいのかがわかりません。レベルが上がって、しばらく処理を停止させるにはどうしたらいいでしょうか?

それか、決められた時間の間だけ、文字を表示するにはどうしたらいいですか?

この下が、MyCanvasのすべてのプログラムです
なお、このプログラムはサンプルコードとして配布していたものを私が改造していっている段階です

もともと、このプログラムにはレベルが上がるためのクリア条件というものがありませんでした
500フレーム経過すると、自然とレベルが上がり、ひたすらhiscoreを競うものだったようです。
上記のものは、私がレベルを一つずつ上げるために追加したものです。

import java.awt.Canvas; import java.awt.Color; import java.awt.Graphics; import java.awt.Image; import java.util.Random; /** *描画先コンポーネントクラス(Canvasを継承)<p> *メインループもここ */ public class MyCanvas extends Canvas implements Runnable{ ObjectPool objectpool; KeyInput keyinput; Image imgBuf; Graphics gBuf; Random random; Title title; Score score; /** * シーン管理変数<p> * 0:タイトル画面 1:ゲームのメイン画面 */ public int scene; static final int SCENE_TITLE = 0; static final int SCENE_GAMEMAIN = 1; public boolean gameover; int counter; //押されている static final int SHOT_PRESSED = 1; //今押されたばかり static final int SHOT_DOWN = 2; int shotkey_state; /** * コンストラクタ */ MyCanvas() { //キーリスナ実装 keyinput = new KeyInput(); addKeyListener(keyinput); setFocusable(true); //フォーカスを取得できるようにする。 random = new Random(); //乱数オブジェクト title = new Title(); score = new Score(); } /** * 初期化処理<p> * アプリケーションの開始時、またはリスタート時に呼ばれ、<br> * ゲーム内で使われる変数の初期化を行う。 */ public void init() { objectpool = new ObjectPool(); Score.loadScore(); //シーンはタイトル画面 scene = SCENE_TITLE; gameover = false; //レベルの初期化 Level.initLevel(); //スコアの初期化 Score.initScore(); Title.initTitle(); } /** * 外部からスレッドを初期化する。 */ public void initThread() { Thread thread = new Thread(this); thread.start(); } /** * 描画処理<p> * repaint()の際に呼ばれて、 * オフスクリーンバッファから画像をコピーし表示する。 * @param g 描画先グラフィックハンドル */ public void paint(Graphics g) { //オフスクリーンバッファの内容を自分にコピー g.drawImage(imgBuf, 0, 0, this); } /** * メインループ */ public void run() { //オフスクリーンバッファ作成 imgBuf = createImage(500, 500); gBuf = imgBuf.getGraphics(); for(counter = 0; ; counter++) { shotkey_state = keyinput.checkShotKey(); //バッファをクリア gBuf.setColor(Color.white); gBuf.fillRect(0, 0, 500, 500); //シーン遷移用の変数で分岐 switch (scene) { //タイトル画面 case 0: title.drawTitle(gBuf); score.drawScore(gBuf); score.drawHiScore(gBuf); //スペースキーが押された if (shotkey_state == SHOT_DOWN) { //メイン画面に行く scene = SCENE_GAMEMAIN; } break; //ゲームのメイン画面 case 1: gameMain(); break; } //再描画を要求 repaint(); try{ Thread.sleep(20); //ループのウェイト } catch(InterruptedException e) {} } } /** * 画面をいちいちクリアしないようにするため、 * updateメソッドをオーバーライドする。 * @param g 更新先グラフィックハンドル */ public void update(Graphics g) { paint(g); } /** * ゲーム画面のメイン処理 */ void gameMain() { //ゲームオーバーか? if (objectpool.isGameover()) { //ゲームオーバー文字を表示 title.drawGameover(gBuf); if (shotkey_state == SHOT_DOWN) { //スコアをハイスコアに適用、必要があればセーブ Score.compareScore(); //ゲームを再初期化 init(); } } //衝突の判定 objectpool.getColision(); objectpool.movePlayer(keyinput); //敵出現間隔:レベルに応じて短くなる if (counter % (100 - Level.getLevel() * 10) == 0) { ObjectPool.newEnemy(100 + random.nextInt(300), 0); } //500フレーム経過するとレベルが上昇 if ((Score.myscore >100)&&(Level.getLevel() == 0)){ Level.addLevel(); } if ((150>Score.myscore)&&(Score.myscore >100)&&(Level.getLevel() == 1)){ title.drawGameclear(gBuf); } if ((Score.myscore >200)&&(Level.getLevel() == 1)){ Level.addLevel(); } if ((Score.myscore >300)&&(Level.getLevel() == 2)){ Level.addLevel(); } if ((Score.myscore >400)&&(Level.getLevel() == 3)){ Level.addLevel(); } if ((Score.myscore >500)&&(Level.getLevel() == 4)){ Level.addLevel(); } if((Score.myscore >600)&&(Level.getLevel() == 5)){ Level.addLevel(); } if((Score.myscore >700)&&(Level.getLevel() == 6)){ Level.addLevel(); } if((Score.myscore >800)&&(Level.getLevel() == 7)){ Level.addLevel(); } //スペースキーが押されており、かつカウンタが3の倍数なら弾を撃つ(等間隔に弾を撃てる) if ((shotkey_state == SHOT_PRESSED)&&(counter % 3 == 0)) { objectpool.shotPlayer(); } //ゲームオブジェクトの一括描画処理 objectpool.drawAll(gBuf); //スコア描画 score.drawScore(gBuf); score.drawHiScore(gBuf); } }

`

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

coco_bauer

2016/11/22 03:42

「レベルが上昇」、「クリアと表示」、「ゲームオーバー」という順に起こる訳ですから、クリアを表示しないというのは無理(その時にはゲームオーバーになっていないので)。クリアの条件が整っていたらクリアの表示を削除して、その後にゲームオーバーの表示をするという方針が良さそうに思えます。
ishi9

2016/11/22 03:55 編集

ゲームクリアの演出中にゲームオーバーになる事があるゲームって仕様的にどうなの?(普通のゲームは一旦ストップにしたり無敵にしたりしませんか?)とは思いますが、それが仕様だというのなら、ゲームクリアの演出を中断できるようにしておくのがいいかもしれませんね。でも一番に考えるべきはゲームの仕様ry
guest

回答3

0

ベストアンサー

ざっくりですが、一例を書いてみます。
まずTitleにIsGameclearという関数を追加してください。
そしてこの関数はtitle.drawGameclearが呼ばれるとtrueになり、
title.drawGameclearが終わるとfalseが返るように実装してください。
(Title内にフラグ用のbool変数を用意しておけばそう難しくはないと思います)

後は下記のように書けばゲームクリア演出中かわかるようになるはずです。

if (title.IsGameclear()) { }

投稿2016/11/24 04:08

ishi9

総合スコア1294

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

taiyokarasu

2016/11/25 01:32

すみません。まず、IsGameclearの関数の中身をどうしたらいいのかわかりません isGameoverの関数は public boolean isGameover() { return !player.active; } こんな感じで、ObjectPoolというクラスにあります これと同じような感じで作ればいいのでしょうか?
ishi9

2016/11/25 01:53 編集

そうですね。そんな感じです。 ただ、追加するのはObjectPoolクラスではなくTitleクラスにした方がいいです。 (drawGameclear()の中を知っているのがTitleクラスなので) 例えば、Titleクラスに「boolean gameclearFlag;」みたいなメンバ変数を追加します。 後はdrawGameclear関数の一番最初で「gameclearFlag=true;」ってやって 演出が終わったら「gameclearFlag=false;」にします。 後は返答コメントでやっているようにgameclearFlagをreturnするだけです。
taiyokarasu

2016/11/25 02:29

isGameoverと同じような感じというと、 return player.active;と入力すると考えていいんでしょうか? それとも、レベルが上がる条件のようなものを書き込んだ方がいいのでしょうか?
ishi9

2016/11/25 02:52 編集

すいません、こちらが提案しているのがどういうものなのかちゃんと説明できていませんでした。 まず質問文のタイトルの通り 「当たり判定の処理を一時的に止めるにはどうしたらいいですか?」 これがずっと当たり判定の処理を止めたいであれば if (false) // 絶対に通らない { objectpool.getColision(); } と書けば多分実現できますよね?(まぁ中の処理を知らないので変なバグが出るのかもしれませんが) なので重要なのは「一時的に」の部分です。 この「一時的に」を私は「ゲームクリアの演出中」と解釈しました。 つまりゲームクリアの文字が描画されている間です。 その区間がわかるようになるためにIsGameclear()という関数を作ってみては?という提案をしました。 なのでIsGameclear()関数はゲームクリアの文字列が出ている間だけtrueを返すように作らないといけません。 この中身を質問者様の言うとおり「return player.active;」と書いたらどうなるでしょうか? これは「ゲームクリアの文字列が出ている間だけ」という条件を満たしているでしょうか? そこで一つ前の私の返答に戻ってください。 私がやってほしいと思っていたのは「ゲームクリアの文字が出ている間はtrue」になる処理です。 ここまで見てちょっと何言ってんのかよくわかんないという場合は、 すいません。多分、私のアプローチが間違っていたのだと思いますのでこの回答の事は忘れてください。
ishi9

2016/11/25 02:58

・・・あ すいません、やっぱり私が完全に勘違いしていましたね。 そもそも文字列を一定時間表示する方法自体も質問対象ですね。 やっぱり一旦この回答の事は置いておいてください
guest

0

まず皆さんも指摘しているとおりにクリアの最中にゲームオーバーになるというのがよくわかりませんが…
Javaの動きとして回答したいと思います。

まず前提として、処理を動いている途中に消す、というのは意図しないタイミングで処理が中断してしまう可能性があるのでおすすめしません。
また、スレッドの一時停止ブレークポイントのことでしょうか?
それでしたらこれはデバッグ時に使用するものであり、プログラムの動きではないので、結局動かすときに残ってしまうことになるかと思います。
途中で処理を抜ける、ならわかりますが。

ので、初期化処理を挟んであげるのがスタンダードかと思われます。
以下のように設計し直してみてください。

用意するクラス
0. レベルアップクラス

  1. クリアと表示させるクラス
  2. ゲームオーバーと表示させるクラス
  3. 初期表示(クリアともゲームオーバーとも表示されない)クラス
  4. 実行メインクラス

※初期表示クラスの補足
表示されている文字が何であろうと、初期化し大元の表示に戻すクラス

java

1処理を行うクラス(メインクラス){ 2 3 処理を行うメソッド{ 4 条件1(レベルアップしたか){ 5 レベルアップ処理の呼び出し 6 クリア表示処理の呼び出し 7 初期表示処理の呼び出し 89 条件2(ゲームオーバーになるか){ 10 ゲームオーバー処理の呼び出し 11 (必要であれば初期表示処理) 12 } 13 } 14}

実際どのようにコードを書いているかわかりませんので言葉での説明になりましたがこのような感じになるかと思います。

投稿2016/11/22 06:37

rudolf_fox

総合スコア25

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

taiyokarasu

2016/12/06 07:09

レベルアップしたかや、ゲームオーバーになるかというプログラムはどういう風に書けばいいのでしょうか。 レベルアップの方は、何となくできなくもないですが、ゲームオーバーになるかという条件のプログラムはどうすればいいのかがわかりません。 あと、私の作っているこのゲームは一発でも敵の攻撃を受けると死にます。
guest

0

ソースコードが無いので想像ですが、おそらく、スレッドの中で
・判定1 -> 描画1
・判定2 -> 描画2
・判定3 -> 描画3

と繰り返してしているので、取消できないか?という質問に至っている?と想像しました。

ゆえに、順次描画しているところを、ちょっと我慢して、
・判定1 -> 描画1のフラグを立てる
・判定2 -> 描画2のフラグを立てる
・判定3 -> 描画3のフラグを立てる
・全ての判定が終わったら、描画1・2・3のフラグを判定し、優先して描きたい描画だけ行う。

ということではいかがですか。

投稿2016/11/22 06:31

akio221

総合スコア716

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

akio221

2016/11/23 15:11

>レベル上昇して、しばらく当たり判定のプログラムを停止させたいです >そうすれば、レベル上昇と同時にゲームオーバーになることは防げると思います 新たな変数を置いておき、レベルが上がった判定時に レベルが上がった時のcounter値をとっておいて、 objectpool.getColision()を呼ぶ直前に、 現在のcounterと差分がいくらか以内であれば呼ばない、で短期的には解決できそうに見えます。
taiyokarasu

2016/12/06 03:08

突然にすみません。説明された内容をプログラムにすることができません。 具体的には、どういうプログラムにすればいいのでしょうか
akio221

2016/12/06 04:14

特に難しいことを述べているわけではありません。 privateな変数、(仮名)levelupTimeを準備し、 Level.addLevel();の中で、 levelupTime = counter;とすれば、LVが上がったタイミングがわかるので、 if (levelupTime + 10 < counter) { //1スリープ20ms なので、200msは衝突しない objectpool.getColision(); } といった具合です。ニューゲームの際にはlevelupTimeをクリアすることをお忘れなく。
taiyokarasu

2016/12/06 07:15

//500フレーム経過するとレベルが上昇 if ((Score.myscore >100)&&(Level.getLevel() == 0)){ Level.addLevel(); } if ((150>Score.myscore)&&(Score.myscore >100)&&(Level.getLevel() == 1)){ title.drawGameclear(gBuf); } こんな感じのプログラムですが、変更する必要はあるでしょうか。
akio221

2016/12/06 07:26

>こんな感じのプログラムですが、変更する必要はあるでしょうか。 ちょっと質問の意図がよく見えませんが、変更しなければ、 「レベル上昇による一時的な判定の停止」が行えないだけです。 そして、その必要性は製作者たる貴方にしか判断できません。 今一度、じっくりと元サンプルソースを読み、一体どのような動作になっているのか、 確認の上で、どのように改造するか、再検討することをお勧めします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問