Problem bei Java-Projekt

Alles Wissenswerte über Skripte, Browser, Makros, PhP, HTML...

Moderatoren: Moderatoren, Redakteure

Antworten
Benutzeravatar
niq333
Beiträge: 1443
Registriert: 15.01.2007 14:14
Persönliche Nachricht:

Problem bei Java-Projekt

Beitrag von niq333 » 19.09.2015 14:49

Hallo ihr Programmierer da draußen :wink:

Ich habe für die Universität ein Java-Seminar für Anfänger gemacht und soll dafür in einer Kleingruppe ein lauffähiges Programm prgrammieren. Das heißt,alle aus meiner Gruppe haben ihr "Wissen" nur aus dem Seminar und durch Online-Tutorials. Dabei haben wir folgendes Problem und wir verwenden dafür im übrigen eclipse, falls die Info notwendig ist:

Wir haben also ein Paket mit diversen Klassen für unser 2D-Rennspiel angelegt. Die Klasse "Game" dient dazu, das Spielfenster zu öffnen und mit den anderen Spielbezogen Klassen zu kommunizieren. Als nächstes haben wir ein "Menue" angelegt, das einen Start-Button hat, von dem aus die Klasse Game und somit das Spiel gestartet werden soll.

In der Klasse "Menue" haben wir danach den Befehl eingefügt:
SpoilerShow
if (e.getSource()== starten) {
this.setVisible(false); // Fenster "schliessen"
Game Game = new Game(); // Spiel starten
Game.run();
}
Jetzt brauchen wir noch eine Methode "run()" in der Klasse "Game", damit die Fehlermeldungen weggehen:
SpoilerShow
public class Game {

static int width=800;
static int hight=600;

public static void main(String[] args) {

Frame frame= new Frame(); // Fenster wird erzeugt

frame.setSize(width, hight); // Größe wird festgelegt
frame.setDefaultCloseOperation(Frame.EXIT_ON_CLOSE); // Prozess wird bei x beendet 3 = EXIT_ON_CLOSE
System.out.println();
frame.setLocationRelativeTo(null); // in die Mitte
frame.setResizable(false); // nicht veränderbar
//frame.setUndecorated(true); // Rand wird entfernt
frame.setVisible(true); // wird sichtbar gemacht
frame.setTitle("Race"); // Titel meines Fensters

frame.makestrat(); // buffer strategy
// in while schleife läuft das spiel immer erst aktualisieren, dann zeichnen


//long lastFrame = System.currentTimeMillis(); // misst Zeit, damit sich spieler immer gleich schnell bewegt

while (true){

//benutzereingabe

frame.update();

//zeichnen
frame.repaint();

//warten Epsiode 3 // gibt an, wie oft geupdated wird
try{

Thread.sleep(4); //hier ändern, wenn das spiel schneller sein soll
} catch (InterruptedException e){
e.printStackTrace();


}



}

}
}
eclipse schlägt vor, das auf der Höhe von "public static void main(String[] args) {" zu machen, aber austauschen kann man das ja nicht und als Ergänzung irgendwo "public void run() {" einzufügen klappt bisher nicht. Hat das jemand von euch auf die schnelle eine Idee? :mrgreen:
"Das Internet wird die Welt verändern" - Leonardo da Vinci

Benutzeravatar
Batistuta
Beiträge: 1410
Registriert: 25.03.2011 21:00
Persönliche Nachricht:

Re: Problem bei Java-Projekt

Beitrag von Batistuta » 19.09.2015 17:42

"public static void main(String[] args)" ist selber eine Methode , also kann man da drin nicht eine neue Methode wie run() erstellen. Aber außerhalb davon sollte sowas wie public void run(){ } eigentlich klappen. Was gibt er denn bei dir für eine Fehlermeldung raus?

Benutzeravatar
niq333
Beiträge: 1443
Registriert: 15.01.2007 14:14
Persönliche Nachricht:

Re: Problem bei Java-Projekt

Beitrag von niq333 » 19.09.2015 20:43

Batistuta hat geschrieben:"public static void main(String[] args)" ist selber eine Methode , also kann man da drin nicht eine neue Methode wie run() erstellen. Aber außerhalb davon sollte sowas wie public void run(){ } eigentlich klappen. Was gibt er denn bei dir für eine Fehlermeldung raus?
Also wenn ich "public static void main(String[] args) {" durch "public void run() {" ersetze, dann öfnet sich beim start-button im menü ein fenster mit dem rennspiel, aber ich kann dann mit keiner taste mehr beschleunigen etc.
Meine Frage ist jetzt, ob ich das "public void run() {" jetzt für etwas anderes setzen muss, weil ich ja irgendeinen code damit ausführen muss. Und mein Prof meinte auf Nachfrage auch nur, dass ich in der bereits geposteten Klasse nur noch eine Methode "run" mit dem Code brauche, der das Spiel "laufen" lässt.

