OutofMemoryError

Status
Für weitere Antworten geschlossen.

360Boarder

Registered +
Registriert
Jan. 2007
Beiträge
166
Hi Leute. Ich hab ein Spiel programmiert bei dem ich einen Canvas anlege und ein Endlosgif als Hintergrund laufen lasse, dann lade ich die Spielfigur auch in Form eines Endlosgifs (die Füße bewegen sich vor und zurück) rein. Das funktioniert auch soweit. Doch wenn ich das Prog länger laufen lasse bekomm ich immer einen OutofMemoryError.

Ich glaube zu wissen woran es liegt: Die Endlosgifs werden immer neu reingeladen und immer neu gezeichnet. Das braucht so viel Speicher...

Wie kann ich es z.B schaffen das, das Hintergrundgif nur ein mal gezeichnet wird? Denn da es ein Endlosgif ist läuft es ja sowieso weiter, oder? Aber so würde es nicht so viel Speicher brauchen, denk ich.
Ich hab schon einiges versucht aber mittlerweile bin ich am Verzweifeln.

Bitte um Hilfe.

Hier mal der Code meiner Canvas Klasse:
Game.Hintergrund //Endlosgif für Hintergrund
Game.Figur //Endlosgif der Spielfigur
Code:
//START// Imports
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import java.io.*;
import java.awt.print.*;
import java.awt.event.MouseEvent.*;
import java.awt.image.*;
//ENDE// Imports


//START//////////////
//Class: MyCanvas //
///////////////////////
class MyCanvas extends Canvas implements MouseMotionListener, MouseListener,
KeyListener {

Toolkit toolkit = Toolkit.getDefaultToolkit();

//START// paint
public void paint(Graphics g) {

//START// Menübild zeichnen
Game.Menuebild = toolkit.getImage("Titelbild.gif");
if (Game.start == 0) {
if (Game.Menuebild != null) {
g.drawImage(Game.Menuebild, 0, 22, this);
}
}
//ENDE// Menübild zeichnen


//START// Grafiken im Spiel zeichnen
if ((Game.start == 1) && (Game.endestart == 0)) {

//START// Hintergrund des Spiels zeichnen
Game.Hintergrund = toolkit.getImage("Bild.gif");
if (Game.Hintergrund != null) {
g.drawImage(Game.Hintergrund, 0, 22, this);
}
//ENDE// Hintergrund des Spiels zeichnen

//START// Figur des Spiels zeichnen
switch (Game.figur) {
case 1:
Game.Figur = toolkit.getImage("Figur1.gif");

break;
case 2:
Game.Figur = toolkit.getImage("Figur2.gif");
break;
case 3:
Game.Figur = toolkit.getImage("Fig3.gif");
break;
case 4:
Game.Figur = toolkit.getImage("Figur4.gif");
break;
default:
}

if (Game.Figur != null) {
if ((Game.ende == 0) && (Game.ducken == 0) &&
(Game.springen == 0)) {
g.drawImage(Game.Figur, Game.fx, Game.fy, this);
}
}//ENDE// Figur des Spiels zeichnen

}//ENDE// Grafiken im Spiel zeichnen

} //ENDE// paint

}
//ENDE/////////////
//Class: MyCanvas //
////////////////////
 
hi,

durch was dein "outofmemoryerror" hervorgerufen wird, kann ich an diesem code ausschnitt nicht erkennen. grundlegend werden "outofmemoryerror" exceptions ausgeloesst, sobald die jvm keinen speicher mehr fuer ein objekt reservieren kann und sie auch keinen speicher mehr durch den garbage collector zur verfuegung gestellt bekommt. viel. kommt der fehler auch durch die sachen, die ich noch anzumerken habe.

auch wenn dein source unter bestimmten lizenzen steht, wuerde ich gern auch die restlichen klassen sehn um zu schaun an was es liegen koennte.

bei deinem code fallen mir allerdings ein paar sachen ein, die du viel. anders machen solltest. du verwendest in deiner klasse den falschen zugriffsmodifikator (public) fuer membervariablen. du solltest fuer das prinzip "information hiding" den modi private verwenden.
Code:
Toolkit toolkit = Toolkit.getDefaultToolkit();

ein weiterer punkt ist das du mit
Code:
Game.Menuebild = toolkit.getImage("Titelbild.gif");
jedesmal ein neues objekt erzeugst, was in meinen augen nicht noetig ist, weil sich das bild vermutlich nicht aendert. du solltest es viel. nicht in die paint methode schreiben. ebenso kann es sein das deine paint methode frueher zeichnen will und das bild zu diesem zeitpunkt noch nicht geladen ist. dieses problem kann man auch umgehen mit der klasse mediatracker.

bei der variable
Code:
Game.Menuebild
bin ich etwas ins gruebeln gekommen, weil du sie nirgend deklariert und auch keine weiteren pakete einbindest in der sie evtl. deklariert ist. seitden du verwendest public membervariablen ;-)


fuer den ausschnitt solltest du definitiv was anderes einfallen lassen. du kannst vorher (aber definitv nicht in der methode paint) ueberpruefen um welches gif es sich handelt.

