2017-08-11 5 views
-1

私の最終的なJavaクラスでは、十分な時間がないため、公式のものより単純なバージョンを除いて、小惑星ゲームを作っています。Java小惑星ゲームどのように最初のショットを消さずに複数のショットを発射できるようにするには?

私たちの船がショット(SPACEバー)を追加(ショット、x、y)すると問題になりますが、SPACEバーを再度クリックするとそのショットが元のx、yに戻されます。だから、今は一度に1発ずつしか発砲することができません。私たちは、複数のショットを発射してそれらをすべて目に見えるようにすることができるようにしたいと考えています。

これを行う方法がわかりません。どんな助けもありがとうございます。

P.S.必要に応じてコードを追加します。 P.S.S.私はコードを含むのではなく、明らかにそうではないことを、私は後で投稿を編集できると思った。

package week7Homework; 
import acm.program.GraphicsProgram; 
import java.util.*; 
import java.awt.event.*; 


import acm.graphics.*; 
import java.awt.Color; 
import java.awt.Image; 

public class space8bit extends GraphicsProgram 
{ 
    /* Initialize everything that is needed */ 
     final int WIN_HEIGHT = 800; 
     final int WIN_WIDTH = 1900; 
     GImage space = new GImage("/College/IT219/Week7/src/week7Homework/outerspace.png"); 
     GImage ship = new GImage("/College/IT219/Week7/src/week7Homework/ship.png"); 
     GImage explosion = new GImage("/College/IT219/Week7/src/week7Homework/explosion.png"); 
     GImage [] ast = new GImage[6]; 
     Random rand = new Random(); 
     pewpew shots = new pewpew(); 
     int shipx; 
     int shipy; 



public void init() 
{ 
     setSize(WIN_WIDTH, WIN_HEIGHT); 
     add(space); 
     ship.setLocation(50,330); 
     ship.scale(.8); 
     add(ship); 
     addKeyListeners(); 

     //scale explosion 
     explosion.scale(.5); 

} 
public void keyPressed(KeyEvent e) 
{ 
int key = e.getKeyCode(); 
if (key == KeyEvent.VK_UP) 
{ ship.move(0, -15); } 
/*else if (key == KeyEvent.VK_SPACE) 
{ xMove = MV_AMT; }*/ 
else if (key == KeyEvent.VK_DOWN) 
{ ship.move(0, 15); } 
else if (key == KeyEvent.VK_SPACE) 
{shipx = (int)ship.getX()+195; 
shipy = (int)ship.getY() + 80; 
    add(shots,shipx,shipy); 
} 

} 
public void asteriods() 
{ 
    GImage ast1 = new GImage("/College/IT219/Week7/src/week7Homework/asteriod.png",1300,100); 
    GImage ast2 = new GImage("/College/IT219/Week7/src/week7Homework/asteriod.png",1750,250); 
    GImage ast3 = new GImage("/College/IT219/Week7/src/week7Homework/asteriod.png",1650,350); 
    GImage ast4 = new GImage("/College/IT219/Week7/src/week7Homework/asteriod.png",1550,650); 
    GImage ast5 = new GImage("/College/IT219/Week7/src/week7Homework/asteriod.png",1450,600); 
    GImage ast6 = new GImage("/College/IT219/Week7/src/week7Homework/asteriod.png",1350,750); 
    ast [0] = ast1; 
    ast [1] = ast2; 
    ast [2] = ast3; 
    ast [3] = ast4; 
    ast [4] = ast5; 
    ast [5] = ast6; 

    add(ast[0]); 
    add(ast[1]); 
    add(ast[2]); 
    add(ast[3]); 
    add(ast[4]); 
    add(ast[5]); 


} 

public void run() 
{ 
    asteriods(); 
    while(true) 
    { 
     pause(120); 

     int random1x = rand.nextInt(-1+1+6)-9; 
     int random2x = rand.nextInt(-1+1+6)-15; 
     int random3x = rand.nextInt(-1+1+6)-25; 
     int random4x = rand.nextInt(-1+1+6)-16; 
     int random5x = rand.nextInt(-1+1+6)-8; 
     int random6x = rand.nextInt(-1+1+6)-13; 

     ast[0].move(random1x, 0); 
     ast[1].move(random2x, 0); 
     ast[2].move(random3x, 0); 
     ast[3].move(random4x, 0); 
     ast[4].move(random5x, 0); 
     ast[5].move(random6x, 0); 

     shots.move(50, 0); 

     for (int i = 0; i < ast.length; i++) 
     { 
      //integer that gets bounds of all rectangles and ovals in the arrays. 
      GRectangle asteroidBounds = ast[i].getBounds(); 

      //check for collision with other objects 
      if (shots.getBounds().intersects(asteroidBounds)) 
      { 
       int shotX = (int)shots.getX(); 
       int shotY = (int)shots.getY(); 

       pause(10); 
       remove(ast[i]); 
       add(explosion, shotX-100, shotY - 50); 
       remove(shots); 
       pause(25); 
       remove(explosion); 


      } 

      else if (ship.getY() <= 0) 
      { 
       ship.move(0, 15); 
      } 
      else if (ship.getY() >= WIN_HEIGHT - 168) 
      { 
       ship.move(0, -15); 
      } 
     } 
    } 
} 

} 