Wenn ich von der geposteten Klasse aus starte, funktioniert übrigens alles. Nur dann ist kein Spielmenü involviert^^
"Das Internet wird die Welt verändern" - Leonardo da Vinci

Benutzeravatar
-Blight-
Beiträge: 796
Registriert: 06.12.2008 16:13
Persönliche Nachricht:

Re: Problem bei Java-Projekt

Beitrag von -Blight- » 20.09.2015 11:20

niq333 hat geschrieben: Also wenn ich "public static void main(String[] args) {" durch "public void run() {" ersetze, dann öfnet sich beim start-button im menü ein fenster mit dem rennspiel, aber ich kann dann mit keiner taste mehr beschleunigen etc.
Komisch, dass es so klappt. Hast du noch irgendwo eine Main-Methode definiert? Ich bin kein Java-Experte aber versuche dann doch einfach mal public static void run(String[] args){...} anstelle von public static void main(String[] args){...} in deiner Game-Klasse. In Menue müsste der Methodenaufruf dann Game.run(args); lauten.
Bild


Benutzeravatar
niq333
Beiträge: 1443
Registriert: 15.01.2007 14:14
Persönliche Nachricht:

Re: Problem bei Java-Projekt

Beitrag von niq333 » 20.09.2015 12:36

-Blight- hat geschrieben:
niq333 hat geschrieben:...
Komisch, dass es so klappt. Hast du noch irgendwo eine Main-Methode definiert? Ich bin kein Java-Experte aber versuche dann doch einfach mal public static void run(String[] args){...} anstelle von public static void main(String[] args){...} in deiner Game-Klasse. In Menue müsste der Methodenaufruf dann Game.run(args); lauten.
Soweit war ich schon, aber "String[] args" geht in dem Kontext nicht. Da kommt als Fehlermeldung, dass das so nicht geht und als weitere dann "Unknown sources". Danke aber für die Antwort^^
"Das Internet wird die Welt verändern" - Leonardo da Vinci

Benutzeravatar
niq333
Beiträge: 1443
Registriert: 15.01.2007 14:14
Persönliche Nachricht:

Re: Problem bei Java-Projekt

Beitrag von niq333 » 20.09.2015 15:20

Auf PM an mir poste ich hier mal den kompletten code rein. Villeicht hilft es ja^^

Frame.Java
SpoilerShow

Code: Alles auswählen

package game3;

import javax.swing.JFrame;
import java.awt.image.BufferStrategy;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;

public class Frame extends JFrame {  			//Frame übernimmt alle Befehle von JFrame


	
	private BufferStrategy strat;					//einfügen der ??????????????
	private Player player;
	private Player2 player2;
	
	public Frame(){
		player= new Player (z_x, z_y+z_h/3-Player.hight/2);  //Startposition des Spielers in der Mitte der Startlinie
		player2= new Player2 (z_x, z_y+2*z_h/3-Player.hight/2);
		addKeyListener(new Keyboard()); // Keyboard wird übergeben
	}
	
	public void makestrat ()						// Buffer Strategie mit 2 Bildschirmen 
	
	{
		createBufferStrategy (2);
		strat = getBufferStrategy();
	}
	
	
	public void repaint(){							//wird auf bildschirm angezeigt und erzeigt neues bild
		
		Graphics g = strat.getDrawGraphics();
		draw(g);
		strat.show();
		
				
	}
	// Variablen für Streckenelemente
	
	
	//Streckenelement 1
	public static int s1_x=600;							//Position des Streckenelementes auf x-Achse
	public static int s1_y=150;							//Position des Streckenelementes auf y-Achse
	public static int s1_w=50;							//Breite des Streckenelementes
	public static int s1_h=300;							//Höhe des Streckenelementes
	
	
	//Streckenelement 2
	public static int s2_x=100;							//Position des Streckenelementes auf x-Achse
	public static int s2_y=150;							//Position des Streckenelementes auf y-Achse
	public static int s2_w=500;							//Breite des Streckenelementes
	public static int s2_h=50;							//Höhe des Streckenelementes
	
	//Streckenelement 3
	public static int s3_x=4;							//Position des Streckenelementes auf x-Achse
	public static int s3_y=300;							//Position des Streckenelementes auf y-Achse
	public static int s3_w=450;							//Breite des Streckenelementes
	public static int s3_h=396;							//Höhe des Streckenelementes
	
	//Ziellinie
	public static int z_x=395;							//Position des Streckenelementes auf x-Achse
	public static int z_y=24;							//Position des Streckenelementes auf y-Achse
	public static int z_w=5;							//Breite des Streckenelementes
	public static int z_h=126;							//Höhe des Streckenelementes
	