Code:
 switch (Game.figur) {
case 1:
Game.Figur = toolkit.getImage("Figur1.gif");

break;
case 2:
Game.Figur = toolkit.getImage("Figur2.gif");
break;
case 3:
Game.Figur = toolkit.getImage("Fig3.gif");
break;
case 4:
Game.Figur = toolkit.getImage("Figur4.gif");
break;
default:

durch deine ganzen dynamischen einbindungen muessen immer wieder objekte erzeugt werden und die paint methode wird immer dann von der jvm aufgerufen sobald sich etwas am bild aendert z.b. fenster minimieren, maximieren button druecken und so weiter... viel liegt es daran.


gruss tuney
 
Hi
Erstmas danke für die schnelle Antwort.

Ich hab das mit dem toolkit.getImage schon versucht ausherhalb von paint aufzurufen, doch dann hat er es wie du schon gesagt hast nicht gezeichnet. Und wie das mit der Klasse Mediatracker funktionier weis ich leider nicht.

Die Varibale Game.Menübild habe ich in der Klasse "Game" mittels "static" angelegt.

Die Überprüfung welche Figur ausgewählt werden soll (switch) funktioniert, da vorher ein Fenster geschlossen wird wo man sich die Figur mittels Mausklick auswählt, deswegen wird paint wieder aufgerufen.

Die restlichen Klassen würde ich dir gerne zeigen. Es sind jedoch insgesamt 6 Stück. (Ich bin nicht grad der strukturierteste oder ressourcenschonenste Programmierer)
Falls du dir also die Arbeit wirklich antun möchtest und den ganzen Code durchschauen willst poste ich sie gerne oder schick sie dir per E-Mail oder so, wie du willst ;)
Ich freue mich natürlich über deine vielen Tipps und danke die für die tolle Hilfe aber das du dir mein komplettes (wirres) Programm durchschaust ist etwas zu viel verlangt von mir. Also werd ich dir den Code nur schicken wenn du das willst und du deine kostbare Zeit in mein Programm investieren willst ;)

lg.Boarder
 
hi,

werde mir das programm nur anschauen, das sollte nich so aufwendig sein. ob es wirre ist hin oder her ist egal, schliesslich willste das programm ja auch weiter programmieren. du kannst meine icq nummer adden oder mir eine mail schreiben oder auch beides, liegt in deinem ermessen.


gruss tuney
 
tuney schrieb:
grundlegend werden "outofmemoryerror" exceptions ausgeloesst, sobald die jvm keinen speicher mehr fuer ein objekt reservieren kann und sie auch keinen speicher mehr durch den garbage collector zur verfuegung gestellt bekommt.

Sind Errors nicht ähnlich wie Exceptions, aber werden generell nicht vom Benutzer
geworfen, sondern von der virtuellen Maschine?
Also OutOfMemoryError ist keine Exception meine ich damit ;)
 
hi,

recht hast du. mittlerweile hat sich das wort exceptions bei mir so eingebuergert, das ich damit immer einen fehler meine aber das ist unter java programmierer etwas falsch. error und exception sind zwei verschiedene paar schuhe aber werden beide von der jvm geworfen. beide klassen also error und exception erben von der klasse throwable. der unterschied ist das error fehler meint, die so schwerwiegend sind das sie nicht mehr behandelt werden koennen/sollten und sicherlich zum programmabbruch fuehren.
bei den exceptions sieht das etwas anders aus, dort kann man fehler abfangen und behandeln damit das programm eben nicht beendet wird, wenn sie nicht behandelt werden dann fuehrt es auch zu einem programmabsturzt. mit programmabsturzt mein ich das programmende.

auszug aus java2 platform:
The Throwable class is the superclass of all errors and exceptions in the Java language. Only objects that are instances of this class (or one of its subclasses) are thrown by the Java Virtual Machine or can be thrown by the Java throw statement

ich hab nochmal ein buch herausgekrammt in dem es auch sehr verwaschen steht, viel. hab ich daher meine falsche wortwahl:

Ausnahmen oder Exceptions sind Instanzen der Klasse java.lang.Throwable oder einer ihrer Subklassen, die zur Laufzeit vom System als Reaktion auf eine Ausnahmesituation generiert werden.

Quelle: Java & Webapplikationen, Kostenlos nachschlagen und lernen - TEIA AG, Wolfgang Coy

das schoene ist, das wenn man im web nachschaut unter Kostenlos nachschlagen und lernen - TEIA AG dann findet man diesen satz nicht so wie er dort oben steht, obwohl das buch opensource ist. anscheinend wurde dieser ausschnitt ueberarbeitet, weil er eben schwammig und falsch war.

uebrigens, weiss ich nicht ob sich dieser thread nun erledigt hat oder nicht, weil ich bislang noch keinen code erhalten habe und auch noch kein code gepostet wurde.


gruss tuney
 
Hi, danke das du dir die Zeit nimmst mein Prog durchzuschauen.

Ich hab dir den Code per E-Mail geschickt ;)

lg.Boarder
 
hi,

also hab mir das programm angeschaut. weiss jetzt nicht wie lange du schon programmierst aber erstmal hut ab das du soviele ideen in das programm eingebaut hast.

was mich an dem programm stoert ist, dass du methoden verwendest die als deprecated gekennzeichnet sind, spricht methoden, die u.a. auf grund von preformance einbussen nicht mehr verwendet werden sollten, angezeigt bekommst du die mit der ide eclipse (verfuegbar fuer alle gaengigen os).

zweitens ist dein programm nicht objektorientiert aufgebaut, weil du 90 % deiner variablen als static deklariert um sie so in anderen klassen verwenden zu koennen. das ist nicht der sinn von oop. eigenschaften (also variablen) kommen in die klasse, in der sie manipuliert werden. wenn eine andere klasse darauf zugreifen muss oder will dann stellt die klassen zugriffmethoden dafuer bereit (information hiding).

dein programm zeile fuer zeile zu veraendern/verbessern wuerde keinen sinn machen und auch zuviel zeit benoetigen, also kann ich dir nur den vorschlag machen, ich programmiere dein programm nach oop nach oder du schickst mir die fehlenden bilder / musikfiles und ich suche explizit den fehler, der den error hervorruft und verbessere nur den, so dass das programm wieder laeuft.

