Hejsan UM 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... Detta är även mitt första försök till spel, innan har det bara varit skolarbete.
I min 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.
Jag orkar inte läsa igenom allt detta.
Amsle:
Jag orkar inte läsa igenom allt detta.
tror ej du kan Java heller :c
ankzor:
tror ej du kan Java heller :c
Du känner inte mig.
Amsle:
Du känner inte mig.
Var ett antagande bara
ankzor:
Var ett antagande bara
"Okej"
Använd [ pre ] [/ pre ] runt koden så blir det enklare att läsa. Oindenterad kod är inte rolig.
F.ö. Usch så illamående jag blir av att se Java igen.
Åtta:
Använd [ pre ] [/ pre ]
går ej att editera längre, tyvär. sen undrar jag hur man skulle veta att det fanns pre-taggar? D:
Åtta:
Usch så illamående jag blir av att se Java igen.
haha, kanske borde byta språk eller någe
ankzor:
går ej att editera längre, tyvär.
Släng upp din kod på pastebin eller nåt och skicka den via PM till mig så kan jag lägga in den med [ pre ]-taggar i första inlägget.
ankzor:
sen undrar jag hur man skulle veta att det fanns pre-taggar? D:
Det undrar jag med. Undrar varför vi inte lagt in det i UM++?
ankzor:
haha, kanske borde byta språk eller någe
Jag sitter och skriver Lua med Löve för att hantera grafik, ljud, input o.s.v. Annars är ju Python + Pygame en vanlig kombination för 2d-spel. Båda vore att föredra framför Java.
Men vem vet, kanske någon Java-kunnig dyker upp och kan hjälpa dig med ditt problem.
Testa att skriva @Override framför paintComponent, och ta bort super.paintComponent.. vet inte om det hjälper, kollade bara igenom snabbt. Men det är vad jag vet standardsättet att skriva det på; alltså:
@Override public void paintComponent(Graphics page)
Annars; är du säker på att där felet sitter? Knappt använt swing själv, men ska testa ladda in koden i eclipse o se om problemet kan lösas (om inte @Override löser det)
Åtta:
Annars är ju Python + Pygame en vanlig kombination för 2d-spel. Båda vore att föredra framför Java.
Varför så? Själv tycker jag Java är ett ypperligt val för just 2d spel! Tycker också TS borde testa Slick 2d biblioteket till java, väldigt bra för just 2d spelprogrammering!
Förlåt för att jag skrev så
shazbot:
@Override public void paintComponent(Graphics page)
det fungerade ej :c
vad gör "@Override"
Klistra in det hela i en pastebin med lämplig syntax highlighting så kan jag ta en titt. Inte en chans att jag läser det som det är nu.
Åtta:
PM
main metoden
TetrisPanel klassen
och bulletklassen
Gentlernen:
Klistra in det hela i en pastebin
tack ^^