	//Zeichnen der Oberfläche
	public void draw(Graphics g){      // neue Objekte hier einfügen
		g.setColor(Color.BLACK);
		g.fillRect(0,0,Game.width,Game.hight);
		
		//Streckenelement 1
		g.setColor(Color.YELLOW);
		g.fillRect(s1_x,s1_y,s1_w,s1_h);   		// neues Objekt : abstoßen??
		//Streckenelement 2
		g.setColor(Color.YELLOW);
		g.fillRect(s2_x,s2_y,s2_w,s2_h);
		//Streckenelement 2
		g.setColor(Color.YELLOW);
		g.fillRect(s3_x,s3_y,s3_w,s3_h);
		//Ziellinie
		g.setColor(Color.WHITE);
		g.fillRect(z_x,z_y,z_w,z_h);
		
		g.setFont(new Font("Arial", Font.PLAIN, 30));   
		g.setColor(Color.black);
		 
		g.drawString("Spieler 1:       Runde", 50, 370);
		g.drawString("Spieler 2:       Runde", 50, 420);
		
		g.setFont(new Font("Arial", Font.BOLD, 30)); 
		
		g.drawString(Integer.toString(Player.round), 350, 370);
		g.drawString(Integer.toString(Player2.round), 350, 420);
		
		if(Math.max(Player.round,Player2.round)==Player.max_round-1){
		g.setFont(new Font("Arial", Font.BOLD, 50)); 
		g.drawString("Letzte Runde", 50, 520);}
		
		if(Player.round==Player.max_round && Player.round==Player.max_round){
			g.setFont(new Font("Arial", Font.BOLD, 50)); 
			g.drawString("Spieler 1 gewinnt", 20, 520);}
		
		if(Math.max(Player.round,Player2.round)==Player2.round && Player2.round==Player.max_round){
			g.setFont(new Font("Arial", Font.BOLD, 50)); 
			g.drawString("Spieler 2 gewinnt", 20, 520);}
		
		//spieler in eigener Klasse
		player.draw(g);
		player2.draw(g);
	
		
	}
	
	public void update ()
	{
		player.update();
		player2.update();
		
	}
	
	
}
Game.Java
SpoilerShow

Code: Alles auswählen

package game3;

import javax.swing.JLabel;


public class Game {
	
	static int width=800;
	static int hight=600;
	
	public static void main(String[] args) {
	
		Frame frame= new Frame();   						// Fenster wird erzeugt
		
		frame.setSize(width, hight);     						// Größe wird festgelegt	
		frame.setDefaultCloseOperation(Frame.EXIT_ON_CLOSE);  				// Prozess wird bei x beendet  3 = EXIT_ON_CLOSE
		System.out.println();
		frame.setLocationRelativeTo(null);   				// in die Mitte
		frame.setResizable(false);   						// nicht veränderbar
		//frame.setUndecorated(true);							// Rand wird entfernt
		frame.setVisible(true);								// wird sichtbar gemacht
		frame.setTitle("Race");			 // Titel meines Fensters
		
		frame.makestrat();									// buffer strategy
		// in while schleife läuft das spiel  immer erst aktualisieren, dann zeichnen
	
		
		//long lastFrame  = System.currentTimeMillis();  // misst Zeit, damit sich spieler immer gleich schnell bewegt
		
		while (true){
			
			//benutzereingabe
					
			frame.update();
			
			//zeichnen
			frame.repaint();
			
			//warten Epsiode 3 // gibt an, wie oft geupdated wird
			try{
	
				Thread.sleep(4);						//hier ändern, wenn das spiel schneller sein soll
			} catch (InterruptedException e){
				e.printStackTrace();
				
				
			}
			
			
			
		}
		
	}
}
Keyboard.Java
SpoilerShow

Code: Alles auswählen

package game3;

import java.awt.event.KeyListener;
import java.awt.event.KeyEvent;

public class Keyboard implements KeyListener {

	private static boolean [] keys = new boolean [1024];    //durch static kann man aus anderen klassen draufzugreifen; true bei tastendruck(boolean)
	public static boolean isKeyPressed(int keycode){       //
		return keys [keycode];
	}
	
	
	@Override
	public void keyPressed(KeyEvent e) {                   // beim pressen der taste
		
		keys[e.getKeyCode()] = true;
		
	}

	@Override
	public void keyReleased(KeyEvent e) {
		keys[e.getKeyCode()] = false;
		
	}

