# Probleme bei der OoP



## nassi (26. Mrz 2005)

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)


```
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();
  }
}
```


----------



## bambi (28. Mrz 2005)

Also ich schau mal rein, aber was mir schon mal aufgefallen ist:
Variablennamen werden immer klein geschrieben  :wink:


----------



## bambi (29. Mrz 2005)

Also hab' da mal ein bissl rumgebastelt... Vielleicht gibt's Dir 'ne Idee. 
Steht im "Codeschnipsel"


----------