ebenso ist es sinnvoll den code als beitrag zu posten, damit jeder ideen/ratschlaege geben kann. evtl. finden sich auch leute die mit an dem programm arbeiten moechten, weil die idee gefaellt.

gruss tuney
 
Vielen Dank für die tollen Tipps

Ich würde mich rießig freuen wenn du versuchen könntest den Fehler zu finden.

Ich werde das Programm erstmal so lassen, jedoch werd ich mir beim nächsten mal gleich von Anfang an deine Tipps zu Herzen nehmen ;)

Also, könntest du mir deine E-Mail Adresse per PN schicken damit ich dir die Bilder/Sounds als Anhang schicken kann?

Also hier ist der Code aller Klassen meines Programmes: (Ich bin für jeden Tipp und Verbesserungsvorschlag dankbar)

Klasse "Game":
Code:
//START// Imports

import javax.sound.sampled.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import java.io.*;
import java.awt.print.*;
import java.applet.*;
import java.awt.event.MouseEvent.*;
import java.awt.image.*;
import javax.swing.*;
import java.awt.MediaTracker.*;
import javax.swing.colorchooser.*;
import javax.swing.border.LineBorder;
import javax.swing.border.TitledBorder;

//ENDE// Imports


//START/////////
//Class: Game //
////////////////
public class Game extends Frame implements WindowListener, ActionListener {

//START//Deklarationen der verwendeten Variablen
File audioFile; //Audio File Hintergrundmusik
File audioFile2; //Audio File Menümusik
static AudioClip aClip; //Clip mit Hintergrundmusik
static AudioClip bClip; //Clip mit Menümusik
static Image spring; //Bilde der Figur beim springen
static Image duck; //Bild der Figur beim Ducken
static Image Hintergrund; //Bild des Hintergrunds im Spiel
static Image Menuebild; //Bild des Hintergrunds im Menü
static Image Figur; //Bild der Figur im Spiel
static Image Vogel; //Bild des Vogels
static int figur; //Figur die geladen werden soll (1-4)
static Image Endfilm; //Endfilm der beim Gave Over abgespielt wird
static Image Figurenwahl; //Bild aller Figuren die ausgewählt werden können
static int xmenü = 330;
static int ymenü = 150;
Dialog frage; //Dialog der beim Beenden geöffnet wird
static char gedrückt; //Variable zum Auswerten der Tastendrücke
static int start = 0; //Variable die auf 1 gesetzt wird wenn das Spiel gestartet wird
static int ende = 0; // auf 1 wenn Spiel endet
static int endfilm = 0; //auf 1 damit Endfilm abgespielt wird
static int endestart = 0; //auf 1 damit Hintergrund nicht weiterläuft
static int startfigurenwahl = 0;
static int endeducken = 0; //Wird auf 1 gesetzt damit die laufende Figur wieder gezeichnet wird
static int startinfo = 0; //Wird auf 1 gesetzt wenn Infos Butten gedrückt wird
static int ducken = 0; // Wird auf 1 gesetzt wenn nach unten gedrückt wird
static int springen = 0; //Wird auf 1 gesetzt wenn nach oben gedrückt wird
static int endespringen = 0; //Wird auf 1 gesetzt damit die laufende Figur wieder gezeichnet wird
static int figurgewählt = 0; //Wird auf 2 gesetzt wenn eine Figur ausgewählt wurde
Point Punkt1 = new Point(); //Punkt zum auswerten der Position der Spielfigur
static int fx = 160; //Position x der Figur
static int fy = 320; //Position y der Figur
static int vx = 360; //Position x des Vogels
static int vy = 300; //Position y des Vogels

Toolkit toolkit = Toolkit.getDefaultToolkit();



//START// Buttons anlegen
static Button b1 = new Button("Spiel starten");
static Button b2 = new Button("Infos");
static Button b3 = new Button("Beenden");
static Button ja = new Button("Ja");
static Button nein = new Button("Nein");
//ENDE// Buttons anlegen

//ImageIcon icon1 = new ImageIcon("Start.jpg");
//ImageIcon icon2 = new ImageIcon("Infos.jpg");
//ImageIcon icon3 = new ImageIcon("Beenden.jpg");
//javax.swing.JButton b1 = new JButton(icon1);
//javax.swing.JButton b2 = new JButton(icon2);
//javax.swing.JButton b3 = new JButton(icon3);

//ENDE//Deklarationen der verwendeten Variablen

public static void main(String[] args) {
Game a = new Game();
}

//START// GAME
public Game() {
//Game Name
super("Das Spiel");

//START// Hinterdrund Musik laden
try {
audioFile = new File("Bennyhill.wav");
audioFile2 = new File("Menümusik.wav");
aClip = Applet.newAudioClip(audioFile.toURL());
bClip = Applet.newAudioClip(audioFile2.toURL());
} catch (Exception ex) {
System.err.println("Audioclip Error");
}
//ENDE// Hinterdrund Musik laden

//START// Fenster Einstellungen
this.addWindowListener(this);
this.setLayout(null);
this.setResizable(false);
this.setBounds(330, 150, 500, 450);
this.setBackground(Color.white);
this.setVisible(true);
//ENDE// Fenster Einstellungen

//START// Button: Neues Spiel
b1.setBackground(Color.LIGHT_GRAY);
b1.addActionListener(this);
b1.setBounds(375, 275, 100, 35);
this.add(b1);
//ENDE// Button: Neues Spiel

//START// Button: Spiel laden
b2.setBackground(Color.LIGHT_GRAY);
b2.addActionListener(this);
b2.setBounds(375, 315, 100, 35);
this.add(b2);
//ENDE// Button: Spiel laden

//START// Button: Steuerung
b3.setBackground(Color.LIGHT_GRAY);
b3.addActionListener(this);
b3.setBounds(375, 355, 100, 35);
this.add(b3);
//ENDE// Button: Steuerung

//START// Canvas deklarationen
this.add(canv);
canv.setSize(500, 450);
canv.setLocation(0, 0);
canv.addKeyListener(canv);
canv.addMouseListener(canv);
//ENDE// Canvas deklarationen

bClip.play(); //Menümusik abspielen
NewThread th = new NewThread();
Hintergrund = toolkit.getImage("Bild.gif");

this.setVisible(true);

}

//EDNE// Game


public void windowOpened(WindowEvent e) {
}

public void windowClosing(WindowEvent e) {
System.exit(1);
}

public void windowClosed(WindowEvent e) {
}

public void windowIconified(WindowEvent e) {
}

public void windowDeiconified(WindowEvent e) {
}

public void windowActivated(WindowEvent e) {
}

public void windowDeactivated(WindowEvent e) {
}

public void actionPerformed(ActionEvent e) {

//START// Action Button "Start"
if (e.getActionCommand().equals("Spiel starten")) {

startfigurenwahl = 1; //Wird auf 1 gesetzt damit Canvas 2 die Figurenauswahl zeichnet

//START// Buttons im Menü ausblenden
b1.setVisible(false);
b2.setVisible(false);
b3.setVisible(false);
//ENDE// Buttons im Menü ausblenden

Spielfigur c = new Spielfigur(); //Figurenauswahl aufrufen

}
//ENDE// Action Button "Start"

//START// Action Button "Infos"
if (e.getActionCommand().equals("Infos")) {

//START// Buttons im Menü ausblenden
b1.setVisible(false);
b2.setVisible(false);
b3.setVisible(false);
//ENDE// Buttons im Menü ausblenden

startinfo = 1;
Infos i = new Infos(); //Infos aufrufen

}
//ENDE// Action Button "Infos


//START// Action Button "Beenden"
if (e.getActionCommand().equals("Beenden")) {
Label frage2 = new Label("Wollen Sie das Spiel wirklich beenden?"); //Frage die erscheint wenn man auf Beenden klickt
frage = new Dialog(this, "Beenden", true); //Frage dem Dialog hinzufügen

//START// Layout des Dialogs "Beenden"
frage.setLayout(new FlowLayout());
frage.setBounds(250, 250, 300, 100);
frage.setResizable(false);
frage.add(frage2);
frage.add(ja);
ja.addActionListener(this);
frage.add(nein);
nein.addActionListener(this);
frage.show();
//ENDE// Layout des Dialogs "Beenden"
}
//ENDE// Action Button "Beenden"


//START// Buttons Dialog "Beenden"
if (e.getSource() == ja) { //Wenn ja dann Spiel beenden
System.exit(1);
}
if (e.getSource() == nein) { //Wenn nein dann Spiel nicht beenden
frage.hide(); //Dialog ausblenden
}
//ENDE// Buttons Dialog "Beenden"
}

//START///////////
//Class: Thread //
//////////////////
class NewThread extends Thread {
NewThread() {
start();
}

public void run() {
while (true) {
//START// Ducken Annimation
//Wenn ducken gedrückt dann warten bis ducken gezeichnet ist und dann Bild flushen
if (endeducken == 1) {
try {
Thread.sleep(600);
duck.flush();
} catch (InterruptedException ex) {
}
endeducken = 0;
ducken = 0;
}
//ENDE// Ducken Annimation

//START// Springen Annimation
if (endespringen == 1) {
try {
Thread.sleep(600);
spring.flush();
} catch (InterruptedException ex) {
}
endespringen = 0;
springen = 0;
}
//ENDE// Springen Annimation
}
}
}


//ENDE////////////
//Class: Thread //
//////////////////



static MyCanvas canv = new MyCanvas(); //MyCanvas aufrufen

}
//ENDE//////////
//Class: Game //
////////////////