	@Override
	public void keyTyped(KeyEvent arg0) {
		// TODO Auto-generated method stub
		
	}

	
	
}[/spoiler]
Menue.Java[spoiler][code]package game3;




	import java.awt.Color;
	import java.awt.Font;
	import java.awt.event.ActionEvent;
	import java.awt.event.ActionListener;

	import javax.swing.JButton;
	import javax.swing.JFrame;
	import javax.swing.JOptionPane;


	public class Menue extends JFrame implements ActionListener {

		private JButton starten;
		private JButton info;
		private JButton ende;
		
		public static void main(String[] args) {
			
			
			Menue menu = new Menue("Menü");
			menu.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
			//Fenster schliessen, wenn man x drueckt
			menu.setBounds(550, 200, 290, 350);
			//Ort und Stelle des Fensters
			menu.getContentPane().setBackground(Color.BLACK);
			//Hintergrundfarbe = schwarz
			menu.setUndecorated(true);
			//Seitenrand wegmachen		
			
			menu.setLayout(null);
			//null = eigenes Layout erstellen
			menu.setVisible(true);
			// Fenster sichtbar machen
		

		}
		
		public Menue(String title) {
			super(title);
			
			final int breite = 160; // Setze Breite fest, die als Variable fuer alle benutzt werden kann
			final int hoehe = 40; //Setze Hoehe fest, die als Variable fuer alle benutzt werden kann
			final int xposition = 65; //Setze die Position von x auf eine bestimmte Groesse fest
			
			Font Schrift = new Font ("Calibri", Font.BOLD+Font.ITALIC, 20);
			
			
			
			starten = new JButton("Spiel starten"); //neuer Button: schliessen
			starten.setBounds(xposition,50,breite, hoehe); //Ort und Stelle des Button
			getRootPane().setDefaultButton(starten); //setze als Standardbutton: Enter fuehrt zu Spielstart
			starten.addActionListener(this); //ActionListener einbinden (damit auf Klick reagiert)
			starten.setFont (Schrift); //definierte Schrift "Schrift" (Zeile 47) verwenden
			starten.setBackground(Color.YELLOW); //Hintergrund des Buttons farbig machen
			starten.setForeground(Color.BLUE); //Schrift farbig machen, in dem man den "Vordergrund" farbig macht
			add(starten); //hinzufuegen
			
			
			info = new JButton("Info");
			info.setBounds(xposition,150,breite, hoehe);
			
			info.addActionListener(this);
			info.setFont(Schrift);
			info.setBackground(Color.WHITE);
			info.setForeground(Color.BLUE);
			add(info);
			
			ende = new JButton("Ende");
			ende.setBounds(xposition,250,breite, hoehe);
			ende.addActionListener(this);
			ende.setFont(Schrift);
			ende.setBackground(Color.WHITE);
			ende.setForeground(Color.BLUE);
			add(ende);
			
			
			
		}
			
	  
		public void actionPerformed(ActionEvent e) {
			//welche Aktionen getan werden sollen, wenn Button XY gedrueckt wird
		
			
			if (e.getSource()== starten) {
				this.setVisible(false); // Fenster "schliessen"
				Game Game = new Game(); // Spiel starten
				Game.run();
			}
			
			if (e.getSource() == info ) {
				Object[] options = {"OK"};
				
				JOptionPane.showOptionDialog(null,"Programiert von ............","Information",JOptionPane.DEFAULT_OPTION,JOptionPane.PLAIN_MESSAGE,null,options,options[0]);
				//wenn Button info gedrueckt wird, dann Optionsfeld (von wem programmiert + OK Button = schliessen)
			}
			
			if(e.getSource() == ende) {
				System.exit(0);
				
				//wenn ende gerdueckt wird, dann Menue schliessen & Programm schliessen
			}
		
		}
	
			
	}
Player.Java+Player2.Java(fast gleich]
SpoilerShow

Code: Alles auswählen

package game3;

import game3.Game;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.KeyEvent;

public class Player {
	
	private float xpos;			//Position u.U. float episode 5   //float, da sonst nicht nach links und rechts gleiche geschwindigkeit
	private float ypos;
	private float xspeed;		//Geschwindigkeit
	private float yspeed;
	private boolean collision_x;     //True abfrage, ob eine collision statt gefunden hat. Bei einer Kollision mit gzwei Elementen Gleichzeitig wandelt sich sonst der negative Abprallefekt in einen positiven Wert um und Spieler geht in die Begrenzung
	private boolean collision_y;
	
	public static int width = 20;				//Größe des objektes wird festgelegt
	public static int hight = 20;
	
	public static int round_1 = 0;
	public static int round_2 = 0;
	public static int round = 0;
	
	public static int max_round = 2;
	
	
	public Player(int xpos, int ypos){
		this.xpos = xpos;				//Übergabe der Position
		this.ypos = ypos;
	}
	
	public void draw(Graphics g){				//Zeichnen des Players
		g.setColor(Color.BLUE);
		g.fillRect((int)xpos,(int)ypos,width,hight);
	}
	
