N
nassi
Gast
Hi,
ich habe ein Problem mein Programm Objektorientiert zu machen..
Die Aufgabe ist, eine Programmstruktur zu schreiben, die folgendes kann: Ein Hintergrund, auf dem mehere Ufos und Autos sich bewegen. Zudem noch unbewegliche Objekte wie Häuser... Das ganze eben mit Image, Thread, JFrame usw..
Dazu sei gesagt, dass ich die Aufgabe freiweillig mache, um mich in Java einzuarbeiten (Studium, und jetzt gerad noch Semesterferien)
Die Programmstruktur sieht ungefähr so aus (undgefähr so vorgegeben, mir würde es so schon reichen!!):
abstract class Frame (soll eine paint Methode enthalten)
abstract class bewegbareObjekte extends Frame
abstract class unbewegbareObjekte extends Frame
class Ufo extends bewegbareObjekte
class Auto extends bewegbareObjekte
class Haus extends unbewegbareObjekte
So, das schwere ist für mich einfach eine solche Klassenstruktur zu hinzubekommen! Ich habe das Programm bereits geschrieben, aber alles in einer Klasse (siehe unten). Meine Gedanken:
Ich habe zuerst alles in getrennte Klassen geteilt. Dabei hat meine oberste Klasse das Frame erzeugt und die untersten hatten jeder für sich ein eigenen Thread mit einer eigenen run() Methode. Ging nicht, weil bei jedem neuen Objekt (Ufo ufo1 = new Ufo()) ein neues Frame erzeugt wird. Aber irgendwie muss ja letztlich doch ein Frame erzeugt werden,aber nur eins...da war ich schonmal ratlos...
Dann habe ich versucht das ganze zu trennen und eine völlig unabhängige Klasse zu erzeugen, die ein Frame erzeugt. Klappte zwar, aber ich habe nie das Ufo gesehen... Dann habe ich an versch. Übergabe-Methoden gedacht, die das ImageObjekt weitergeben sollte in ein Array. Das hat aber auch nicht geklappt, weil ich am Ende doch irgendwie die Threads mit einer repaint() Methode starten muss. Wenn die aber völlig unabhängig von allem anderen sind, dann kann ja auch keine repaint Methode aufgerufen werden. Ich selber kann mir auch nicht vorstellen, dass ich für jedes Objekt einen eigenen Thread haben muss, dass ja sonst sehr oft gerepaintet wird, was performance kosten wird!
Letztlich bin ich ziemlich davon überzeugt, dass das Frame in der obersten Klasse erzeugt werden muss. Dazu startet diese Klasse einen Thread...
Ihr merkt schon, ich bin ratlos...ich habe schon so viele Stunden jetzt daran gesessen...Könnt ihr euch das mal druchguggn unten und mir helfen? Vielleicht sogar kurz umschreiben?
Hier das Prgramm (noch in einer Klasse)
ich habe ein Problem mein Programm Objektorientiert zu machen..
Die Aufgabe ist, eine Programmstruktur zu schreiben, die folgendes kann: Ein Hintergrund, auf dem mehere Ufos und Autos sich bewegen. Zudem noch unbewegliche Objekte wie Häuser... Das ganze eben mit Image, Thread, JFrame usw..
Dazu sei gesagt, dass ich die Aufgabe freiweillig mache, um mich in Java einzuarbeiten (Studium, und jetzt gerad noch Semesterferien)
Die Programmstruktur sieht ungefähr so aus (undgefähr so vorgegeben, mir würde es so schon reichen!!):
abstract class Frame (soll eine paint Methode enthalten)
abstract class bewegbareObjekte extends Frame
abstract class unbewegbareObjekte extends Frame
class Ufo extends bewegbareObjekte
class Auto extends bewegbareObjekte
class Haus extends unbewegbareObjekte
So, das schwere ist für mich einfach eine solche Klassenstruktur zu hinzubekommen! Ich habe das Programm bereits geschrieben, aber alles in einer Klasse (siehe unten). Meine Gedanken:
Ich habe zuerst alles in getrennte Klassen geteilt. Dabei hat meine oberste Klasse das Frame erzeugt und die untersten hatten jeder für sich ein eigenen Thread mit einer eigenen run() Methode. Ging nicht, weil bei jedem neuen Objekt (Ufo ufo1 = new Ufo()) ein neues Frame erzeugt wird. Aber irgendwie muss ja letztlich doch ein Frame erzeugt werden,aber nur eins...da war ich schonmal ratlos...
Dann habe ich versucht das ganze zu trennen und eine völlig unabhängige Klasse zu erzeugen, die ein Frame erzeugt. Klappte zwar, aber ich habe nie das Ufo gesehen... Dann habe ich an versch. Übergabe-Methoden gedacht, die das ImageObjekt weitergeben sollte in ein Array. Das hat aber auch nicht geklappt, weil ich am Ende doch irgendwie die Threads mit einer repaint() Methode starten muss. Wenn die aber völlig unabhängig von allem anderen sind, dann kann ja auch keine repaint Methode aufgerufen werden. Ich selber kann mir auch nicht vorstellen, dass ich für jedes Objekt einen eigenen Thread haben muss, dass ja sonst sehr oft gerepaintet wird, was performance kosten wird!
Letztlich bin ich ziemlich davon überzeugt, dass das Frame in der obersten Klasse erzeugt werden muss. Dazu startet diese Klasse einen Thread...
Ihr merkt schon, ich bin ratlos...ich habe schon so viele Stunden jetzt daran gesessen...Könnt ihr euch das mal druchguggn unten und mir helfen? Vielleicht sogar kurz umschreiben?
Hier das Prgramm (noch in einer Klasse)
Code:
import java.awt.*;
import java.awt.event.*;
import javax.swing.JFrame;
import java.util.*;
public class Frame extends JFrame implements Runnable{
Thread thread;
Image background;
Image Ufo;
Image Auto;
//Variablen für die Bewegung des Ufos
Random r = new Random();
public int imgX=300;
public int imgY=300;
public int bfy=300;
public int bfx=300;
public int hilfx;
public int hilfy;
//Variablen für die Bewegung des Autos
public int AutoX=0;
//Variablen fürdie DoppelPufferung
private Image dbImage;
private Graphics dbGraphics;
//ebenfalls Variablen, aber nicht relevant!
int move=0;
boolean test = true;
int rZahl;
//Konstruktor, der ein Frame erzeugt
public Frame()
{
super("Bitmap Test");
setSize(1024, 700);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
//Startet Thread
this.startAnimation();
}
//Startet Thread
public void startAnimation() {
thread = new Thread(this);
thread.start();
}
//Startet die DoppelPufferung, damit das Bild nicht flackert!
//Die Methode "repaint();" ruft zuerst update(); und dann paint(); auf!
public void update(Graphics g){
if (dbImage==null) {
dbImage=createImage(this.getSize().width, this.getSize().height);
dbGraphics=dbImage.getGraphics();
}
paint(dbGraphics);
g.drawImage(dbImage,0,0,this);
}
//Die paint(); Methode, die in dem Frame die Bilder zeichnet
public void paint(Graphics g) {
g.drawImage(background,0,0,this);
g.drawImage(Ufo,imgX,imgY,this);
g.drawImage(Auto,AutoX,600,this);
}
//Die run(); Methode, die von Runnable implementiert wird und den Thread ausführt
public void run(){
//Mediatracker lädt alle notwendigen Bilder in den Speicher
MediaTracker mt = new MediaTracker(this);
//alle Bilder werden geladen und in den Speicher gepackt
background = getToolkit().getImage("nightsky.gif");
mt.addImage(background, 0);
Ufo = getToolkit().getImage("ufo.gif");
mt.addImage(Ufo, 1);
Auto = getToolkit().getImage("car_right.gif");
mt.addImage(Auto, 2);
//es wird gewartet, bis alle Bilder geladen sind
try {
mt.waitForAll();
}
catch (InterruptedException e)
{}
test=true;
//Animation beginnen; Endlosschleife für den Threadwird gestartet.
while (true){
repaint();
//Brauch nicht gelesen werden! Hierwird lediglich das Ufo via Zufall bewegt
if (test==true) {
bfx = 1+Math.abs(r.nextInt()) % 2;
bfy = 1+Math.abs(r.nextInt()) % 2;
hilfx = Math.abs(r.nextInt()) % 50;
hilfy = Math.abs(r.nextInt()) % 50;
System.out.println( hilfx +" "+imgX+ " "+ hilfy+" " +imgY);
if (bfx==1) {hilfx = hilfx + imgX;}
else if (bfx==2) {hilfx = imgX - hilfx;}
if (bfy==1) {hilfy = hilfy + imgY;}
else {hilfy = imgY - hilfy;}
System.out.println(bfx+" " + bfy+" "+test +" "+ hilfx +" "+imgX+ " "+ hilfy+" " +imgY);
test=false;
}
if ((bfx==1)&&(imgX < hilfx)) {imgX +=1;System.out.println("1. "+imgX);}
if ((bfy==1)&&(imgY < hilfy)) {imgY +=1;System.out.println("2. "+imgY);}
if ((bfx==2)&&(hilfx < imgX)) {imgX -=1;System.out.println("3. "+imgX);}
if ((bfy==2)&&(hilfy < imgY)) {imgY -=1;System.out.println("4. "+imgY);}
if ((imgX==hilfx) && (imgY==hilfy)) test=true;
//Bis hierhin handelt der Quelletext nur von der Ufobewegung!!!
//Das Auto wird von links nach rechts bewegt.
AutoX++;
//10 Millisekunden wird jeweils gewartet
try {
Thread.sleep(10);
}
catch (InterruptedException e)
{}
}
}
//Die Main-Methode
public static void main(String[] args){
Frame fr = new Frame();
}
}