--------------------------------------------------------------------
Klasse "Infos":
Code:
//START// Imports

import java.awt.*;
import java.awt.event.*;
import java.util.*;
import java.io.*;
import java.awt.print.*;
import java.applet.*;
import java.awt.event.MouseEvent.*;
import java.awt.image.*;
import javax.swing.*;
import java.awt.MediaTracker.*;
import javax.swing.colorchooser.*;
import javax.swing.border.LineBorder;
import javax.swing.border.TitledBorder;

//ENDE// Imports

//START//////////
//Class: Infos //
/////////////////
public class Infos extends Frame implements WindowListener, ActionListener {

//START// Deklaratoin der verwendeten Variablen
static Image Info; //Bild der Figuren
Toolkit toolkit = Toolkit.getDefaultToolkit();

//START//Buttons
Button zurück = new Button("Zurück");
//ENDE// Buttons

//ENDE// Deklaration der verwendeten Variablen

public static void main(String[] args) {
Infos b = new Infos();
}

//START// Infos
public Infos() {
super("Spielinfo");

//START// Fenster Einstellungen
this.addWindowListener(this);
this.setLayout(null);
this.setResizable(false);
this.setBounds(330, 150, 500, 450);
this.setBackground(Color.white);
this.setVisible(true);
//ENDE// Fenster Einstellungen

//START// Buttons
zurück.setBackground(Color.LIGHT_GRAY);
zurück.addActionListener(this);
zurück.setBounds(400, 380, 80, 35);
this.add(zurück);
//ENDE// Buttons

//START// Canvas deklarationen
this.add(canv3);
canv3.setSize(500, 450);
canv3.setLocation(0, 0);
canv3.addMouseListener(canv3);
//ENDE// Canvas deklarationen

}

//ENDE// Infos

public void windowActivated(WindowEvent e) {
}

public void windowClosed(WindowEvent e) {
}

public void windowClosing(WindowEvent e) {
System.exit(1);
}

public void windowDeactivated(WindowEvent e) {
}

public void windowDeiconified(WindowEvent e) {
}

public void windowIconified(WindowEvent e) {
}

public void windowOpened(WindowEvent e) {
}

public void actionPerformed(ActionEvent e) {

//START// Button zurück
if (e.getActionCommand().equals("Zurück")) {
this.setVisible(false);

//START// Buttons im Menü einblenden
Game.b1.setVisible(true);
Game.b2.setVisible(true);
Game.b3.setVisible(true);
//ENDE// Buttons im Menü einblenden

}
//ENDE// Button zurück

}

static MyCanvas3 canv3 = new MyCanvas3(); //MyCanvas2 aufrufen

}
//START//////////
//Class: Infos //
/////////////////

