Hej! Längesen jag använde Java, men om du bara slänger ut de deklarationerna (nyttSpel, etc.) i själva klassen, så ska det nog gå bra. Några råd på vägen: Ett annat sätt att fördröja uppdateringen är att använda en Timer. Det är en komponent upprepar en procedur efter en angiven tidsperiod. Läs mer på http://java.sun.com/docs/books/tutorial/uiswing/misc/timer.html!nybörjare på java - nytt spel
Jag håller på att försöka göra ett spel i Java vad det går ut på spelar ingen större roll, problemet är att min ActionListener inte
fungerar, jag får fel när jag försöker kompilera:
airRifle2.java:106: cannot resolve symbol
symbol : variable stoppaRull
location: class airRifle2
if(e.getSource() == stoppaRull){
^
airRifle2.java:109: cannot resolve symbol
symbol : variable nyttSpel
location: class airRifle2
else if(e.getSource() == nyttSpel){
^
så här ser koden ut:
import java.awt.*;
import javax.swing.*;
import javax.swing.event.*;
import java.awt.event.*;
import java.applet.Applet;
public class airRifle2 extends JFrame implements ActionListener {
boolean startaVert = false;
boolean startaHori = false;
public static void main(String[] args)
{
airRifle2 blaff = new airRifle2();
blaff.setVisible(true);
}
public airRifle2(){
JButton nyttSpel, stoppaSpel, stoppaRull, stoppaRull2;
nyttSpel = new JButton("Nytt Spel");
stoppaSpel = new JButton("Stoppa spel");
stoppaRull = new JButton("Stoppa H-pilen");
stoppaRull2 = new JButton("Stoppa V-Pilen");
stoppaRull.addActionListener(this);
nyttSpel.addActionListener(this);
JPanel panel1 = new JPanel();
panel1.add(nyttSpel);
panel1.add(stoppaSpel);
panel1.add(stoppaRull);
panel1.add(stoppaRull2);
getContentPane().add(panel1, "North");
JPanel panel2 = new JPanel();
panel2.setBackground(Color.gray);
panel2.setPreferredSize(new Dimension(0,200));
getContentPane().add(panel2, "Center");
pack();
addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent ae){
System.exit(0);
}
});
}
public void paint(Graphics g){
//Deklarera alla variablar som behövs
int[] koordinater = new int[2];
super.paint(g);
//Rita ut måltavlan
g.setColor(Color.red);
g.fillOval(175,100,100,100);
//Rita ut vertikala cirkeln, få den att röra sig
if(startaVert == true){
//Fördröjningsmekanism
for(int a = 0; a < 1000000; a++){
}
int y = 0;
for(int x = 0 ; y < 5 ; x++){
for(int b = 0; b < 100 ; b++){
}
//for(int c = 0; c < 100 ; c++){
//}
g.setColor(getBackground());
g.fillOval(150+x, 210, 10, 10);
g.setColor(Color.black);
g.fillOval(151+x, 210, 10, 10);
if(startaVert == false){
koordinater[0] = 150+x;
break;
}
if(150+x >= 300){
x = 0;
y = y + 1;
}
}
}
}
public void actionPerformed(ActionEvent e){
if(e.getSource() == stoppaRull){
startaVert = false;
}
else if(e.getSource() == nyttSpel)
{
startaVert = true;
}
}
}Sv: nybörjare på java - nytt spel
Däremot så verkar det finnas en hel del att tänka på gällande namngivning osv... =)
Sen är din fördröjningsprocedur ganska dum, så försök använda någon slags sleepgrej istället (kommer absolut inte ihåg hur man gör det i Java).Sv: nybörjare på java - nytt spel
1. Din klass där main finns bör inte göra annat än att skaka igång applikationen. Java är ett objektorienterat språk men din design är det inte :) Försök att bryta dina klasser och metoder så blir det lättare att underhålla och jobba i projektet.
2. Om du planerar att arbeta med programmering så använd engelska variabelnamn. Det är inte ett tvång men koden blir svårläst när man måste växla mellan engelska (java-syntax) och dina variabelnamn.
3. Du får kompileringsfelet eftersom actionPerformed() inte kan se komponenterna du deklararerat inne i konstruktorn. Flytta ut dem och deklarera dem på samma sätt som du gjort med dina booleska värden startaVert och startaHori. Och se till att göra både dem och dina booleska värden private.
4. Som Niklas skrev så är din fördröjningsmekanism dum...använd java.lang.Thread.sleep(100) istället. Titta i javadocen (http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Thread.html) hur den används. Med det sätt du använder så vet du ju aldrig hur lång tid applikationen egentligen väntar.
5. Det är inte heller särskilt bra att bara ha en actionPerformed metod eftersom den ofta tenderar till att bli nerklottrad med if-satser. Bättre är det om du använder inre klasser för varje komponent så slipper du också låta hela din klass att implementera ActionListener.
Ett enkelt exempel:
JButton button = new JButton("myButton");
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
// do stuff here
}
});
Som sagt, bara några råd på vägen
/NilsSv: nybörjare på java - nytt spel
Det är ofta den bästa lösningen på såna här problem.
/Johannes