Permalänk

Hjälp med ett spel i Java

Hejsan SweC, tänkte börja med att säga att detta EJ är för en skoluppgift utan jag gör det för att jag tycker det är kul och vill lära mig

Problemet är att jag har en main klass

package tetris; import javax.swing.*; public class Tetris { public static void main(String[] args) { JFrame frame = new JFrame("Tetris"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.getContentPane().add(new TetrisPanel()); frame.pack(); frame.setVisible(true); } }

Som skapar en ny TetrisPanel

I TetrisPanel så målar en paintComponent(Graphics page) metod ut en massa GIF bilder

public void paintComponent(Graphics page) { super.paintComponent(page); currentRed.paintIcon(this, page, x, y); currentGreen.paintIcon(this, page, xx, yy); }

Om jag trycker på en specifik tangent så så händer det vissa saker. ex att en utav bildernas koordinater ändras och den rör sig i framen...

I min TetrisPanel klass så när jag trycker på E, så skapar den ett nytt objekt utav klassen Bullet, som tar x och y koordinater ifrån där i detta fall en stridsvagn var och åt vilket håll den är riktad och sedan uppdaterar Bullet klassen dessa x och y koordinater och använder repaint(); för att skriva ut kulan på de x och y koordinater som är just då. Bullet klassen har en egen paintComponent metod.

public void paintComponent(Graphics page) { super.paintComponent(page); System.out.print("Ok"); bullet.paintIcon(this, page, x, y); }

Och nu till problemet, när repaint(); i Bullet kallas så körs inte Bullet klassens paintComponent metod, vilket resulterar i att kulan inte renderas ut alls...

Så, till frågan: Hur fixar jag detta?

Några andra saker jag behöver hjälp med:

Ljud? kan ej få ljud att fungera

All källkod:

Klassen med mainmetoden

package tetris; import javax.swing.*; public class Tetris { public static void main(String[] args) { JFrame frame = new JFrame("Tetris"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.getContentPane().add(new TetrisPanel()); frame.pack(); frame.setVisible(true); } }

Huvudklassen TetrisPanel

package tetris; import java.awt.*; import java.awt.event.*; import javax.swing.*; public class TetrisPanel extends JPanel { private final int WIDTH = 1000, HEIGHT = 800, JUMP = 10; private ImageIcon red, green, winGreen, winRed, currentRed, currentGreen, tankUp, tankDown, tankLeft, tankRight, redUp, redDown, redLeft, redRight; private int x, y, xx, yy, xxx, yyy, redWin, greenWin, range, startingValuesRedXY, startingValuesGreenX, startingValuesGreenY; private String direction; public TetrisPanel() { addKeyListener(new DirectionListener()); startingValuesRedXY = 20; startingValuesGreenX = 930; startingValuesGreenY = 730; x = startingValuesRedXY; y = startingValuesRedXY; xx = startingValuesGreenX; yy = startingValuesGreenY; redWin = 0; greenWin = 0; String winReds = Integer.toString(redWin); String winGreens = Integer.toString(greenWin); System.out.print(redWin + winReds); range = 60; red = new ImageIcon("square.gif"); green = new ImageIcon("green.gif"); winGreen = new ImageIcon("wingreen.gif"); winRed = new ImageIcon("winred.gif"); tankUp = new ImageIcon("tankUp.gif"); tankDown = new ImageIcon("tankDown.gif"); tankLeft = new ImageIcon("tankLeft.gif"); tankRight = new ImageIcon("tankRight.gif"); redUp = new ImageIcon("redUp.gif"); redDown = new ImageIcon("redDown.gif"); redLeft = new ImageIcon("redLeft.gif"); redRight = new ImageIcon("redRight.gif"); currentGreen = tankUp; currentRed = redDown; setBackground(Color.WHITE); setPreferredSize(new Dimension(WIDTH, HEIGHT)); setFocusable(true); Timer time = new Timer(7, taskPerformer); time.start(); } ActionListener taskPerformer = new ActionListener() { public void actionPerformed(ActionEvent evt) { if (currentRed != winRed) { if (xx > x) { x += 1; currentRed = redRight; } else { x -= 1; currentRed = redLeft; } if (yy > y) { y += 1; currentRed = redDown; } else { y -= 1; currentRed = redUp; } } repaint(); } }; public void paintComponent(Graphics page) { super.paintComponent(page); currentRed.paintIcon(this, page, x, y); currentGreen.paintIcon(this, page, xx, yy); } private class DirectionListener implements KeyListener { public void keyPressed(KeyEvent event) { switch (event.getKeyCode()) { case KeyEvent.VK_UP: if (y >= 10) y -= JUMP; if (currentRed != winRed) currentRed = redUp; if ((xx - range) < x && x < (xx + range) && (yy - range) < y && y < (yy + range)) { currentRed = winRed; redWin++; x = 300; y = 200; } break; case KeyEvent.VK_DOWN: if (y <= 740) y += JUMP; if (currentRed != winRed) currentRed = redDown; if ((xx - range) < x && x < (xx + range) && (yy - range) < y && y < (yy + range)) { currentRed = winRed; redWin++; x = 300; y = 200; } break; case KeyEvent.VK_LEFT: if (x >= 10) x -= JUMP; if (currentRed != winRed) currentRed = redLeft; if ((xx - range) < x && x < (xx + range) && (yy - range) < y && y < (yy + range)) { currentRed = winRed; redWin++; x = 300; y = 200; } break; case KeyEvent.VK_RIGHT: if (x <= 940) x += JUMP; if (currentRed != winRed) currentRed = redRight; if ((xx - range) < x && x < (xx + range) && (yy - range) < y && y < (yy + range)) { currentRed = winRed; redWin++; x = 300; y = 200; } break; case KeyEvent.VK_W: if (yy >= 10) yy -= JUMP; currentGreen = tankUp; if ((xx - 65) < x && x < (xx + 65) && (yy - 65) < y && y < (yy + 65)) { currentRed = winRed; redWin++; x = 300; y = 200; } break; case KeyEvent.VK_S: if (yy <= 740) yy += JUMP; currentGreen = tankDown; if ((xx - 65) < x && x < (xx + 65) && (yy - 65) < y && y < (yy + 65)) { currentRed = winRed; redWin++; x = 300; y = 200; } break; case KeyEvent.VK_A: if (xx >= 10) xx -= JUMP; currentGreen = tankLeft; if ((xx - 65) < x && x < (xx + 65) && (yy - 65) < y && y < (yy + 65)) { currentRed = winRed; redWin++; x = 300; y = 200; } break; case KeyEvent.VK_D: if (xx <= 940) xx += JUMP; currentGreen = tankRight; if ((xx - range) < x && x < (xx + range) && (yy - range) < y && y < (yy + range)) { currentRed = winRed; redWin++; x = 300; y = 200; } break; case KeyEvent.VK_SPACE: currentGreen = tankUp; currentRed = redDown; x = startingValuesRedXY; y = startingValuesRedXY; xx = startingValuesGreenX; yy = startingValuesGreenY; break; case KeyEvent.VK_E: if (currentGreen == tankUp) direction = "up"; else if (currentGreen == tankDown) direction = "down"; else if (currentGreen == tankRight) direction = "right"; else if (currentGreen == tankLeft) direction = "left"; new Bullet(direction, xx, yy); break; } repaint(); } public void keyReleased(KeyEvent event) { } public void keyTyped(KeyEvent event) { } } }

Och sist men inte minst, Bullet klassen

package tetris; import java.awt.Graphics; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.ImageIcon; import javax.swing.JPanel; import javax.swing.Timer; public class Bullet extends JPanel { private int x, y; private String direction; private ImageIcon bullet; public Bullet(String s, int xCoord, int yCoord) { bullet = new ImageIcon("bullet.gif"); x = xCoord; y = yCoord; direction = s; new Timer(100, taskPerformer).start(); } public void paintComponent(Graphics page) { super.paintComponent(page); System.out.print("Ok"); bullet.paintIcon(this, page, x, y); } ActionListener taskPerformer = new ActionListener() { public void actionPerformed(ActionEvent evt) { if (direction == "right" ) x++; else if (direction == "left" ) x--; else if (direction == "up" ) y--; else if (direction == "down" ) y++; System.out.print(x + " " + y + " "); repaint(); } }; }

Tack på förhand, säg till ifall ni behöver mer info osv.

Permalänk
Medlem

Hej grontoankan!
Posta gärna kod innanför code-taggarna. Blir väldigt jobbigt att läsa annars :/
Men för att svara på din första fråga:
Du kan inte köra en System.out.print("Ok"); för att se att den körs, därför att den körs i en annan tråd och skriver ut till fel... sak (eller något åt det hållet).

När du postar i code-taggar får du ett bättre svar

Visa signatur

citera!

Permalänk
Citat:

Ursprungligen inskrivet av Dosshell
Hej grontoankan!
Posta gärna kod innanför code-taggarna. Blir väldigt jobbigt att läsa annars :/
Men för att svara på din första fråga:
Du kan inte köra en System.out.print("Ok"); för att se att den körs, därför att den körs i en annan tråd och skriver ut till fel... sak (eller något åt det hållet).

När du postar i code-taggar får du ett bättre svar

Uppdaterade texten så den har code-taggar

Permalänk
Medlem

Haha, glöm det jag sa.. tänkte eeh fel där
Problemet är att du aldrig lägger till bullet till någon panel/frame och därför inte ritas ut:

case KeyEvent.VK_E: if (currentGreen == tankUp) direction = "up"; else if (currentGreen == tankDown) direction = "down"; else if (currentGreen == tankRight) direction = "right"; else if (currentGreen == tankLeft) direction = "left"; new Bullet(direction, xx, yy); break;

Visa signatur

citera!

Permalänk
Citat:

Ursprungligen inskrivet av Dosshell
Haha, glöm det jag sa.. tänkte eeh fel där
Problemet är att du aldrig lägger till bullet till någon panel/frame och därför inte ritas ut:

case KeyEvent.VK_E: if (currentGreen == tankUp) direction = "up"; else if (currentGreen == tankDown) direction = "down"; else if (currentGreen == tankRight) direction = "right"; else if (currentGreen == tankLeft) direction = "left"; new Bullet(direction, xx, yy); break;

Nej jag vet, hur gör jag det? :S

Permalänk
Medlem

Du skulle kunna skicka panelen som argument till konstruktorn för DirectionListener i Tetris panel och lagra denna i DirectionListener och sedan adda på bulleten i till denna.
i DirectionListener:

private JPanel m_panel; public DirectionListener(JPanel panel) { m_panel = panel; }

sedan när du skapar en instans i TetrisPanel:

addKeyListener(new DirectionListener(this));

och för att skapa en bullet:

m_panel.add(new Bullet(direction, xx, yy));

Men vi ser att timern i Bullet fungerar uselt.
Jag skulle göra en ritar tråd och en logisk tråd och sedan köra med locks. Dock känner jag på mig att det finns många bättre lösningar. Fast detta är utanför min java erfarenhet.

Visa signatur

citera!