//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); } }
`
回答3件
あなたの回答
tips
プレビュー