Den Hintergrund loopen

Feeder

Bekanntes Mitglied
Hey ch versuche den Hintergrund meines Spieles, wenn ich den rechten Pfeil drücke zu loopen, sobald man das Leere sehen kann. Ich weiß das dieses Thema schon einmal geschreiben wurde, aber den dortigen Code kann ich nicht auf sinngemess auf meinen übertragen :(

Dieser Code ist meine Klasse die das zwar logischer weise, bewirken müsste, aber nicht so ganz macht. Ich meine die if - Abfrage

Java:
 if(X_Achse >= Old_XAchse + 640){
           x++;
           Old_XAchse+=640;
       }

wird nie ausgeführt.

Dies ist nun meine Klasse in der man alles ordenlichtst verstehen kann weil ich bestimmt sauber habe: :D

Java:
package game2D;

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.ImageIcon;
import javax.swing.JPanel;
import javax.swing.Timer;

public class MiniGame extends JPanel implements ActionListener{
    int Old_XAchse;
    int anzahl = 0;
    Image img;
    int X_Achse;
    int lauf;
    int zaehler;
    int x;
    int z;
    
    public MiniGame(){
        Old_XAchse = X_Achse;
        X_Achse = 0;
        x = 1;
        lauf = 0;
        z = 0;
        setFocusable(true);
        ImageIcon icon = new 
        ImageIcon(this.getClass().getResource("background.jpg"));
        img = icon.getImage();
        addKeyListener(new AL());
        Timer time = new Timer(3, this);
        time.start();
    }
    
    @Override
    public void actionPerformed(ActionEvent e){
     X_Achse = X_Achse + lauf;
     repaint();
    
     
    }
    
    private class AL extends KeyAdapter {
        public AL() {
        
    }
       int taste = 0;
        @Override
       public void keyPressed(KeyEvent e){
       taste = e.getKeyCode();
       if(taste == KeyEvent.VK_LEFT){
           lauf = 1;
       }
       if(taste == KeyEvent.VK_RIGHT){
           lauf = -1;
       }
       }
       
        @Override
       public void keyReleased(KeyEvent e){
           taste = e.getKeyCode();
           if(taste == KeyEvent.VK_LEFT || taste == KeyEvent.VK_RIGHT){
               lauf = 0;
           }
       }
    }
    
    @Override
    public void paint(Graphics g){
       
       super.paint(g);
       Graphics2D fg = (Graphics2D) g;
       if(X_Achse >= Old_XAchse + 640){
           x++;
           Old_XAchse+=640;
       }
       
        
     
           fg.drawImage(img, X_Achse, 0, null);
           fg.drawImage(img, X_Achse + 640 * x, 0, null);
           

           
    }
       
    
    public int getX_Achse(){
        return X_Achse;
        
    }
    }



Danke für die Hilfe von euch :)
 

Joose

Top Contributor
Java:
    public MiniGame(){
        Old_XAchse = X_Achse;
        X_Achse = 0;
        x = 1;
        lauf = 0;
        z = 0;
        setFocusable(true);
        ImageIcon icon = new 
        ImageIcon(this.getClass().getResource("background.jpg"));
        img = icon.getImage();
        addKeyListener(new AL());
        Timer time = new Timer(3, this);
        time.start();
    }

Abgesehen davon, dass die Formatierung des Codes das Lesen erschwert, eine Anregung zum Code:
Du setzt den Wert von
Code:
X_Achse
auf
Code:
Old_XAchse
und danach initialisierst du erst
Code:
X_Achse
?
Worin liegt da die Logik? Bzw. alle
Code:
= 0;
Initialisierungen im Konstruktor kannst du auch weglassen, da 0 der Standard Wert eines Integers ist.

Nun zu deinem eigentlichen Probem:
Möglicherweise arbeitet etwas anders als von dir Gedacht, oder die Attribute haben falsche Werte.
Hast du schon mal den Debugger angeworfen um zu schauen ob er die paint-Methode überhaupt aufruft?
Hast du Log-/Konsolenausgaben eingefügt um zu sehen, welche Wert die Attribute haben? Das sind die 2 Sachen die man bei Problemen als Erstes machen sollte! Meisten löst sich das Problem dadurch von alleine :)
 

