Jak stworzyć nowy obiekt po naciśnięciu klawisza, aby stary obiekt nie ginął?

0

Witam. Mój problem polega na tym że w "grze" po nacisnieciu spacji wylatuje pocisk. Kiedy nacisnę jeszcze raz pocisk wylatuje ale tamten koczy swą zywotność, a chciałbym zrobić ciągłe strzały.

1

masz błąd w linii 234 oraz 356.

1

Więc musisz mieć kilka obiektów pocisk.

0
  public void drawShot(Graphics g) {
       if (shot.isVisible())
            g.drawImage(shot.getImage(), shot.getX(), shot.getY(), this);
    }
  public void keyPressed(KeyEvent e) {

          player.keyPressed(e);

          int x = player.getX();
          int y = player.getY();

          if (ingame)
          {
            if (e.getKeyCode() == KeyEvent.VK_SPACE) {
            		shot.isVisible();
                    shot = new Shot(x, y);
            }
          }
        }
 public Shot(int x, int y) {

        ImageIcon ii = new ImageIcon(this.getClass().getResource(shot));
        setImage(ii.getImage());
        setX(x + H_SPACE);
        setY(y - V_SPACE);
        
    }

to kod odpowiedzialny za strzał. Jakies podpowiedzi>

dodanie znaczników <code class="java"> - fp

0

"Więc musisz mieć kilka obiektów pocisk." - pisz wprost którego słowa nie rozumiesz.

0

Nie wiem jak zrobić kilka obiektów z tego co mam

0

Kodu zamieściłeś trochę za mało.

  • dlaczego taka kolejność instrukcji
shot.isVisible();
shot = new Shot(x, y);

powinno być odwrotnie.

  • rysowanie powinno się odbywać całkowicie w metodzie paint lub paintComponent odpowiedniej sceny (Panel, JPanel, Canvas). W Twoim kodzie drawImage jest wewnątrz metody drawShot.
0
public void paint(Graphics g)
    {
      super.paint(g);

      g.setColor(Color.black);
      g.fillRect(0, 0, d.width, d.height);
      g.setColor(Color.green);   

      if (ingame) {

        g.drawLine(0, GROUND, BOARD_WIDTH, GROUND);
        drawAliens(g);
        drawPlayer(g);
        drawShot(g);
        drawBombing(g);
        Graphics2D g2d = (Graphics2D) g;
        DrawScore(g2d);
        DrawLevel(g2d);
        DrawLife(g2d);
      }

      Toolkit.getDefaultToolkit().sync();
      g.dispose();
    }

To moja metoda paint

1

Metoda drawShot wywołana jest tylko jeden raz, zatem rysowany jest tylko jeden obiekt typu Shot. Stwórz w programie kolekcję "strzałów"

ArrayList<Shot> shots = new ArrayList<Shot>();

W keyPressed dodawaj "strzał" do kolekcji

Shot shot = new Shot(...);
shots.add(shot);

a w metodzie paint rysuj w petli

for(Shot s:shots)
{
     s.drawShot(g);
}

Metoda drawShot powinna wyglądać nieco inaczej.

public void drawShot(Graphics g) {
    g.drawImage(getImage(), getX(), getY(), this);
}
0

Hmmm, problem w tym że po naciśnięciu spacji gra się sypie.
Debugger wyrzuca:

<terminated>spaceinvaders.SpaceInvaders at localhost:51506
<terminated, exit value: 0>C:\Program Files\Java\jre6\bin\javaw.exe (9 sty 2014, 09:04:52)

dodanie znacznika <code> - fp

0

To nie są komunikaty debuggera. Jak uruchamiasz grę?

0

Nie rozumiem pytania "Jak uruchamiasz gre?"

0

Nie rozumiem pytania

Nie rozumiem pytania "Jak uruchamiasz gre?"

0

no gre uruchamiam bezpośrednio z środowiska eclipse
a jesli chodzi o kod

public Board() 
    {

        addKeyListener(new TAdapter());
        setFocusable(true);
        d = new Dimension(BOARD_WIDTH, BOARD_HEIGTH);
        setBackground(Color.black);

        gameInit();
        setDoubleBuffered(true);
    }
   public void gameInit() {

        aliens = new ArrayList();

        ImageIcon ii = new ImageIcon(this.getClass().getResource(alienpix));

        for (int i=0; i < poziom; i++) {
            for (int j=0; j < 6; j++) {
            	ilosc_alien = poziom * 6;
                Alien alien = new Alien(alienX + 18*j, alienY + 18*i);
                alien.setImage(ii.getImage());
                aliens.add(alien);
            }
        }

        player = new Player();
        shot = new Shot();

        if (animator == null || !ingame) {
            animator = new Thread(this);
            animator.start();
        }
    }
0

Niczego nie zrozumiałeś z mojego kodu, usuń pole shot typu Shot, zamień je polem <ArrayList<Shot> shots. Uruchamiasz w Eclipse i na na konsoli nie ma dokładnej informacji o błędzie?

0

Może ja czegos nie rozumiem ale moje pole shot typu Shot wywołuje metody klasy Sprite. Klasa Shot dziedziczy po klasie Sprite, lecz po stworzenieu ArrayList<Shot> shots = new ArrayList<Shot>(); ten shots nie widzi metod z klasy Sprite.

2

Przestaję zgadywać jak naprawić Twój kod (którego to kodu nie znam). Jeśli nie chcesz by stary obiekt ginął po naciśnięciu klawisza, to musisz zastąpić pojedynczy obiekt kolekcją obiektów, a po naciśnięciu klawisza musisz tworzy nowy obiekt i go dodawać do kolekcji. Reszta w Twoich rękach.

1 użytkowników online, w tym zalogowanych: 0, gości: 1