Problem med component till JPanel

Permalänk
Medlem

Problem med component till JPanel

Så jag har ett litet problem med en lite grej jag håller på med i Java. Det är så att jag försöker att "adda" en component till en JPanel varje gång man trycker på SPACE och sedan animera innehållet i den till. Jag är ganska "noob" med java så det jag gör kan vara helt fel vilket jag tror det är. Men som sagt fungerar den inte. Hjälp skulle uppskattas. Här är koden när man trycker på SPACE:

if(e.getKeyCode() == KeyEvent.VK_SPACE) { gameStuff gs = new gameStuff(pos); this.add(gs); }

ooooch har är classen

public class gameStuff extends JComponent implements ActionListener { private Timer t = new Timer(1, this); private int[] craftPos = new int[2]; private int shotLength = 20, craftWid = 30; private int[] shotPos = { -10, -10 }; public gameStuff(int[] craftPos) { shotPos[0] = craftPos[0]+(craftWid/2); shotPos[1] = craftPos[1]-shotLength; t.start(); } public void paintComponent(Graphics g) { super.paintComponent(g); g.setColor(Color.RED); g.drawLine(shotPos[0], shotPos[1], shotPos[0], shotPos[1]+shotLength); } public void actionPerformed(ActionEvent e) { if(e.getSource() == t) { /DERP!!! if(shotPos[1] <= 0-shotLength) { t.stop(); } else { shotPos[1] -= 2; repaint(); } //System.out.println(shotPos[1]); } } }

Permalänk
Medlem

Swing är inte tänkt att fungera riktigt på det viset. En JComponent är ett Swing-objekt, exempelvis en knapp eller textruta som utgör en del av ett gränssnitt. Att skapa en ruta för ditt spel med en JComponent är en bra idé men att skapa en ny JComponent för varje enskilt skott är lite fel.

Istället kan du testa något sånt här:

public class Bullet { public static final int BULLET_TRAIL = 3; public static final Color BULLET_COLOR = Color.RED; private final Point position; public Bullet(int startX, int startY) { position = new Point(startX, startY) } public void move() { position.y -= BULLET_TRAIL; } public Point getPosition() { return position; } } public class GameArea extends JComponent { public static final int MAX_BULLETS = 5; private final Bullet[] bullets; private int activeBullets; public GameArea() { bullets = new Bullet[Bullet.MAX_BULLETS]; activeBullets = 0; } public void moveBullets() { for (int i=0; i<activeBullets; i++) { bullets[i].move(); } } public boolean tryAddBullet(Bullet bullet) { if (activeBullets < MAX_BULLETS) { bullets[activeBullets] = bullet; activeBullets += 1; return true; } else { return false; } } public void paintComponent(Graphics g) { super.paintComponent(g); g.setColor(Bullet.BULLET_COLOR); for (int i=0; i<activeBullets; i++) { Point position = bullets[i].getPosition(); g.drawLine(position.x, position.y, position.x, position.y + Bullet.BULLET_TRAIL); } } }

Du lägger till GameArea som en vanlig komponent och anropar den utifrån med .moveBullets() och .tryAddBullet(...)
Det fattas logik för att plocka bort skott (kan bli rörigt med en array där)

Visa signatur

Kom-pa-TI-bilitet