--------------------------------------------------------------------
Klasse "Spielfigur":
Code:
//START// Imports

import java.awt.*;
import java.awt.event.*;
import java.util.*;
import java.io.*;
import java.awt.print.*;
import java.applet.*;
import java.awt.event.MouseEvent.*;
import java.awt.image.*;
import javax.swing.*;
import java.awt.MediaTracker.*;
import javax.swing.colorchooser.*;
import javax.swing.border.LineBorder;
import javax.swing.border.TitledBorder;

//ENDE// Imports

//START///////////////
//Class: Spielfigur //
//////////////////////
public class Spielfigur extends Frame implements WindowListener, ActionListener {

//START// Deklaratoin der verwendeten Variablen
Image Figuren; //Bild der Figuren
Toolkit toolkit = Toolkit.getDefaultToolkit();

//START//Buttons
Button fig1 = new Button("1. wählen");
Button fig2 = new Button("2. wählen");
Button fig3 = new Button("3. wählen");
Button fig4 = new Button("4. wählen");
//ENDE// Buttons

//ENDE// Deklaration der verwendeten Variablen

public static void main(String[] args) {
Spielfigur b = new Spielfigur();
}

//START// Spielfigur
public Spielfigur() {
super("Figurauswahl");

//START// Fenster Einstellungen
this.addWindowListener(this);
this.setLayout(null);
this.setResizable(false);
this.setBounds(330, 150, 500, 450);
this.setBackground(Color.white);
this.setVisible(true);
//ENDE// Fenster Einstellungen

//START// Buttons
fig1.setBackground(Color.LIGHT_GRAY);
fig1.addActionListener(this);
fig1.setBounds(50, 370, 80, 35);
this.add(fig1);
fig2.setBackground(Color.LIGHT_GRAY);
fig2.addActionListener(this);
fig2.setBounds(150, 370, 80, 35);
this.add(fig2);
fig3.setBackground(Color.LIGHT_GRAY);
fig3.addActionListener(this);
fig3.setBounds(255, 370, 80, 35);
this.add(fig3);
fig4.setBackground(Color.LIGHT_GRAY);
fig4.addActionListener(this);
fig4.setBounds(360, 370, 80, 35);
this.add(fig4);
//ENDE// Buttons

//START// Canvas deklarationen
this.add(canv2);
canv2.setSize(500, 450);
canv2.setLocation(0, 0);
canv2.addMouseListener(canv2);
//ENDE// Canvas deklarationen

}

//ENDE// Spielfigur

public void windowActivated(WindowEvent e) {
}

public void windowClosed(WindowEvent e) {
}

public void windowClosing(WindowEvent e) {
System.exit(1);
}

public void windowDeactivated(WindowEvent e) {
}

public void windowDeiconified(WindowEvent e) {
}

public void windowIconified(WindowEvent e) {
}

public void windowOpened(WindowEvent e) {
}

public void actionPerformed(ActionEvent e) {

//START// Button fig1
if (e.getActionCommand().equals("1. wählen")) {
Game.figur = 1;
Game.figurgewählt = 1;
this.setVisible(false);
Game.canv.requestFocus(); //Fokus auf canvas setzen
Game.bClip.stop(); //Menümusik stoppen
Game.aClip.play(); //Musik abspielen

//START// Variablen und Einstellungen zum Spiel beginnen
Game.start = 1; //Start auf 1 setzten damit Spiel startet
Game.Endfilm.flush();
Game.fx = 160; //Figur auf Startposition zurück setzen
Game.fy = 320; //Figur auf Startposition zurück setzen
Game.endfilm = 0;
//ENDE// Variablen und Einstellungen zum Spiel beginnen
}
//ENDE// Button fig1

//START// Button fig2
if (e.getActionCommand().equals("2. wählen")) {
Game.figur=2;
Game.figurgewählt = 1;
this.setVisible(false);
Game.canv.requestFocus(); //Fokus auf canvas setzen
Game.bClip.stop(); //Menümusik stoppen
Game.aClip.play(); //Musik abspielen

//START// Variablen und Einstellungen zum Spiel beginnen
Game.start = 1; //Start auf 1 setzten damit Spiel startet
Game.Endfilm.flush();
Game.fx = 160; //Figur auf Startposition zurück setzen
Game.fy = 320; //Figur auf Startposition zurück setzen
Game.endfilm = 0;
//ENDE// Variablen und Einstellungen zum Spiel beginnen
}
//ENDE// Button fig2

//START// Button fig3
if (e.getActionCommand().equals("3. wählen")) {
Game.figur = 3;
Game.figurgewählt = 1;
this.setVisible(false);
Game.canv.requestFocus(); //Fokus auf canvas setzen
Game.bClip.stop(); //Menümusik stoppen
Game.aClip.play(); //Musik abspielen

//START// Variablen und Einstellungen zum Spiel beginnen
Game.start = 1; //Start auf 1 setzten damit Spiel startet
Game.Endfilm.flush();
Game.fx = 160; //Figur auf Startposition zurück setzen
Game.fy = 320; //Figur auf Startposition zurück setzen
Game.endfilm = 0;
//ENDE// Variablen und Einstellungen zum Spiel beginnen

}
//ENDE// Button fig3

//START// Button fig4
if (e.getActionCommand().equals("4. wählen")) {
Game.figur = 4;
Game.figurgewählt = 1;
this.setVisible(false);
Game.canv.requestFocus(); //Fokus auf canvas setzen
Game.bClip.stop(); //Menümusik stoppen
Game.aClip.play(); //Musik abspielen

//START// Variablen und Einstellungen zum Spiel beginnen
Game.start = 1; //Start auf 1 setzten damit Spiel startet
Game.Endfilm.flush();
Game.fx = 160; //Figur auf Startposition zurück setzen
Game.fy = 320; //Figur auf Startposition zurück setzen
Game.endfilm = 0;
//ENDE// Variablen und Einstellungen zum Spiel beginnen

}
//ENDE// Button fig4
}

static MyCanvas2 canv2 = new MyCanvas2(); //MyCanvas2 aufrufen

}
//START///////////////
//Class: Spielfigur //
//////////////////////