	public void update(){
		
//		xspeed=0;     												// damit beim loslassen der taste element stehen bleibt
//		yspeed=0;

		if(Keyboard.isKeyPressed(KeyEvent.VK_UP)) {yspeed += -0.005f;}//{yspeed=yspeed*0.7f;}    // was passiert beim drücken von tasten
		if(Keyboard.isKeyPressed(KeyEvent.VK_DOWN)) {yspeed += 0.005f;}//{yspeed=yspeed*0.7f;}
		if(Keyboard.isKeyPressed(KeyEvent.VK_RIGHT)) {xspeed += 0.005f;} //{xspeed=xspeed*0.7f;}
		if(Keyboard.isKeyPressed(KeyEvent.VK_LEFT)) {xspeed += -0.005f;} //{xspeed=xspeed*0.7f;}
		

		
		//Reibung einfügen??
		
		
		
		//maximale Geschwindigkeit
		if(xspeed>1) xspeed=1;
		if(xspeed<-1) xspeed=-1;
		if(yspeed>1) yspeed=1;
		if(yspeed<-1) yspeed=-1;
	
		
		
		
		// Kollision mit Rahmen
		
		//links
		if (xpos<4) {
			xpos=4;										// Begrenzung des Rahmens 
			xspeed=-xspeed;								// Abprallen
		}
		
		//rechts
		if (xpos+width>Game.width-4) {
			xpos=Game.width-width-4;						// -width, da die position der linken oberen ecke genutzt wird
															// Geschwindigkeit wird 0 gesetzt
			xspeed=-xspeed;
		}
		
		//oben
		if (ypos<24){
			ypos=24;
			yspeed=-yspeed;			
		}
		
		
		//unten
		if (ypos+hight>Game.hight-4) {
			ypos=Game.hight-hight-4;
			yspeed=-yspeed;

		}
		
		//Kollisionsabfragen. Zunächst wird überprüft, ob eine Kollision in x oder y Richtung stattfand. 
		
		//Kollisionsabfragen müssen wieder false gesetzt werden, da sonst die Kollision des letzten updates bestehen bleiben würde.
		collision_x=false;
		collision_y=false;

		//Kollision mit Streckenelement 1
		//links
		if ((int)xpos + width== Frame.s1_x && (int)ypos+hight>=Frame.s1_y && (int)ypos<=Frame.s1_y+Frame.s1_h) {
			collision_x=true;
			}
		//rechts
		if ((int)xpos == Frame.s1_x + Frame.s1_w && (int)ypos+hight>=Frame.s1_y && (int)ypos<=Frame.s1_y+Frame.s1_h) {
			collision_x=true;
			}
		//oben
		if ((int)ypos + hight == Frame.s1_y && (int)xpos+width>=Frame.s1_x && (int)xpos<=Frame.s1_x+Frame.s1_w) {
			collision_y=true;
			}
		//unten
			if ((int)ypos == Frame.s1_y + Frame.s1_h && (int)xpos+width>=Frame.s1_x && (int)xpos<=Frame.s1_x+Frame.s1_w) {
			collision_y=true;
				}
			
		
		//Kollision mit Streckenelement 2
		//links
		if ((int)xpos + width== Frame.s2_x && (int)ypos+hight>=Frame.s2_y && (int)ypos<=Frame.s2_y+Frame.s2_h) {
			collision_x=true;
				}
		//rechts
		if ((int)xpos == Frame.s2_x + Frame.s2_w && (int)ypos+hight>=Frame.s2_y && (int)ypos<=Frame.s2_y+Frame.s2_h) {
			collision_x=true;
				}
		//oben
		if ((int)ypos + hight == Frame.s2_y && (int)xpos+width>=Frame.s2_x && (int)xpos<=Frame.s2_x+Frame.s2_w) {
			collision_y=true;
				}
		//unten
		if ((int)ypos == Frame.s2_y + Frame.s2_h && (int)xpos+width>=Frame.s2_x && (int)xpos<=Frame.s2_x+Frame.s2_w) {
			collision_y=true;
				}
				

		//Kollision mit Streckenelement 3
		//links
		if ((int)xpos + width== Frame.s3_x && (int)ypos+hight>=Frame.s3_y && (int)ypos<=Frame.s3_y+Frame.s3_h) {
			collision_x=true;
				}
		//rechts
		if ((int)xpos == Frame.s3_x + Frame.s3_w && (int)ypos+hight>=Frame.s3_y && (int)ypos<=Frame.s3_y+Frame.s3_h) {
			collision_x=true;
				}
		//oben
		if ((int)ypos + hight == Frame.s3_y && (int)xpos+width>=Frame.s3_x && (int)xpos<=Frame.s3_x+Frame.s3_w) {
			collision_y=true;
				}
		//unten
		if ((int)ypos == Frame.s3_y + Frame.s3_h && (int)xpos+width>=Frame.s3_x && (int)xpos<=Frame.s3_x+Frame.s3_w) {
			collision_y=true;
				}
			
		//Die Bewegung in x oder y Richtung wird umgewandelt. Dadurch prallt der Spieler bei der Kollision ab.
				
		if(collision_x==true) xspeed=-xspeed;
		if(collision_y==true) yspeed=-yspeed;
		
		
		//Rückwärtsrund verhindern
		if((int)xpos==Frame.z_x && (int)ypos>=Frame.z_y && (int)ypos<=Frame.z_y+Frame.z_h-hight && xspeed>0) xspeed=-xspeed;
		
		xpos += xspeed;											//Position verändert sich mit jedem update um die speed 
		ypos += yspeed;
		
		
		//Runde  (Da der Speieler bei mehreren Updates auf der position sein kann, wird eine Zahl am anfang und am Ende 
		if((int)xpos==Frame.z_x && (int)ypos>=Frame.z_y && (int)ypos<=Frame.z_y+Frame.z_h-hight) round_1=round_1+1;
		if((int)xpos==Frame.z_x+Frame.z_w && (int)ypos>=Frame.z_y && (int)ypos<=Frame.z_y+Frame.z_h-hight) round_2=round_2+1;
		
		if (round_1>0 && round_2>0){
			round=round+1; 
			round_1=0;
			round_2=0;
		}
		
		
		
		
	}
}
"Das Internet wird die Welt verändern" - Leonardo da Vinci