Feeder

Bekanntes Mitglied
Hey, ja die Sauberkeit ist wirklich durch einander gerraten :) Das mit der X Achse ist wahrscheinlich durch das tausend - malige Überschreiben passiert.

Die X_Achse habe ich schon öfters abgefragt, werde es jetzt aber nochmal machen :) Die Paint Methode wird durch repaint() aufgerufen und die methode die repaint aufruft durch den Timer :)

Aber es heißt bei mir meistens nicht

if(experiment.fail){

learn();
repeat();

}

sonder

if(true){

learn();
repeat();

}

:D
 

Feeder

Bekanntes Mitglied
Ich habe gerade einen Fehler entdeckt und habe ich behoben, doch nach wie vor steht ich vor dem selben Problem inklusive Bug.


Java:
    public void paint(Graphics g){
       
       super.paint(g);
       Graphics2D fg = (Graphics2D) g;
       if(X_Achse <= Old_XAchse - 640){
           x--;
           Old_XAchse = X_Achse;
       }
       
           fg.drawImage(img, X_Achse, 0, null);
           fg.drawImage(img, X_Achse + (640 * x), 0, null);
      
    }  
    
    public int getX_Achse(){
        return X_Achse;
        
    }
 

Joose

Top Contributor
Wie gesagt baue Konsoleneingaben ein!
Dadurch kannst du mitverfolgen wie sich die Werte ändern, bzw. welche Wert die Attribute bei der Prüfung haben. Dadurch solltest du erkennen wo das Problem liegt.

Meiner Meinung nach sollte es passen, man muss eben nur min 640x in eine Richtung drücken/laufen bis die Bedingung wahr wird.
 

Feeder

Bekanntes Mitglied
Nun klappt es. Danke dir !!!!

Java:
   public void paint(Graphics g){
       
       super.paint(g);
       Graphics2D fg = (Graphics2D) g;
       if(X_Achse <= Old_XAchse - 640){
           x++;
           Old_XAchse = X_Achse;
       }
       
           fg.drawImage(img, X_Achse + (640 * x) - 640, 0, null);
           fg.drawImage(img, X_Achse + (640 * x), 0, null);
      
    }
 

Joose

Top Contributor
Und wo lag das Problem nun? Andere könnten mal ein ähnliches Problem haben, da würde es natürlich helfen wenn man hier nun auch die Lösung inkl.(!) kurzer Erklärung hinschreibt
 

kaoZ

Top Contributor
mal abgesehen davon würde ich einen Hintergrund , insofern er aus einem (Buffered)Image besteht so loopen ,

und dies auch aktiv und nicht passiv über repaint / überschreiben der paint/paintComponent() methoden, da sonst nur das toolkit veranlassen kann das dein Panel/Frame neu gezeichnet wird, und du keinen einfluss darauf hast wann dies passiert, und selbst mit repaint() nur ein neu zeichen anstößt, und auch nicht beeinflussen kannst wann das passiert.

Java:
	@Override
	public void draw(Graphics g){
		g.drawImage(image, (int)x, (int)y, null);
		
		if(x < 0) {
			g.drawImage(image, (int)x + image.getWidth(), (int)y, null);
			if(x < -image.getWidth()) {
				x = -1;
			}
		}
		if(x > 0) {
			g.drawImage(image, (int)x - image.getWidth(), (int)y, null);
			if(x > image.getWidth()) {
				x = 1;
			}
		}
	}

Du zeichnest ein Image, und falls ein Vector gesetzt sein sollte, zeichnest du noch ein Image an der entsprechenden Stelle, dann prüftst du ob schon ein image gezeichnet wurde und setzt die entsprechende koordinate wieder auf einen wert , der veranlasst das wiederholt ein Image gezeichnet wird usw. usw.

Hier kannst du natürlich auch mit der Weite oder Höhe deines Frames/Panels arbeiten welches dein Spiel darstellt, anstatt mit der Größe des Bildes selbst, auch eine Verschiebung auf der y achse könnte man so umsetzen.
 
Zuletzt bearbeitet:

Ähnliche Java Themen

Neue Themen


Oben