--------------------------------------------------------------------
Klasse "MyCanvas":
Code:
//START// Imports

import java.awt.*;
import java.awt.event.*;
import java.util.*;
import java.io.*;
import java.awt.print.*;
import java.applet.*;
import java.awt.event.MouseEvent.*;
import java.awt.image.*;
import javax.swing.*;
import java.awt.MediaTracker.*;
import javax.swing.colorchooser.*;
import javax.swing.border.LineBorder;
import javax.swing.border.TitledBorder;

//ENDE// Imports


//START/////////////
//Class: MyCanvas //
////////////////////
class MyCanvas extends Canvas implements MouseMotionListener, MouseListener,
KeyListener {

//START//Deklarationen der verwendeten Variablen

private Image buffImage; //Variable zum Synchronisieren der Bilder
private Graphics buffG; //Variable zum Synchronisieren der Bilder
Toolkit toolkit = Toolkit.getDefaultToolkit();

//ENDE//Deklarationen der verwendeten Variablen

//START// paint
public void paint(Graphics g) {

//START// Menübild zeichnen
Game.Menuebild = toolkit.getImage("Titelbild.gif");
if (Game.start == 0) {
if (Game.Menuebild != null) {
g.drawImage(Game.Menuebild, 0, 22, this);
}
}
//ENDE// Menübild zeichnen


//START// Grafiken im Spiel zeichnen
if ((Game.start == 1) && (Game.endestart == 0)) {

//START// Hintergrund des Spiels zeichnen
if (Game.Hintergrund != null) {
g.drawImage(Game.Hintergrund, 0, 22, this);
}
//ENDE// Hintergrund des Spiels zeichnen

//START// Figur des Spiels zeichnen
switch (Game.figur) {
case 1:
Game.Figur = toolkit.getImage("Figur1.gif");

break;
case 2:
Game.Figur = toolkit.getImage("Figur2.gif");
break;
case 3:
Game.Figur = toolkit.getImage("Figur3.gif");
break;
case 4:
Game.Figur = toolkit.getImage("Figur4.gif");
break;
default:
}

if (Game.Figur != null) {
if ((Game.ende == 0) && (Game.ducken == 0) &&
(Game.springen == 0)) {
g.drawImage(Game.Figur, Game.fx, Game.fy, this);
}
}
//ENDE// Figur des Spiels zeichnen
}
//ENDE// Grafiken im Spiel zeichnen

//START// Figur duckt sich zeichnen
Game.duck = toolkit.getImage("ducken.gif");
if (Game.ducken == 1) {
if (Game.duck != null) {
g.drawImage(Game.duck, Game.fx, Game.fy, this);
}
}
//ENDE// Figur duckt sich zeichnen

//START// Figur springt zeichnen
Game.spring = toolkit.getImage("jump.gif");
if (Game.springen == 1) {
if (Game.spring != null) {
g.drawImage(Game.spring, Game.fx, Game.fy - 45, this);
}
}
//ENDE// Figur springt zeichnen

//START// Endfilm abspielen
Game.Endfilm = toolkit.getImage("Endsequenz.gif");
if (Game.endfilm == 1) {
Game.aClip.stop(); //Spielmusik stopen
if (Game.Endfilm != null) {
g.drawImage(Game.Endfilm, 0, 22, this);
}
}
//ENDE// Endfilm abspielen
}

//ENDE// paint

//START// Bilder "synchronosieren"
public void update(Graphics g) {
int w = getSize().width;
int h = getSize().height;

if (buffImage == null) {
buffImage = createImage(w, h);
buffG = buffImage.getGraphics();
}
buffG.setColor(getBackground());
buffG.fillRect(0, 0, w, h);
buffG.setColor(getForeground());
paint(buffG);
g.drawImage(buffImage, 0, 0, this);
}

//ENDE// Bilder "synchronosieren"


public void mouseDragged(MouseEvent e) {
}

public void mouseMoved(MouseEvent e) {
}

public void mouseClicked(MouseEvent e) {

//START// Wenn nach Endfilm geklickt wird zurück zum Hauptmenü
if (Game.endfilm == 1) {
Game.endfilm = 0;
Game.endestart = 0;
Game.start = 0;
Game.ende = 0;
Game.b1.setVisible(true);
Game.b2.setVisible(true);
Game.b3.setVisible(true);
Game.bClip.play(); //Menümusik abspielen
}
//ENDE// Wenn nach Endfilm geklickt wird zurück zum Hauptmenü
}

public void mousePressed(MouseEvent e) {
}

public void mouseReleased(MouseEvent e) {
}

public void mouseEntered(MouseEvent e) {
}

public void mouseExited(MouseEvent e) {
}

public void keyPressed(java.awt.event.KeyEvent e) {

//START// Tastendrücke auswerten
Game.gedrückt = e.getKeyChar();
if (e.getKeyCode() == e.VK_RIGHT) { //Wenn -> dann nach rechts
Game.fx = Game.fx + 2;
}
if (e.getKeyCode() == e.VK_LEFT) { //Wenn  Game.fx = Game.fx - 2;
}
if (e.getKeyCode() == e.VK_UP) { //Wenn ^ dann springen
Game.springen = 1;
Game.endespringen = 1;
}
if (e.getKeyCode() == e.VK_DOWN) {
Game.ducken = 1;
Game.endeducken = 1;
}
//START// Wenn Position der Figur gleich Position Stein dann Game Over
if (Game.fx == 140) {
Game.ende = 1;
Game.start = 1;
Game.endestart = 1;
Game.endfilm = 1;

}
//ENDE// Wenn Position der Figur gleich Position Stein dann Game Over
//ENDE// Tastendrücke auswerten
}

public void keyReleased(java.awt.event.KeyEvent e) {
}

public void keyTyped(java.awt.event.KeyEvent e) {
}

}
//ENDE/////////////
//Class: MyCanvas //
////////////////////