Benutzeravatar
niq333
Beiträge: 1443
Registriert: 15.01.2007 14:14
Persönliche Nachricht:

Re: Problem bei Java-Projekt

Beitrag von niq333 » 20.09.2015 15:20

Menue.Java
SpoilerShow

Code: Alles auswählen

package game3;




	import java.awt.Color;
	import java.awt.Font;
	import java.awt.event.ActionEvent;
	import java.awt.event.ActionListener;

	import javax.swing.JButton;
	import javax.swing.JFrame;
	import javax.swing.JOptionPane;


	public class Menue extends JFrame implements ActionListener {

		private JButton starten;
		private JButton info;
		private JButton ende;
		
		public static void main(String[] args) {
			
			
			Menue menu = new Menue("Menü");
			menu.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
			//Fenster schliessen, wenn man x drueckt
			menu.setBounds(550, 200, 290, 350);
			//Ort und Stelle des Fensters
			menu.getContentPane().setBackground(Color.BLACK);
			//Hintergrundfarbe = schwarz
			menu.setUndecorated(true);
			//Seitenrand wegmachen		
			
			menu.setLayout(null);
			//null = eigenes Layout erstellen
			menu.setVisible(true);
			// Fenster sichtbar machen
		

		}
		
		public Menue(String title) {
			super(title);
			
			final int breite = 160; // Setze Breite fest, die als Variable fuer alle benutzt werden kann
			final int hoehe = 40; //Setze Hoehe fest, die als Variable fuer alle benutzt werden kann
			final int xposition = 65; //Setze die Position von x auf eine bestimmte Groesse fest
			
			Font Schrift = new Font ("Calibri", Font.BOLD+Font.ITALIC, 20);
			
			
			
			starten = new JButton("Spiel starten"); //neuer Button: schliessen
			starten.setBounds(xposition,50,breite, hoehe); //Ort und Stelle des Button
			getRootPane().setDefaultButton(starten); //setze als Standardbutton: Enter fuehrt zu Spielstart
			starten.addActionListener(this); //ActionListener einbinden (damit auf Klick reagiert)
			starten.setFont (Schrift); //definierte Schrift "Schrift" (Zeile 47) verwenden
			starten.setBackground(Color.YELLOW); //Hintergrund des Buttons farbig machen
			starten.setForeground(Color.BLUE); //Schrift farbig machen, in dem man den "Vordergrund" farbig macht
			add(starten); //hinzufuegen
			
			
			info = new JButton("Info");
			info.setBounds(xposition,150,breite, hoehe);
			
			info.addActionListener(this);
			info.setFont(Schrift);
			info.setBackground(Color.WHITE);
			info.setForeground(Color.BLUE);
			add(info);
			
			ende = new JButton("Ende");
			ende.setBounds(xposition,250,breite, hoehe);
			ende.addActionListener(this);
			ende.setFont(Schrift);
			ende.setBackground(Color.WHITE);
			ende.setForeground(Color.BLUE);
			add(ende);
			
			
			
		}
			
	  
		public void actionPerformed(ActionEvent e) {
			//welche Aktionen getan werden sollen, wenn Button XY gedrueckt wird
		
			
			if (e.getSource()== starten) {
				this.setVisible(false); // Fenster "schliessen"
				Game Game = new Game(); // Spiel starten
				Game.run();
			}
			
			if (e.getSource() == info ) {
				Object[] options = {"OK"};
				
				JOptionPane.showOptionDialog(null,"Programiert von ............","Information",JOptionPane.DEFAULT_OPTION,JOptionPane.PLAIN_MESSAGE,null,options,options[0]);
				//wenn Button info gedrueckt wird, dann Optionsfeld (von wem programmiert + OK Button = schliessen)
			}
			
			if(e.getSource() == ende) {
				System.exit(0);
				
				//wenn ende gerdueckt wird, dann Menue schliessen & Programm schliessen
			}
		
		}
	
			
	}
