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.
masz błąd w linii 234 oraz 356.
Więc musisz mieć kilka obiektów pocisk.
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
"Więc musisz mieć kilka obiektów pocisk." - pisz wprost którego słowa nie rozumiesz.
Nie wiem jak zrobić kilka obiektów z tego co mam
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.
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
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);
}
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
To nie są komunikaty debuggera. Jak uruchamiasz grę?
Nie rozumiem pytania "Jak uruchamiasz gre?"
Nie rozumiem pytania
Nie rozumiem pytania "Jak uruchamiasz gre?"
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();
}
}
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?
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.
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.