サンプルコードは、これよりもはるかに短く同じことをしています。スペースバーを押すだけで、あなたは何を話しているのか分かります。

package week7Homework; 

import acm.graphics.*; 
import acm.program.*; 

import java.awt.*; 
import java.awt.event.*; 

public class collisionTry extends GraphicsProgram 
{ 

    final int WIN_WIDTH = 500; 
    final int WIN_HEIGHT = 500; 


    GOval ship = new GOval(100, 250, 50, 50); 

    GImage bullet = new GImage("/College/IT219/Week7/src/week7Homework/bullet.gif", 50, 50); 

    GImage bullet2; 


    boolean bulletFired; 


    public void init() 
    { 
     setSize(WIN_WIDTH, WIN_HEIGHT); 

     addKeyListeners(); 

    } 



    public void run() 
    { 
     GRect rect = new GRect(400, 200, 50, 150); 


     add(rect); 
     rect.setColor(Color.BLACK); 
     rect.setFilled(true); 

     add(ship); 
     ship.setColor(Color.BLACK); 
     ship.setFilled(true); 

     while (true) 
     { 
      pause(50); 
      rect.move(-1, 0); 

      //bullet.move(5, 0); 

      if (bulletFired == true) 
      { 
       bullet.move(5, 0); 

      } 

      if (bullet.getBounds().intersects(rect.getBounds())) 
      { 
       remove(rect); 
       remove(bullet); 
      } 
     } 

    }//run 

    public void keyPressed(KeyEvent e) 
    { 
     int key = e.getKeyCode(); 
     if(key == KeyEvent.VK_SPACE) 
     { 

      int shipX = (int)ship.getX(); 
      int shipY = (int)ship.getY(); 
      add(bullet, shipX+50, shipY+25); 
      bulletFired = true; 

     } 
     else if (key == KeyEvent.VK_UP){ 
      ship.move(0, -5); 
     } 
    } 





} 
+0

ここにサンプルコードがあります。スペースを数回押すと、何を意味するのかが正確にわかります。 – Eddy

+1

[重複を投稿しない](https://stackoverflow.com/questions/45625436/java-asteroids-game-how-to-beable-to-fire-multiple-shots-without-having-the- fi)追加する情報がある場合は、元の投稿を編集します。 – shmosel

+0

申し訳ありませんが、私はすぐにそれを見ていませんでした、私はそれをgoogledが、それは投稿を編集する特権(私はそれも自分の記事に当てはまると思った)残念です。そして、今私はハハをブロックし、さらに質問があると思った。 fml。 – Eddy

答えて

0

あなただけあなたが1つの弾丸はに戻っていることを言っている

if (bulletFired == true) { 
    bullet.move(5, 0); 
} 

ゲーム全体で1つの弾丸を持っている原因それはだ(5、0)

あなたは見つける必要がありますこれはどのようにしたいDの私のビジョンはあるものの

if (key == KeyEvent.VK_SPACE) { 
    int shipX = (int)ship.getX(); 
    int shipY = (int)ship.getY(); 

    Bullet firedBullet = new Bullet(/* params if any, x? y? */); 

    add(firedBullet, shipX+50, shipY+25); 
    bulletFired = true; 
} 

:新しい弾丸オブジェクトを毎回作るいくつかの方法は、あなたは、スペースキーを押しますあなたのゲームではうまくいきません。(あなたのクラス、あなたの役割などはわかりません)しかし、うまくいけば、私は何を得てそれを適応させるのかを見ることができます。

複数の弾丸があるため、そのライフタイムも注意する必要があります。あなたはゲームの開始時に1000発の弾を発射し、彼らはスクリーン外に出ます。残りのゲームのために時間を無駄にしたくない。したがって、描画するオブジェクトを追跡するために使用しているリスト/配列は、オフスクリーンになっているものを定期的に見つけて削除する必要があります。

関連する問題