Player.Java+Player2.Java(fast gleich]
SpoilerShow

Code: Alles auswählen

package game3;

import game3.Game;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.KeyEvent;

public class Player {
	
	private float xpos;			//Position u.U. float episode 5   //float, da sonst nicht nach links und rechts gleiche geschwindigkeit
	private float ypos;
	private float xspeed;		//Geschwindigkeit
	private float yspeed;
	private boolean collision_x;     //True abfrage, ob eine collision statt gefunden hat. Bei einer Kollision mit gzwei Elementen Gleichzeitig wandelt sich sonst der negative Abprallefekt in einen positiven Wert um und Spieler geht in die Begrenzung
	private boolean collision_y;
	
	public static int width = 20;				//Größe des objektes wird festgelegt
	public static int hight = 20;
	
	public static int round_1 = 0;
	public static int round_2 = 0;
	public static int round = 0;
	
	public static int max_round = 2;
	
	
	public Player(int xpos, int ypos){
		this.xpos = xpos;				//Übergabe der Position
		this.ypos = ypos;
	}
	
	public void draw(Graphics g){				//Zeichnen des Players
		g.setColor(Color.BLUE);
		g.fillRect((int)xpos,(int)ypos,width,hight);
	}
	
	public void update(){
		
//		xspeed=0;     												// damit beim loslassen der taste element stehen bleibt
//		yspeed=0;

		if(Keyboard.isKeyPressed(KeyEvent.VK_UP)) {yspeed += -0.005f;}//{yspeed=yspeed*0.7f;}    // was passiert beim drücken von tasten
		if(Keyboard.isKeyPressed(KeyEvent.VK_DOWN)) {yspeed += 0.005f;}//{yspeed=yspeed*0.7f;}
		if(Keyboard.isKeyPressed(KeyEvent.VK_RIGHT)) {xspeed += 0.005f;} //{xspeed=xspeed*0.7f;}
		if(Keyboard.isKeyPressed(KeyEvent.VK_LEFT)) {xspeed += -0.005f;} //{xspeed=xspeed*0.7f;}
		

		
		//Reibung einfügen??
		
		
		
		//maximale Geschwindigkeit
		if(xspeed>1) xspeed=1;
		if(xspeed<-1) xspeed=-1;
		if(yspeed>1) yspeed=1;
		if(yspeed<-1) yspeed=-1;
	
		
		
		
		// Kollision mit Rahmen
		
		//links
		if (xpos<4) {
			xpos=4;										// Begrenzung des Rahmens 
			xspeed=-xspeed;								// Abprallen
		}
		
		//rechts
		if (xpos+width>Game.width-4) {
			xpos=Game.width-width-4;						// -width, da die position der linken oberen ecke genutzt wird
															// Geschwindigkeit wird 0 gesetzt
			xspeed=-xspeed;
		}
		
		//oben
		if (ypos<24){
			ypos=24;
			yspeed=-yspeed;			
		}
		
		
		//unten
		if (ypos+hight>Game.hight-4) {
			ypos=Game.hight-hight-4;
			yspeed=-yspeed;

		}
		
		//Kollisionsabfragen. Zunächst wird überprüft, ob eine Kollision in x oder y Richtung stattfand. 
		
		//Kollisionsabfragen müssen wieder false gesetzt werden, da sonst die Kollision des letzten updates bestehen bleiben würde.
		collision_x=false;
		collision_y=false;

		//Kollision mit Streckenelement 1
		//links
		if ((int)xpos + width== Frame.s1_x && (int)ypos+hight>=Frame.s1_y && (int)ypos<=Frame.s1_y+Frame.s1_h) {
			collision_x=true;
			}
		//rechts
		if ((int)xpos == Frame.s1_x + Frame.s1_w && (int)ypos+hight>=Frame.s1_y && (int)ypos<=Frame.s1_y+Frame.s1_h) {
			collision_x=true;
			}
		//oben
		if ((int)ypos + hight == Frame.s1_y && (int)xpos+width>=Frame.s1_x && (int)xpos<=Frame.s1_x+Frame.s1_w) {
			collision_y=true;
			}
		//unten
			if ((int)ypos == Frame.s1_y + Frame.s1_h && (int)xpos+width>=Frame.s1_x && (int)xpos<=Frame.s1_x+Frame.s1_w) {
			collision_y=true;
				}
			
		
		//Kollision mit Streckenelement 2
		//links
		if ((int)xpos + width== Frame.s2_x && (int)ypos+hight>=Frame.s2_y && (int)ypos<=Frame.s2_y+Frame.s2_h) {
			collision_x=true;
				}
		//rechts
		if ((int)xpos == Frame.s2_x + Frame.s2_w && (int)ypos+hight>=Frame.s2_y && (int)ypos<=Frame.s2_y+Frame.s2_h) {
			collision_x=true;
				}
		//oben
		if ((int)ypos + hight == Frame.s2_y && (int)xpos+width>=Frame.s2_x && (int)xpos<=Frame.s2_x+Frame.s2_w) {
			collision_y=true;
				}
		//unten
		if ((int)ypos == Frame.s2_y + Frame.s2_h && (int)xpos+width>=Frame.s2_x && (int)xpos<=Frame.s2_x+Frame.s2_w) {
			collision_y=true;
				}
				

		//Kollision mit Streckenelement 3
		//links
		if ((int)xpos + width== Frame.s3_x && (int)ypos+hight>=Frame.s3_y && (int)ypos<=Frame.s3_y+Frame.s3_h) {
			collision_x=true;
				}
		//rechts
		if ((int)xpos == Frame.s3_x + Frame.s3_w && (int)ypos+hight>=Frame.s3_y && (int)ypos<=Frame.s3_y+Frame.s3_h) {
			collision_x=true;
				}
		//oben
		if ((int)ypos + hight == Frame.s3_y && (int)xpos+width>=Frame.s3_x && (int)xpos<=Frame.s3_x+Frame.s3_w) {
			collision_y=true;
				}
		//unten
		if ((int)ypos == Frame.s3_y + Frame.s3_h && (int)xpos+width>=Frame.s3_x && (int)xpos<=Frame.s3_x+Frame.s3_w) {
			collision_y=true;
				}
			
		//Die Bewegung in x oder y Richtung wird umgewandelt. Dadurch prallt der Spieler bei der Kollision ab.
				
		if(collision_x==true) xspeed=-xspeed;
		if(collision_y==true) yspeed=-yspeed;
		
		
		//Rückwärtsrund verhindern
		if((int)xpos==Frame.z_x && (int)ypos>=Frame.z_y && (int)ypos<=Frame.z_y+Frame.z_h-hight && xspeed>0) xspeed=-xspeed;
		
		xpos += xspeed;											//Position verändert sich mit jedem update um die speed 
		ypos += yspeed;
		
		
		//Runde  (Da der Speieler bei mehreren Updates auf der position sein kann, wird eine Zahl am anfang und am Ende 
		if((int)xpos==Frame.z_x && (int)ypos>=Frame.z_y && (int)ypos<=Frame.z_y+Frame.z_h-hight) round_1=round_1+1;
		if((int)xpos==Frame.z_x+Frame.z_w && (int)ypos>=Frame.z_y && (int)ypos<=Frame.z_y+Frame.z_h-hight) round_2=round_2+1;
		
		if (round_1>0 && round_2>0){
			round=round+1; 
			round_1=0;
			round_2=0;
		}
		
		
		
		
	}
}
"Das Internet wird die Welt verändern" - Leonardo da Vinci