--------------------------------------------------------------------
Klasse "MyCanvas 2":
Code:
//START// Imports

import java.awt.*;
import java.awt.event.*;
import java.util.*;
import java.io.*;
import java.awt.print.*;
import java.applet.*;
import java.awt.event.MouseEvent.*;
import java.awt.image.*;
import javax.swing.*;
import java.awt.MediaTracker.*;
import javax.swing.colorchooser.*;
import javax.swing.border.LineBorder;
import javax.swing.border.TitledBorder;

//ENDE// Imports


//START//////////////
//Class: MyCanvas2 //
/////////////////////
class MyCanvas2 extends Canvas implements MouseMotionListener, MouseListener {

//START//Deklarationen der verwendeten Variablen
Toolkit toolkit = Toolkit.getDefaultToolkit();
//ENDE//Deklarationen der verwendeten Variablen

//START// paint
public void paint(Graphics g) {

//START// Figurenauswahl zeichnen
Game.Figurenwahl = toolkit.getImage("Auswahl.jpg");
if (Game.startfigurenwahl == 1) {
if (Game.Figurenwahl != null) {
g.drawImage(Game.Figurenwahl, 0, 22, this);
}
}
//ENDE// Figurenauswahl zeichnen
}

//ENDE// paint
public void mouseDragged(MouseEvent e) {
}

public void mouseMoved(MouseEvent e) {
}

public void mouseClicked(MouseEvent e) {

}

public void mousePressed(MouseEvent e) {
}

public void mouseReleased(MouseEvent e) {
}

public void mouseEntered(MouseEvent e) {
}

public void mouseExited(MouseEvent e) {
}
}
//ENDE///////////////
//Class: MyCanvas2 //
/////////////////////

--------------------------------------------------------------------
Klasse "MyCanvas3":
Code:
//START// Imports

import java.awt.*;
import java.awt.event.*;
import java.util.*;
import java.io.*;
import java.awt.print.*;
import java.applet.*;
import java.awt.event.MouseEvent.*;
import java.awt.image.*;
import javax.swing.*;
import java.awt.MediaTracker.*;
import javax.swing.colorchooser.*;
import javax.swing.border.LineBorder;
import javax.swing.border.TitledBorder;

//ENDE// Imports


//START//////////////
//Class: MyCanvas3 //
/////////////////////
class MyCanvas3 extends Canvas implements MouseMotionListener, MouseListener {

//START//Deklarationen der verwendeten Variablen
Toolkit toolkit = Toolkit.getDefaultToolkit();
//ENDE//Deklarationen der verwendeten Variablen

//START// paint
public void paint(Graphics g) {

//START// Infos zeichnen
Infos.Info = toolkit.getImage("Info.jpg");
if (Infos.Info != null) {
g.drawImage(Infos.Info, 0, 22, this);
}
//ENDE// Infos zeichnen
}

//ENDE// paint
public void mouseDragged(MouseEvent e) {
}

public void mouseMoved(MouseEvent e) {
}

public void mouseClicked(MouseEvent e) {

}

public void mousePressed(MouseEvent e) {
}

public void mouseReleased(MouseEvent e) {
}

public void mouseEntered(MouseEvent e) {
}

public void mouseExited(MouseEvent e) {
}
}
//ENDE///////////////
//Class: MyCanvas3 //
/////////////////////

--------------------------------------------------------------------
Klasse "MyCanvas4":
Code:
//START// Imports

import java.awt.*;
import java.awt.event.*;
import java.util.*;
import java.io.*;
import java.awt.print.*;
import java.applet.*;
import java.awt.event.MouseEvent.*;
import java.awt.image.*;
import javax.swing.*;
import java.awt.MediaTracker.*;
import javax.swing.colorchooser.*;
import javax.swing.border.LineBorder;
import javax.swing.border.TitledBorder;

//ENDE// Imports


