2017-08-07 5 views
0
package TheWork; 
import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 
import java.util.Arrays; 
import java.util.Random; 
import java.util.Timer; 
import java.util.TimerTask; 

import javax.swing.JPanel; 

public class MainPanel extends JPanel implements KeyListener, Runnable 
{ 
private Cannon P1 = Cannon.getPlayer(); 
private TheirBullet[] bullets = {}; 
private TheirRocket[] rockets = {}; 
private Enemy[] enemies = {}; 
private long timeCount = 0; 
private int timeDis = 10; 

public void drawCannon(Graphics g) 
{ 
    g.setColor(Color.BLUE); 
    g.fillRect((int)P1.getX() - 20, (int)Cannon.POS_Y, 40, 20); 
    g.fillRect((int)P1.getX() - 5, (int)Cannon.POS_Y - 5, 2, 20); 
    g.fillRect((int)P1.getX() + 3, (int)Cannon.POS_Y - 5, 2, 20); 
} 

public void drawGoodBullet(Graphics g) 
{ 
    for(YourBullet temp : P1.bullets) 
    { 
    if(temp != null && temp.hit == false) 
     { 
      g.setColor(Color.BLUE); 
      g.drawRect((int)temp.x - 2, (int)temp.y - 2, 4, 4); 
     } 
    if(temp.hit == true) 
     { 
      P1.bullets.remove(temp); 
     } 
    } 
} 

public void drawBadBullet(Graphics g) 
{ 
    for(int i = 0;i < bullets.length;i++) 
    { 
     TheirBullet temp = bullets[i]; 
     g.setColor(Color.GREEN); 
     g.drawRect((int)temp.x - 2, (int)temp.y - 2, 4, 4); 
    } 
    for(int i = 0;i < rockets.length;i++) 
    { 
     TheirRocket temp = rockets[i]; 
     g.setColor(Color.RED); 
     g.drawRect((int)temp.x - 1, (int)temp.y - 4, 2, 8); 
    } 

} 

public void drawEnemy(Graphics g) 
{ 
    for(int i = 0;i < enemies.length;i++) 
    { 
     Enemy temp = enemies[i]; 
     if(temp instanceof Fodder) 
     { 
      g.setColor(Color.GREEN); 
     } 
     else 
     { 
      g.setColor(Color.RED); 
     } 
     g.fillRect((int)temp.getX() - 10, (int)temp.getY() - 5, 20, 10); 
     g.fillRect((int)temp.getX()-2, (int)temp.getY(), 4, 10); 
    } 
} 

@Override 
public void paint(Graphics g) 
{ 
    super.paint(g); 
    drawCannon(g); 
    drawGoodBullet(g); 
    drawBadBullet(g); 
    drawEnemy(g); 
} 


@Override 
public void run() 
{ 
    timeCount++; 
    System.out.println("check 1"); 
    if(timeCount % 300 == 0) 
    { 
     Enemy poorThing = generate(); 
     System.out.println("get"); 
     enemies = Arrays.copyOf(enemies, enemies.length + 1); 
     enemies[enemies.length - 1] = poorThing; 
    } 
    System.out.println("check 2"); 
    for(int i = 0;i < enemies.length;i++) 
    { 
     Enemy temp = enemies[i]; 
     temp.move(); 
    } 
    System.out.println("check 3"); 
    while(true) 
    { 
     try 
     { 
      Thread.sleep(timeDis); 
     } 
     catch (InterruptedException e) 
     { 
      e.printStackTrace(); 
     } 
    System.out.println("check 4"); 
    this.repaint(); 
    System.out.println("check 5"); 
    } 

} 




@Override 
public void keyPressed(KeyEvent e) 
{ 
    if(e.getKeyCode() == KeyEvent.VK_LEFT && P1.getX() > 20) 
    { 
     P1.goLeft(); 
     P1.setWay(-1); 
    } 
    else if(e.getKeyCode() == KeyEvent.VK_RIGHT && P1.getX() < 780) 
    { 
     P1.goRight(); 
     P1.setWay(1); 
    } 
    if(e.getKeyCode() == KeyEvent.VK_SPACE) 
    { 
     if(P1.bullets.size() <= 6) 
     { 
      P1.shoot(); 
     } 
    } 
    this.repaint(); 
} 

@Override 
public void keyReleased(KeyEvent arg0) { 
    // TODO Auto-generated method stub 

} 

@Override 
public void keyTyped(KeyEvent arg0) { 
    // TODO Auto-generated method stub 

} 

public static Enemy generate() 
{ 
    Random r = new Random(); 
    Random s = new Random(); 
    Random t = new Random(); 
    int chance = r.nextInt(10); 
    int dirDec = s.nextInt(2); 
    int tirDec = t.nextInt(5); 
    if(chance >= 8) 
    { 
     System.out.println("A acquired"); 
     return new Danger(dirDec, tirDec); 

    } 
    else 
    { 
     System.out.println("B acquired"); 
     return new Fodder(dirDec, tirDec); 

    } 

} 


} 

繰り返されていないです:私は(キャノンクラスの)選手オブジェクトの両方が敵のサブクラスで飼料や危険クラスの敵オブジェクトを(、撃つゲームを作成しようとしていますrun()メソッド(スレッドは別のクラスで開始されます)で呼び出されるgenerate()メソッドによって生成されます。いくつかのコードは何が起こっている

しかし、私は決して単一の敵オブジェクトを作成することはありません。プログラムがどのように流れているかを確認するためにprintln文を挿入しました。その結果、「A取得」と「B取得」は決して起こらず、「Check 1」、「Check 2」、「Check 3」、 "Check 4"と "Check 5"の無限ループ。だけランダムに、

また、プレイヤオブジェクトが作成されますし、適切に描きました。何も変更せずにコードを実行しようとすると、結果は常に作業中と無塗装の間で変化します。

私は本当にどうもありがとうございました、私は間違っていた場所を知りたいです。

+0

ようこそ。投稿を検討する[mcve] – c0der

答えて

1

while(true)には敵の世代は含まれません。その時点(最初の実行の呼び出し)のタイムカウントは1でなく0でないため、条件は1回だけ入力できます。

+0

うわー、私は(真実)の下にすべてを置くように、それは動作しました、ありがとう!私は前にrun()について間違った考えを持っていたと思う、いつもauto repeatと思った。しかし、プログラムが時々正しく動作するのはなぜですか?私がやっているのと同じように、「実行」ボタンを押しても結果は安定しません。 –

+0

@OryolUperi並行性に問題があるようです。マルチスレッドのプログラミングは簡単ではなく、チュートリアルを慎重に勉強していないと、おそらくレースコンディションやその他のバグがあなたのコードに入っているでしょう。 – Kayaman

関連する問題