supermario problem (kommen nur zahlen raus)

Status
Nicht offen für weitere Antworten.

rellix

Mitglied
Ich bin noch ein Anfänger in Java und habe ein kleines Problem. ich will ein Super Mario Spiel (natürlich nicht das Echte) programmieren und habe ein Code geschrieben, dann wenn ich aber auf den run-button klicke (bei NetBeans) und das Applet startet kommen nur Zahlen in Millionenhöhe dabei heraus. An was könnte das liegen?

Hier der Code:
Code:
public class supermario extends JApplet implements KeyListener, Runnable {

  private int laenge=80, breite=50, xPos=20,yPos=480-laenge-breite;
  Image status0;
  private Image dbImage;
  private Graphics dbg;
  private boolean moveR = false, moveL = false;
  private int l=0,r=0;
    
    private long delta=System.nanoTime();
    
    @Override
    public void init() {
     setSize(640,480);
     status0=getImage(getCodeBase(),"background.jpg");
     this.addKeyListener(this);
    }
    
    @Override
    public void start() {
     Thread th=new Thread(this);
     th.start();        
    }
    
    public void keyTyped(KeyEvent e) {
    
    }
    
    public void keyPressed(KeyEvent e) {
     if(e.getKeyCode()==KeyEvent.VK_A)
     {
     l=5;
     e.consume();        
     }
     {
     r=5;
     e.consume();
     }
     if(e.getKeyCode()==KeyEvent.VK_D)
     {
     moveR = true;
     r = 5;
     }
     {
     moveL = true;
     l = 5;
     }
    }
    
    public void keyReleased(KeyEvent e) {
    if(e.getKeyCode()==KeyEvent.VK_D)
    {
    moveR = false;
    }    
   }
    
    public void run() {
     Thread.currentThread().setPriority(Thread.MIN_PRIORITY);
     while(true)
     {
      try
       {  
         if(1>0) 
         { 
            xPos-=l*(delta/1e9);
            if (!moveL) l--;
         } 
         else if(r>0)
         {
           xPos+=r*(delta/1e9);
           if (!moveR) r--;
         } 
         Thread.sleep(20);
         repaint();
      }
         catch(InterruptedException ex)
         {
            //nothing
         } 
         Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
      }     
     }   
    
    
    @Override
    public void paint(Graphics g) {
        zeichneHeld(g,xPos,yPos,0);
        g.drawString(""+delta,20,20);
    }
    
    public void zeichneHeld(Graphics g,int x, int y,int status)
    {
        g.drawImage(status0, x, y, this);
    }
    
    @Override
    public void update(Graphics g)
    {
    dbImage = createImage (this.getSize().width, this.getSize().height);
    dbg=dbImage.getGraphics();
    dbg.setColor(getBackground());
    dbg.fillRect(0,0,this.getSize().width,this.getSize().height);
    dbg.setColor(getForeground());
    paint(dbg);
    g.drawImage(dbImage, 0, 0, this);
    } 
    
    
   }
[/code]
 

Marco13

Top Contributor
Weil du effektiv System.nanoTime() (also das delta) ausgibst - und das sind sehr schnell viele Millionen.....
 

Quaxli

Top Contributor
Ein paar kleine Änderungsvorschläge, die sich auch etwas auf die Performance auswirken müßten:

Statt:

Code:
    public void update(Graphics g)
    {
    dbImage = createImage (this.getSize().width, this.getSize().height);
    dbg=dbImage.getGraphics();
    dbg.setColor(getBackground());
    dbg.fillRect(0,0,this.getSize().width,this.getSize().height);
    dbg.setColor(getForeground());
    paint(dbg);
    g.drawImage(dbImage, 0, 0, this);
    }

änder mal das so ab:

Code:
    public void update(Graphics g)
    {
    if(dbImage = null){
      dbImage = createImage (this.getSize().width, this.getSize().height);  //<<< create möglichst selten
    }
    dbg=dbImage.getGraphics();
    dbg.setColor(getBackground());
    dbg.fillRect(0,0,getWidth(),getHeight());  //<- getWidht() statt getSize().width
    //dbg.setColor(getForeground());  // <-- das kannst Du weglassen, wenn Du nur Images zeichnest
    paint(dbg);
    g.drawImage(dbImage, 0, 0, this);
    }