Benutzeravatar
$tranger
Beiträge: 11525
Registriert: 07.08.2008 20:30
Persönliche Nachricht:

Re: Problem bei Java-Projekt

Beitrag von $tranger » 24.09.2015 10:09

niq333 hat geschrieben:
Batistuta hat geschrieben:"public static void main(String[] args)" ist selber eine Methode , also kann man da drin nicht eine neue Methode wie run() erstellen. Aber außerhalb davon sollte sowas wie public void run(){ } eigentlich klappen. Was gibt er denn bei dir für eine Fehlermeldung raus?
Also wenn ich "public static void main(String[] args) {" durch "public void run() {" ersetze, dann öfnet sich beim start-button im menü ein fenster mit dem rennspiel, aber ich kann dann mit keiner taste mehr beschleunigen etc.
Meine Frage ist jetzt, ob ich das "public void run() {" jetzt für etwas anderes setzen muss, weil ich ja irgendeinen code damit ausführen muss. Und mein Prof meinte auf Nachfrage auch nur, dass ich in der bereits geposteten Klasse nur noch eine Methode "run" mit dem Code brauche, der das Spiel "laufen" lässt.

Wenn ich von der geposteten Klasse aus starte, funktioniert übrigens alles. Nur dann ist kein Spielmenü involviert^^
Auf den ersten flüchtigen Blick:
Ihr habt den Großteil des Codes in der Main, die automatisch beim Aufruf der Klasse gestartet wird.
Da muss doch eigentlich nur die run() auf die gleiche Höhe wie die Main und ggf der andere Kram noch in ne eigene Methode.
Evtl müssste ihr noch was aus der Main in run umschichten, damit alles richtig initialisiert wird, wenn ihr das Spiel startet.


Public Class Game{
----public static void main(){
----}

----public static void run(){
----}
}
Bild

Ihr seid Anime-Fans? Dann seid ihr im Anime-Diskussionsthread genau richtig!

Antworten