//START//////////////
//Class: MyCanvas4 //
/////////////////////
class MyCanvas extends Canvas implements MouseMotionListener, MouseListener,
KeyListener {

//START//Deklarationen der verwendeten Variablen

private Image buffImage; //Variable zum Synchronisieren der Bilder
private Graphics buffG; //Variable zum Synchronisieren der Bilder
Toolkit toolkit = Toolkit.getDefaultToolkit();

//ENDE//Deklarationen der verwendeten Variablen

//START// paint
public void paint(Graphics g) {

//START// Figur des Spiels zeichnen
if (Game.Figur != null) {
if (Game.ende == 0) {
g.drawImage(Game.Figur, Game.fx, Game.fy, this);
}
}
//ENDE// Figur des Spiels zeichnen
}

//ENDE// paint

//START// Bilder "synchronosieren"
public void update(Graphics g) {
int w = getSize().width;
int h = getSize().height;

if (buffImage == null) {
buffImage = createImage(w, h);
buffG = buffImage.getGraphics();
}
buffG.setColor(getBackground());
buffG.fillRect(0, 0, w, h);
buffG.setColor(getForeground());
paint(buffG);
g.drawImage(buffImage, 0, 0, this);
}

//ENDE// Bilder "synchronosieren"


public void mouseDragged(MouseEvent e) {
}

public void mouseMoved(MouseEvent e) {
}

public void mouseClicked(MouseEvent e) {
}

public void mousePressed(MouseEvent e) {
}

public void mouseReleased(MouseEvent e) {
}

public void mouseEntered(MouseEvent e) {
}

public void mouseExited(MouseEvent e) {
}

public void keyPressed(java.awt.event.KeyEvent e) {

//START// Tastendrücke auswerten
Game.gedrückt = e.getKeyChar();
if (e.getKeyCode() == e.VK_RIGHT) { //Wenn -> dann nach rechts
Game.fx = Game.fx + 2;
}
if (e.getKeyCode() == e.VK_LEFT) { //Wenn  Game.fx = Game.fx - 2;
}
if (e.getKeyCode() == e.VK_UP) { //Wenn ^ dann springen
Game.fy = Game.fy - 2;
}
if ((e.getKeyCode() == e.VK_DOWN) && (Game.fy < 320)) {
Game.fy = Game.fy + 2;
}
//START// Wenn Position der Figur gleich Position Stein dann Game Over
if (Game.fx == 140) {
Game.ende = 1;
Game.start = 1;
Game.endestart = 1;
Game.endfilm = 1;

}
//ENDE// Wenn Position der Figur gleich Position Stein dann Game Over
//ENDE// Tastendrücke auswerten
}

public void keyReleased(java.awt.event.KeyEvent e) {
}

public void keyTyped(java.awt.event.KeyEvent e) {
}

}
//ENDE///////////////
//Class: MyCanvas4 //
/////////////////////

lg.Boarder
 
hi,

danke fuer die restlichen dateien. ich habe das programm seit gestern auf meinem notebook laufen und bislang wurde noch kein error geworfen. schreib mir bitte mal was du im spiel bis zum absturz gemacht hast, damit ich den fehler reproduzieren kann.

EDIT:

was mir gerade noch auffaellt ist dieser snippets.

Code:
 public void update(Graphics g) {
int w = getSize().width;
int h = getSize().height;

if (buffImage == null) {
buffImage = createImage(w, h);
buffG = buffImage.getGraphics();
}
buffG.setColor(getBackground());
buffG.fillRect(0, 0, w, h);
buffG.setColor(getForeground());
paint(buffG);
g.drawImage(buffImage, 0, 0, this);
}

du willst damit nicht etwa den hintergrund loeschen damit keine verwaschungen entstehen oder?

gruss tuney
 
Also, ich starte das Programm, wähle eine Spiefigur aus und dann beginnt das Spiel. Es läuft ca. 10 sek, dann verschwindet der Hintergrund und ein OutofMemoryError wird ausgegeben.


Ja, mit diesem Code verhindere ich das die Bilder flimmern und unschöne weiße Striche im Bild entstehen. Ist das keine gute Idee oder gibt es was besseres um dieses Problem zu lösen?

Code:
public void update(Graphics g) {
int w = getSize().width;
int h = getSize().height;

if (buffImage == null) {
buffImage = createImage(w, h);
buffG = buffImage.getGraphics();
}
buffG.setColor(getBackground());
buffG.fillRect(0, 0, w, h);
buffG.setColor(getForeground());
paint(buffG);
g.drawImage(buffImage, 0, 0, this);
}
 
hi,

hmm, das is echt komisch, weil ich mein notebook jetzt 2 tage lang hab laufen lassen. ich hab es auch mit allen figuren und jeglichen moeglichkeiten probiert, die mir dein programm erlaubt. mir sind noch ein paar code stuecke aufgefallen, die man anders realisieren sollte. den thread z.b. den du in der ersten klasse startest, muss verschoben werden, weil er rein logisch nicht dort hingehoert und das programm unnoetig belastet. wenn du solche belastungen an deinem programm feststellen moechtest, dann kannst du den taskmanager unter windows verwenden. der sollte aber nur fuer eine vor-vorerste diagnose verwendet werden.

den code zum loeschen des hintergrunds kann man verkuerzen auf einen aufruf. den code werde ich dir posten sobald ich wieder daheim bin. am wochenende werde ich mich nochmal dransetzen und drueber schaun.

gruss tuney
 
Status
Für weitere Antworten geschlossen.

Ähnliche Themen

S
  • Gesperrt
Antworten
4
Aufrufe
976
C
Antworten
10
Aufrufe
2K
F
Antworten
2
Aufrufe
8K
C
Zurück
Oben Unten