Wenn Du Dein Image nicht siehst, können wir das vom Code her schlecht feststellen. Hier solltest Du mal ein paar
System.out.println(...) temporär in Deine Zeichen-Methode einfügen, wo Du z. B. x/y-Position und Breite und Höhe ausgibst. Dann findest Du vielleicht einen Hinweis.
 

Quaxli

Top Contributor
Nochwas zu diesem Stück Code:

Code:
         if(1>0)
         {
            xPos-=l*(delta/1e9);
            if (!moveL) l--;
         }
         else if(r>0)
         {
           xPos+=r*(delta/1e9);
           if (!moveR) r--;
         }


Nachdem der else-Zweig auf r>0 abfragt, sollte die If-Bedinung doch vermutlich auf l>0 (statt 1>0) lauten????
 

rellix

Mitglied
Hallo erstmal
Tut mir leid, dass ich erst so spät antworten kann.

"Wieso benutzt du den System.nanoTime() ?"

Weil ich in einem Spieletutorial gelesen habe, dass dadurch die Figur flüssiger bewegt werden kann.

@quaxli

Dein Tipp hat mir leider nicht viel genützt, denn jetzt kommt eine Fehlermeldung, nämlich die folgende:

init:
deps-jar:
Compiling 1 source file to D:\Büro\Patrick\NetBeansProjects\SuperMario\build\classes
D:\Büro\Patrick\NetBeansProjects\SuperMario\src\supermario\supermario.java:115: incompatible types
found : java.awt.Image
required: boolean
if(dbImage = null){
1 error
BUILD FAILED (total time: 0 seconds)
 

Murray

Top Contributor
rellix hat gesagt.:
Code:
if(dbImage = null){

So ist der Ausdruck eine Zuweisung und hat den Typ der Zuweisung, also ein Image.

Gefragt ist hier aber ein Boole'scher Vergleich, also
Code:
if(dbImage == null){
 

Murray

Top Contributor
rellix hat gesagt.:
"Wieso benutzt du den System.nanoTime() ?"

Weil ich in einem Spieletutorial gelesen habe, dass dadurch die Figur flüssiger bewegt werden kann.

Das würde aber mindestens voraussetzen, dass delta in der Schleife jeweils neu gesetzt wird; etwa so
Code:
while (...) {
  delta = System.nanoTime() - delta;
}

Dann enthält delta die Anzahl von Nanosekunden seit dem letzten Schleifendurchlauf. Daraus kann man über einen konstanten Faktor einen Offset bestimmen, der zur letzten Position hinzuaddiert werden muss, um eine Bewegung mit konstanter Geschwindigkeit zu erreichen, auch wenn die Schleife mal schneller und mal langsamer läuft.

Für den Anfang würde ich das aber weglassen und mit einem konstanten Offset arbeiten.
 

Leroy42

Top Contributor
Quaxli hat gesagt.:
Nochwas zu diesem Stück Code:

Code:
         if(1>0)
         {
            xPos-=l*(delta/1e9);
            if (!moveL) l--;
         }
         else if(r>0)
         {
           xPos+=r*(delta/1e9);
           if (!moveR) r--;
         }

kann man auch verkürzen zu:

Code:
            xPos-=l*(delta/1e9);
            if (!moveL) l--;

Da 1 immer größer als 0 ist

(zumindest im Jahr 2008 noch :cool: )

Falls der Trollversuch gescheitert sein sollte, bitte ignorieren.
 

Quaxli

Top Contributor
Leroy42 hat gesagt.:
Da 1 immer größer als 0 ist

(zumindest im Jahr 2008 noch :cool: )

Das sollte immer noch so sein ;)
Ich vermute aber, daß die "1" ein "l" sein soll. ;)

@rellix:
Bin auch dafür, daß Du mal den aktuelle Code postest -wie von murray gewünscht.
 

rellix

Mitglied
Hier der gewünschte Code:
Code:
package supermario;

import java.awt.*;
import java.net.*;
import java.awt.event.*;
import javax.swing.*;

/**
 *
 * @author Administrator
 */
public class supermario extends JApplet implements KeyListener, Runnable {

  private int laenge=80, breite=50, xPos=20,yPos=480-laenge-breite;
  Image status0;
  private Image dbImage;
  private Graphics dbg;
  private boolean moveR = false, moveL = false;
  private int l=0,r=0;
    
    private long delta=System.nanoTime();
    
    @Override
    public void init() {
     setSize(640,480);
     status0=getImage(getCodeBase(),"background.jpg");
     this.addKeyListener(this);
    }
    
    @Override
    public void start() {
     Thread th=new Thread(this);
     th.start();        
    }
    
    public void keyTyped(KeyEvent e) {
    
    }
    
    public void keyPressed(KeyEvent e) {
     if(e.getKeyCode()==KeyEvent.VK_A)
     {
     l=5;
     e.consume();        
     }
     {
     r=5;
     e.consume();
     }
     if(e.getKeyCode()==KeyEvent.VK_D)
     {
     moveR = true;
     r = 5;
     }
     {
     moveL = true;
     l = 5;
     }
    }
    
    public void keyReleased(KeyEvent e) {
    if(e.getKeyCode()==KeyEvent.VK_D)
    {
    moveR = false;
    }    
   }
    
    public void run() {
     Thread.currentThread().setPriority(Thread.MIN_PRIORITY);
     while(true)
      try
       {  
         if(l>0) 
         { 
            xPos-=l*(delta/1e9);
            if (!moveL) l--;
         } 
         else if(r>0)
         {
           xPos+=r*(delta/1e9);
           if (!moveR) r--;
         } 
         Thread.sleep(20);
         repaint();
      }
         catch(InterruptedException ex)
         {
            //nothing
         }
     while(true) {
        delta = System.nanoTime() - delta; 
     }
         Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
      }     
        
    
    
    @Override
    public void paint(Graphics g) {
        zeichneHeld(g,xPos,yPos,0);
        g.drawString(""+delta,20,20);
    }
    
    public void zeichneHeld(Graphics g,int x, int y,int status)
    {
        g.drawImage(status0, x, y, this);
    }
    
    @Override
    public void update(Graphics g) 
    { 
    if(dbImage == null){ 
      dbImage = createImage (this.getSize().width, this.getSize().height); 
    } 
    dbg=dbImage.getGraphics(); 
    dbg.setColor(getBackground()); 
    dbg.fillRect(0,0,getWidth(),getHeight()); 
    //dbg.setColor(getForeground()); 
    paint(dbg); 
    g.drawImage(dbImage, 0, 0, this); 
    }
    
   }
 

Murray

Top Contributor
Was bezweckst Du mit diesem
Code:
     while(true) {
        delta = System.nanoTime() - delta;
     }
Code in der run-Methode?
Damit hängt der Thread in einer Endlosschleife fest.
 

rellix

Mitglied
Hallo erstmal,

@Murray

ich habe deinen Rat befolgt und den von dir beschriebenen Code rausgelöscht, hat LEIDER NICHTS genützt

Ich bitte weiterhin noch um Hilfe

DANKE schonmal
 

Murray

Top Contributor
Was soll denn dieser Code
Code:
    public void keyPressed(KeyEvent e) {
     if(e.getKeyCode()==KeyEvent.VK_A)
     {
     l=5;
     e.consume();       
     }
     {
     r=5;
     e.consume();
     }
     if(e.getKeyCode()==KeyEvent.VK_D)
     {
     moveR = true;
     r = 5;
     }
     {
     moveL = true;
     l = 5;
     }
    }
bewirken?
 

Quaxli

Top Contributor
Ich hab' mal dran rumgefrickelt, damit es halbwegs läuft. Ist aber stellenweise kein sehr schöner Code, aber Du kriegst hoffentlich in etwa ein Idee, wie man es aufbauen könnte:

Code:
package src;

import java.applet.Applet;
import java.awt.*;
import java.net.*;
import java.awt.event.*;
import java.awt.geom.Rectangle2D;

import javax.swing.*;


// Den Code, den Du ausgesucht hast ist für Applet, nicht JAppelt
// Wenn Du Swing nutezn willt, pack ein JPanel in ein JApplet, dann mußt Du die Doppelbufferung nicht proggen

public class SM extends Applet implements KeyListener, Runnable {

	Image status0;
	private Image dbImage;
	private Graphics dbg;
	private boolean moveR = false, moveL = false;
	private long delta = 0;
	private long last = 0;
	int speed = 100;
	
	Rectangle mario;  //Bildersatz

	@Override
	public void init() {
		setSize(640, 480);
		setBackground(Color.BLACK);
		// jpg habe ich jetzt nicht
		// status0=getImage(getCodeBase(),"background.jpg");
		addKeyListener(this);
		last = System.nanoTime();
		
		mario = new Rectangle(50,50,30,30); //Das ist jetzt mal mein Mario - eigentlich müßte das eine eigene Klasse sein.
	}

	@Override
	public void start() {
		Thread th = new Thread(this);
		th.start();
	}

	public void keyTyped(KeyEvent e) {

	}

	public void keyPressed(KeyEvent e) {
		
		// Steuerung über Boolean, damit auf mehr als eine Taste reagiert werden kann
		if (e.getKeyCode() == KeyEvent.VK_LEFT) {
			moveL = true;
		}

		if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
			moveR = true;
		}
	}

	public void keyReleased(KeyEvent e) {

		if (e.getKeyCode() == KeyEvent.VK_LEFT) {
			moveL = false;
		}

		if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
			moveR = false;
		}

	}

	public void run() {

		while (true){

			//delta auskaspern und last neu setzen
			delta = System.nanoTime() - last;
			last = System.nanoTime();
			
			//Mario bewegen
			moveMario();
			
			//Päuschen
			try{
				Thread.sleep(10);
			} catch (InterruptedException ex) {}
			
			//pinseln
			repaint();
		}
	}
	
	private void moveMario(){
		
		// Der Zugriff auf die Variablen von "Mario" ist so extrem unschön. Üblicherweise läuft das in einer eigenen Methode
		// innerhalb einer eigenen Klasse. Hier nur auf die Schnelle mal so.
		int deltax = (int)(speed*delta/1e9);
		
		if(moveL){
			mario.x-= deltax;
		}
		
		if(moveR){
			mario.x+= deltax;
		}
		
		//Grenzen des Applets checken
		if(mario.x<=0){
			mario.x = 0;
			moveL = false;
		}
		
		if(mario.x+mario.width>=getWidth()){
			mario.x = getWidth()-mario.width;
			moveR = false;
		}
		
	}
	
	

	@Override
	public void paint(Graphics g) {
		g.setColor(Color.RED);
		g.drawRect(mario.x, mario.y, mario.width, mario.height);
		g.drawString("" + delta, 20, 20);
	}


	@Override
	public void update(Graphics g) {
		super.update(g);
		if (dbImage == null) {
			dbImage = createImage(this.getSize().width, this.getSize().height);
		}
		dbg = dbImage.getGraphics();
		dbg.setColor(getBackground());
		dbg.fillRect(0, 0, getWidth(), getHeight());
		// dbg.setColor(getForeground());
		paint(dbg);
		g.drawImage(dbImage, 0, 0, this);
	}

}
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
H Klassen Hilfe bei BlueJ, Supermario Java Basics - Anfänger-Themen 5
K Verständnis Problem bei Server/Client Java Basics - Anfänger-Themen 2
I WildFily - unterschiedliche Libs im Projekt verursachen Problem Java Basics - Anfänger-Themen 11
imocode Vererbung Problem mit Vererbung Java Basics - Anfänger-Themen 2
L Taschenrechner Problem Java Basics - Anfänger-Themen 4
I Applikationsserver (WildFly) - Zugriff auf Ressourcen.. Problem mit Pfade Java Basics - Anfänger-Themen 10
A ScheduledExecutorService problem Java Basics - Anfänger-Themen 7
marcelnedza Problem mit Weltzuweisung, JavaKarol Java Basics - Anfänger-Themen 13
XWing Methoden rückgabe Problem? Java Basics - Anfänger-Themen 6
M Erste Schritte Collatz Problem max int Java Basics - Anfänger-Themen 3
M Problem bei verschachtelter for-Schleife bei zweidimensionalen Arrays Java Basics - Anfänger-Themen 3
C GLOOP Problem beim Erstellen der Kamera Java Basics - Anfänger-Themen 9
nelsonmandela Problem bei Ausgabe einer Switch - Case Funktion Java Basics - Anfänger-Themen 5
frager2345 Problem mit Methode Java Basics - Anfänger-Themen 4
L Problem bei Rechnung mit Math.pow Java Basics - Anfänger-Themen 13
A Thread-Schreibe-Lese-Problem Java Basics - Anfänger-Themen 4
SUPERTJB return Problem Java Basics - Anfänger-Themen 3
sserio BigInteger Problem Java Basics - Anfänger-Themen 4
JordenJost Taschenrechner problem Java Basics - Anfänger-Themen 5
K Problem mit "Random" Java Basics - Anfänger-Themen 5
S Datei anlegen Problem! Groß- und Kleinschreibung wird nicht unterschieden Java Basics - Anfänger-Themen 4
sserio Problem beim Anzeigen Java Basics - Anfänger-Themen 5
xanxk Problem For-Schleife mit Charakter Java Basics - Anfänger-Themen 2
L Unbekanntes Problem mit 2d Array Java Basics - Anfänger-Themen 6
sserio Liste erstellt und ein Problem mit dem Index Java Basics - Anfänger-Themen 8
sserio Schwimmen als Spiel. Problem mit to String/ generate a card Java Basics - Anfänger-Themen 4
J Schleife Problem Java Basics - Anfänger-Themen 2
D Problem mit der Erkennung von \n Java Basics - Anfänger-Themen 2
milan123 das ist meine aufgabe ich hab das problem das bei mir Wenn ich die Richtung der Linien verändern will und drei davon sind richtig, verändere ich die 4 Java Basics - Anfänger-Themen 3
M Verständins Problem bei Aufgabe Java Basics - Anfänger-Themen 4
HeiTim Problem mit der Kommasetzung an der richtigen stelle Java Basics - Anfänger-Themen 59
Temsky34 Problem mit dem Code Java Basics - Anfänger-Themen 17
P Problem mit Calendar.getDisplayName() Java Basics - Anfänger-Themen 8
C Problem mit mehreren Methoden + Scanner Java Basics - Anfänger-Themen 5
P Datei einlesen, nach Begriff filtern und in Datei ausgeben. Problem Standardausgabe über Konsole Java Basics - Anfänger-Themen 19
M Problem mit Klassenverständnis und Button Java Basics - Anfänger-Themen 8
EchtKeineAhnungManchmal hallo habe ein Problem mit einer Datei -> (Zugriff verweigert) Java Basics - Anfänger-Themen 4
H Problem mit Verzweigungen Java Basics - Anfänger-Themen 6
H Problem mit Rückgabewert Java Basics - Anfänger-Themen 7
josfe1234 JAVA FX problem Java Basics - Anfänger-Themen 3
A Code Problem Java Basics - Anfänger-Themen 6
Henri Problem von Typen Java Basics - Anfänger-Themen 7
J Problem mit "ArrayIndexOutOfBoundsException" Java Basics - Anfänger-Themen 11
K jackson Mapping - Problem mit Zeitzonen Java Basics - Anfänger-Themen 10
B Threads Problem mit mehreren Threads Java Basics - Anfänger-Themen 38
I Output BigDecimal anstatt double / Problem beim Rechnen Java Basics - Anfänger-Themen 16
D Schleifen Problem Java Basics - Anfänger-Themen 2
H So viele Fehlermeldungen, dass ich nicht weiß wo das Problem ist. Java Basics - Anfänger-Themen 6
J JAVA-Problem blockiert MEDIATHEKVIEW Java Basics - Anfänger-Themen 13
T Problem mit Lehrzeichen und String bei einfacher Chiffre Java Basics - Anfänger-Themen 8
J extends Problem Java Basics - Anfänger-Themen 2
C Polymorphie-Problem Java Basics - Anfänger-Themen 3
Kalibru Problem bei Ausgabe von Objekt Java Basics - Anfänger-Themen 1
I Format Problem mit Wert - bekomme 0,10 anstatt 10,00 Java Basics - Anfänger-Themen 6
J Problem mit einer Methode die gewissen Inhalt einer Array löschen soll Java Basics - Anfänger-Themen 9
J Problem mit einer Methode, die beliebig viele Objekte in Array speichern soll Java Basics - Anfänger-Themen 6
J Allgemeines Problem mit Klassen Java Basics - Anfänger-Themen 5
U Problem mit dem initialisieren meines Strings in einer Schleife Java Basics - Anfänger-Themen 5
amgadalghabra algorithmisches Problem Java Basics - Anfänger-Themen 19
J Traveling Salesman Problem [Arrays] Java Basics - Anfänger-Themen 9
R ArrayList Problem Java Basics - Anfänger-Themen 6
InfinityDE Problem mit Datenübergabe an Konstruktor Java Basics - Anfänger-Themen 7
C RegEx Problem Java Basics - Anfänger-Themen 4
J Anfänger TicTacToe, Problem bei Gewinnoption, sowohl Unentschieden Java Basics - Anfänger-Themen 8
E Taschenrechner GUI Problem mit Fehlerhandling Java Basics - Anfänger-Themen 6
M Input/Output Fallunterscheidung Problem Java Basics - Anfänger-Themen 17
P Problem beim Überschreiben einer vererbten Methode Java Basics - Anfänger-Themen 4
M Problem bei Ausgabe Java Basics - Anfänger-Themen 7
Splayfer Java Array Problem... Java Basics - Anfänger-Themen 2
G Problem bei der Ausgabe einer Main Claase Java Basics - Anfänger-Themen 7
F Problem mit KeyListener in kombination mit dem ActionListener Java Basics - Anfänger-Themen 4
G Subset sum problem mit Backtracking Java Basics - Anfänger-Themen 18
N Problem mit Scanner Java Basics - Anfänger-Themen 2
J Klassen Problem Java Basics - Anfänger-Themen 8
A Out.format problem. Java Basics - Anfänger-Themen 3
J Problem bei der Programmierung eines Tannenbaums Java Basics - Anfänger-Themen 9
A Array problem Java Basics - Anfänger-Themen 16
2 Taschenrechner mit GUI Problem bei der Berechnung Java Basics - Anfänger-Themen 8
W Remote Method Invocation RMI - Problem Java Basics - Anfänger-Themen 0
I Ich habe ein Problem Java Basics - Anfänger-Themen 3
A Problem bei returnen eines Wertes Java Basics - Anfänger-Themen 6
M Regex Erstellung Problem Java Basics - Anfänger-Themen 2
D Input/Output Problem bei der Benutzereingabe eines Befehls Java Basics - Anfänger-Themen 14
M (Sehr großes Problem) Listen als static in anderen Klassen verwendet Java Basics - Anfänger-Themen 12
F Habe ein problem mit dem ActionListener Java Basics - Anfänger-Themen 3
C Regex-Problem Java Basics - Anfänger-Themen 4
J Problem beim vergleich von zwei Integer Java Basics - Anfänger-Themen 3
M Problem in der Modellierung Java Basics - Anfänger-Themen 20
W Wo ist das URL-Problem ? Java Basics - Anfänger-Themen 1
S Generics-Problem: Class, Class<?>, Class<Object> Java Basics - Anfänger-Themen 4
D FileWriter / FileReader Problem Java Basics - Anfänger-Themen 10
G Problem beim Speichern von Objekten in einer Datei Java Basics - Anfänger-Themen 7
S Compiler-Fehler Exception in thread "main" java.lang.Error: Unresolved compilation problem: Java Basics - Anfänger-Themen 6
J Problem mit Array: 2 Klassen Java Basics - Anfänger-Themen 2
S Collections funktionale Listen (ListNode<E>) review und problem beim clone Java Basics - Anfänger-Themen 0
W OOP Vererbung und Problem bei Zählschleife in einer Methode Java Basics - Anfänger-Themen 10
C Problem mit If Else If und Überprüfung eines Counters Java Basics - Anfänger-Themen 3
F Problem mit Listen Java Basics - Anfänger-Themen 5
I wieder mit einer Umwandelung habe ich Problem (diesmal von char Array zu char) Java Basics - Anfänger-Themen 1
J Problem bei Umrechnung von Hex in Bin Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben