Ich kann keine Hühner töten

bene98

Aktives Mitglied
Ich versuche gerade einen Moorhuhn-Klon zu erstellen und kann Hühner über den Bildschirm fliegen lassen.
Eine Zielfernrohr habe ich auch und hab nen Mouse-Listener verknüpft, der mir die Koordinate bei gedrückter-Mouse mitteilt.
Nur würde ich gerne die Hühner entfernen, wenn die Koordinate des Huhn mit der Mouse-Koordinate übereinstimmt.
Das ist erstmal deshalb schwierig, weil ich bräuchte ja eigentlich die Möglichkeit auszulesen, welche Koordinaten das gezeichnete Huhn hat und wenn die Zielfernrohr-Koordinate enthalten ist, sollte das Huhn verschwinden (Aktuell hat das Huhn ja nur eine Koordinate).

Zweitens: Ich habe gelernt, dass man besser nicht in der painComponent-Methode rumspielen soll und da irgendwelche if-Abfragen etc. einbaut. Ist das so richtig, dass man solche Sache besser außerhalb platziert.

Drittens: Macht es Sinn sich von Anfang an mit dem Programmieren verschiedener Threads zu beschäftigen und jedes Huhn in einem eigenen Thread zu programmieren?

Danke. Bleibt gesund und entschuldigt den Titel:)
Code:
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.ArrayList;

import javax.swing.*;
import javax.swing.*;

@SuppressWarnings("serial")

public class EinfacheAnimation implements MouseListener {
    int x = 0;
    int y = 70;
    int x1 = 200;
    int y1 = 25;
    int z;
    Image image7;
    ArrayList<Image> bilder = new ArrayList<>();

    public EinfacheAnimation() {
        Image image = new ImageIcon(
                "C:\\Users\\Benedikt\\Documents\\Wuestenhuhn 0.7\\Wuestenhuhn\\data\\pictures\\animation\\chickenRight\\1.png")
                        .getImage();
        Image image2 = new ImageIcon(
                "C:\\Users\\Benedikt\\Documents\\Wuestenhuhn 0.7\\Wuestenhuhn\\data\\pictures\\animation\\chickenRight\\2.png")
                        .getImage();
        Image image3 = new ImageIcon(
                "C:\\Users\\Benedikt\\Documents\\Wuestenhuhn 0.7\\Wuestenhuhn\\data\\pictures\\animation\\chickenRight\\3.png")
                        .getImage();
        Image image4 = new ImageIcon(
                "C:\\Users\\Benedikt\\Documents\\Wuestenhuhn 0.7\\Wuestenhuhn\\data\\pictures\\animation\\chickenRight\\4.png")
                        .getImage();
        Image image5 = new ImageIcon(
                "C:\\Users\\Benedikt\\Documents\\Wuestenhuhn 0.7\\Wuestenhuhn\\data\\pictures\\animation\\chickenRight\\5.png")
                        .getImage();
        Image image6 = new ImageIcon(
                "C:\\Users\\Benedikt\\Documents\\Wuestenhuhn 0.7\\Wuestenhuhn\\data\\pictures\\animation\\chickenRight\\5.png")
                        .getImage();
        image7 = new ImageIcon(
                "C:\\Users\\Benedikt\\Documents\\Wuestenhuhn 0.7\\Wuestenhuhn\\data\\pictures\\crosshair.png")
                        .getImage();

        bilder.add(image);
        bilder.add(image2);
        bilder.add(image3);
        bilder.add(image4);
        bilder.add(image5);
        bilder.add(image6);
    }

    public static void main(String[] args) {
        EinfacheAnimation gui = new EinfacheAnimation();
        gui.los();
    }

    public void los() {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        MeinZeichenpanel zeichenpanel = new MeinZeichenpanel();
        zeichenpanel.addMouseListener(this);
        frame.getContentPane().add(zeichenpanel);
        frame.setSize(400, 400);
        frame.setVisible(true);

        for (int i = 0; i < 1900; i++) {
            x += 8;
            switch (i % 6) {
            case (0): {
                z = 0;
            }
            case (1): {
                z = 1;
            }
                break;
            case (2): {
                z = 2;
            }
                break;
            case (3): {
                z = 3;
            }
                break;
            case (4): {
                z = 4;
            }
                break;
            case (5): {
                z = 5;
            }
                break;
            }

            try {
                Thread.sleep(50);
            }

            catch (Exception e) {
            }

            zeichenpanel.repaint();
        }
    }

    @SuppressWarnings("serial")

    class MeinZeichenpanel extends JPanel {
        public void paintComponent(Graphics g) {

            g.setColor(Color.white);
            g.fillRect(0, 0, this.getWidth(), this.getHeight());

            g.drawImage(bilder.get(z), x, y, this);

            g.drawImage(bilder.get(z), x / 2, y - 100, this);
            g.drawImage(image7, x1, y1, this);

        }
    }

    @Override
    public void mouseClicked(MouseEvent arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void mouseEntered(MouseEvent arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void mouseExited(MouseEvent arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void mousePressed(MouseEvent e) {
        x1 = e.getX();
        y1 = e.getY();

    }

    @Override
    public void mouseReleased(MouseEvent arg0) {
        // TODO Auto-generated method stub

    }

}
 

MoxxiManagarm

Top Contributor
Das ist erstmal deshalb schwierig, weil ich bräuchte ja eigentlich die Möglichkeit auszulesen, welche Koordinaten das gezeichnete Huhn hat und wenn die Zielfernrohr-Koordinate enthalten ist, sollte das Huhn verschwinden (Aktuell hat das Huhn ja nur eine Koordinate).

Hast du mal überlegt ein Huhn als eigene Komponente in dein Panel zu setzen? Dann kannst du der Huhn-Komponente selbst einen MouseListener für den Klick geben.
 

bene98

Aktives Mitglied
Guten Tag, Nein, dies habe ich bisher nicht bedacht. Was wäre dann der Weg es als Komponente hinzuzufügen ? Über JLabel mit einem Icon.
Grüße
 

bene98

Aktives Mitglied
Kann mir vielleicht jemand helfen und mir sagen, wie ich das Huhn als Komponente dem Panel hinzufügen kann.
Ich kann das machen als Icon von einem Button - nur krieg ich den button dann nicht verschoben
 

mihe7

Top Contributor
Zweitens: Ich habe gelernt, dass man besser nicht in der painComponent-Methode rumspielen soll und da irgendwelche if-Abfragen etc. einbaut. Ist das so richtig, dass man solche Sache besser außerhalb platziert.
Das hat weniger was mit paintComponent zu tun als mit sauberem Code. Unabhängig davon: in paintComponent (oder davon aufgerufenen Methoden) sollen keine Dinge erledigt werden, die viel Zeit in Anspruch nehmen.

Ich kann das machen als Icon von einem Button - nur krieg ich den button dann nicht verschoben
Das Panel baucht dann ein null-Layout und die Position würdest Du mit setLocation bzw. setBounds verändern.
 

bene98

Aktives Mitglied
ja ok, ich werd das auf jeden Fall lesen. Vielleicht finde ich ja dann auch heraus, welche abgeleitete Klasse von JComponent ich benutzen kann
 
K

kneitzel

Gast
Ja, das wirst Du dann auch raus finden. Musst das lesen / lernen nur bis Kapitel 20.6.3 durchhalten. Dann findet Du den Code, den man dir hier vorschlagen wollte und den man mal eben selbst schreiben kann:
Java:
class ImageComponent extends JComponent
{
  private static final long serialVersionUID = 8055865896136562197L;

  private BufferedImage image;

  public void setImage( BufferedImage image )
  {
    this.image = image;
    setPreferredSize( new Dimension(image.getWidth(), image.getHeight()) );
    repaint();
    invalidate();
  }

  @Override
  protected void paintComponent( Graphics g )
  {
    if ( image != null )
      g.drawImage( image, 0, 0, this );
  }
}
(Listing 20.16 einfach einmal kopiert. Wie Du erkennen kannst: Eine einfache Zeile in paintComponent (so man kein null Check hat, weil das z.B. sonst zu einer Exception in dem Konstruktor führen würde...)
 

bene98

Aktives Mitglied
Guten Tag,
Ich habe es nun geschafft, dass ich das Huhn als Komponente zeichen lassen kann.
Um aber verschiedene Hühner zeichnen zu können, müsste ich diese aber einem Panel o.Ä. hinzufügen.
Dies gelingt mir aber bisher nicht. Hat jemand einen Vorschlag? ich habe ein solches Panel bereits erstellt(zeichenpanel Code s.o), ich kann es aber nicht hinzufügen
 

bene98

Aktives Mitglied
Was mache ich falsch?
Code:
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;

import javax.imageio.ImageIO;
import javax.swing.*;
import javax.swing.*;

@SuppressWarnings("serial")

public class EinfacheAnimation implements MouseListener {
    int x = 0;
    int y = 70;
    int x1;
    int y1;
    int z;
    MeinZeichenpanel zeichenpanel;
    ImageComponent imageComponent;
    
    BufferedImage imago1;
    Image image7;
    ArrayList<Image> bilder = new ArrayList<>();

    public EinfacheAnimation() {
        Image image = new ImageIcon(
                "C:\\Users\\Benedikt\\Documents\\Wuestenhuhn 0.7\\Wuestenhuhn\\data\\pictures\\animation\\chickenRight\\1.png").getImage();
        Image image2 = new ImageIcon(
                "C:\\Users\\Benedikt\\Documents\\Wuestenhuhn 0.7\\Wuestenhuhn\\data\\pictures\\animation\\chickenRight\\2.png")
                        .getImage();
        Image image3 = new ImageIcon(
                "C:\\Users\\Benedikt\\Documents\\Wuestenhuhn 0.7\\Wuestenhuhn\\data\\pictures\\animation\\chickenRight\\3.png")
                        .getImage();
        Image image4 = new ImageIcon(
                "C:\\Users\\Benedikt\\Documents\\Wuestenhuhn 0.7\\Wuestenhuhn\\data\\pictures\\animation\\chickenRight\\4.png")
                        .getImage();
        Image image5 = new ImageIcon(
                "C:\\Users\\Benedikt\\Documents\\Wuestenhuhn 0.7\\Wuestenhuhn\\data\\pictures\\animation\\chickenRight\\5.png")
                        .getImage();
        Image image6 = new ImageIcon(
                "C:\\Users\\Benedikt\\Documents\\Wuestenhuhn 0.7\\Wuestenhuhn\\data\\pictures\\animation\\chickenRight\\5.png")
                        .getImage();
        image7 = new ImageIcon(
                "C:\\Users\\Benedikt\\Documents\\Wuestenhuhn 0.7\\Wuestenhuhn\\data\\pictures\\crosshair.png")
                        .getImage();
        Image image8= new ImageIcon ("C:\\Users\\Benedikt\\Documents\\Wuestenhuhn 0.7\\Wuestenhuhn\\data\\pictures\\animation\\chickenLeft\\5.png").getImage();

    
        bilder.add(image);
        bilder.add(image2);
        bilder.add(image3);
        bilder.add(image4);
        bilder.add(image5);
        bilder.add(image6);
        bilder.add(image8);
    }

    public static void main(String[] args) {
        EinfacheAnimation gui = new EinfacheAnimation();
        gui.los();
    }

    public void los() {
        JFrame frame = new JFrame();
        frame.setLayout(new GridLayout(2,2));
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        
         zeichenpanel = new MeinZeichenpanel();
//        zwotesZeichenpanel zeichenpanel2 = new zwotesZeichenpanel();
    

    imageComponent = new ImageComponent();

    
        frame.getContentPane().add(zeichenpanel);
        
        
        zeichenpanel.add(imageComponent);

        

        
        
//        zeichenpanel.add(zeichenpanel2);
    
//        zeichenpanel2.setSize(400,400);
        
        
        
    
        
    frame.setSize(800,800);

    frame.setVisible(true);
    

        for (int i = 0; i < 1900; i++) {
            x += 8;
            switch (i % 6) {
            case (0): {
                z = 0;
            }
            case (1): {
                z = 1;
            }
                break;
            case (2): {
                z = 2;
            }
                break;
            case (3): {
                z = 3;
            }
                break;
            case (4): {
                z = 4;
            }
                break;
            case (5): {
                z = 5;
            }
                
            }
            
            try {
                Thread.sleep(50);
            }
            
            

            catch (Exception e) {
            }
        

            
            

            imageComponent.repaint();
            zeichenpanel.repaint();
            
            
//            zeichenpanel2.repaint();
        }   
    }
    
    
    class ImageComponent extends JComponent implements MouseListener {
        
        
        public ImageComponent() {
            
            setBounds(x1, y, 50, 50);
        try {
            imago1= ImageIO.read(new File("C:\\Users\\Benedikt\\Documents\\Wuestenhuhn 0.7\\Bilder snake\\head.jpg"));
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    
    
            this.addMouseListener(this);
   setPreferredSize( new Dimension(imago1.getWidth(), imago1.getHeight()));
            repaint();
            
            invalidate();}
          
        
         @Override
          protected void paintComponent( Graphics g )
          {
            
                
            
            if ( imago1 != null )
              g.drawImage( imago1, x, y, this );
          }


        @Override
        public void mouseClicked(MouseEvent arg0) {
            // TODO Auto-generated method stub
            
        }


        @Override
        public void mouseEntered(MouseEvent arg0) {
            // TODO Auto-generated method stub
            
        }


        @Override
        public void mouseExited(MouseEvent arg0) {
            // TODO Auto-generated method stub
            
        }


        @Override
        public void mousePressed(MouseEvent arg0) {
            System.out.println("kuh");
            
        }


        @Override
        public void mouseReleased(MouseEvent arg0) {
            // TODO Auto-generated method stub
            
        }


        }
        

    
    class MeinZeichenpanel extends JPanel {
        
public MeinZeichenpanel() {
    this.setLayout(null);
    
}
        public void paintComponent(Graphics g) {
          
    

            g.setColor(Color.white);
            g.fillRect(0, 0, this.getWidth(), this.getHeight());

            g.drawImage(bilder.get(z), x, y, this);
        
            
            
            g.drawImage(image7, x1, y1, this);

        }
    }
    
    
    /*
     * class zwotesZeichenpanel extends JPanel { public void paintComponent
     * (Graphics g) { g.setColor(Color.white);
     *
     *
     * g.fillRect(0, 0, this.getWidth(), this.getHeight());
     * g.drawImage(bilder.get(z), x,y,this);
     *
     *
     *
     *
     *
     * }}
     */

    
    @Override
    public void mouseClicked(MouseEvent arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void mouseEntered(MouseEvent arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void mouseExited(MouseEvent arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void mousePressed(MouseEvent e) {
        System.out.println("duuddelli");

    }

    @Override
    public void mouseReleased(MouseEvent arg0) {
        // TODO Auto-generated method stub

    }
}
 

bene98

Aktives Mitglied
Sollzustand: Kann eine Komponente einem Panel hinzufügen, die sich dann aufgrund einer Veränderung der Koordinaten bewegt und sich mit einem Action_Listener verknüpfen lässt.

Ist-Zustand: Kann es nicht.
 

MoxxiManagarm

Top Contributor
Ich habe dir mal fix ein kleines Beispiel zusammengebastelt. In meinem Beispiel fallen Herzen von oben nach unten und werden auf Klick zerstört.

Java:
public class HeartHitter extends JFrame {

    private static final int SIZE = 500;
    private static final int SPEED = 20;
    private static final int VELOCITY = 1;

    private static final int SPAWN = 1000;
    private static final int FPS = 60;

    private static String IMG_DIR = "...";
    private static Image HEART = new ImageIcon(IMG_DIR + "heart.png").getImage().getScaledInstance(SIZE / 10, SIZE / 10, Image.SCALE_DEFAULT);
    private static Image BACKGROUND = new ImageIcon(IMG_DIR + "background.jpg").getImage().getScaledInstance(SIZE, SIZE, Image.SCALE_DEFAULT);

    public HeartHitter() {
        setTitle("HeartBreaker");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel backgroundPanel = new BackgroundPanel();

        new Timer(SPAWN, e -> {
            backgroundPanel.add(new FallingHeart());
        }).start();

        new Timer(1000 / FPS, e -> {
            backgroundPanel.repaint();
        }).start();

        add(backgroundPanel);

        pack();
    }


    public static void main(String... args) {
        new HeartHitter().setVisible(true);
    }

    class FallingHeart extends JComponent {
        Timer moveMe;

        protected FallingHeart() {
            setBounds(new Rectangle(new Random().nextInt(9 * SIZE / 10), 0, SIZE / 10, SIZE / 10));

            moveMe = new Timer(SPEED, e -> {
                setLocation(getX(), getY() + VELOCITY);

                if (getY() > SIZE) {
                    destroy();
                }
            });
            moveMe.start();

            addMouseListener(new MouseAdapter() {
                @Override
                public void mouseClicked(MouseEvent e) {
                    FallingHeart heart = (FallingHeart)e.getSource();
                    heart.destroy();
                }
            });
        }

        private void destroy() {
            BackgroundPanel background = (BackgroundPanel)getParent();

            moveMe.stop();

            background.remove(this);
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);

            g.drawImage(HEART, 0, 0, this);
        }
    }

    class BackgroundPanel extends JPanel {
        protected BackgroundPanel() {
            setPreferredSize(new Dimension(SIZE, SIZE));
            setLayout(null);
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);

            g.drawImage(BACKGROUND, 0, 0, this);
        }
    }
}
 

bene98

Aktives Mitglied
Danke erstmal für das Beispiel. Hat mir schon geholfen.
Schwierigkeit: Ich kann überall hinklicken, nur nicht auf die Komponente, um das Action Event auszulösen.
Hat es etwas mit setBounds zu tun oder mit dem MouseAdapter den ich nicht richtig verwende.
Code:
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Random;

import javax.imageio.ImageIO;
import javax.swing.*;
import javax.swing.*;

@SuppressWarnings("serial")

public class EinfacheAnimation  {
    int x = 0;
    int y = 70;
    int x1;
    int y1;
    int z;
    MeinZeichenpanel zeichenpanel;
    ImageComponent imageComponent;

    BufferedImage imago1;
    Image image7;
    ArrayList<Image> bilder = new ArrayList<>();

    public EinfacheAnimation()

    {

        try {
            imago1 = ImageIO.read(new File("C:\\Users\\Benedikt\\Documents\\Wuestenhuhn 0.7\\Bilder snake\\head.jpg"));
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        Image image = new ImageIcon(
                "C:\\Users\\Benedikt\\Documents\\Wuestenhuhn 0.7\\Wuestenhuhn\\data\\pictures\\animation\\chickenRight\\1.png")
                        .getImage();
        Image image2 = new ImageIcon(
                "C:\\Users\\Benedikt\\Documents\\Wuestenhuhn 0.7\\Wuestenhuhn\\data\\pictures\\animation\\chickenRight\\2.png")
                        .getImage();
        Image image3 = new ImageIcon(
                "C:\\Users\\Benedikt\\Documents\\Wuestenhuhn 0.7\\Wuestenhuhn\\data\\pictures\\animation\\chickenRight\\3.png")
                        .getImage();
        Image image4 = new ImageIcon(
                "C:\\Users\\Benedikt\\Documents\\Wuestenhuhn 0.7\\Wuestenhuhn\\data\\pictures\\animation\\chickenRight\\4.png")
                        .getImage();
        Image image5 = new ImageIcon(
                "C:\\Users\\Benedikt\\Documents\\Wuestenhuhn 0.7\\Wuestenhuhn\\data\\pictures\\animation\\chickenRight\\5.png")
                        .getImage();
        Image image6 = new ImageIcon(
                "C:\\Users\\Benedikt\\Documents\\Wuestenhuhn 0.7\\Wuestenhuhn\\data\\pictures\\animation\\chickenRight\\5.png")
                        .getImage();
        image7 = new ImageIcon(
                "C:\\Users\\Benedikt\\Documents\\Wuestenhuhn 0.7\\Wuestenhuhn\\data\\pictures\\crosshair.png")
                        .getImage();
        Image image8 = new ImageIcon(
                "C:\\Users\\Benedikt\\Documents\\Wuestenhuhn 0.7\\Wuestenhuhn\\data\\pictures\\animation\\chickenLeft\\5.png")
                        .getImage();

        bilder.add(image);
        bilder.add(image2);
        bilder.add(image3);
        bilder.add(image4);
        bilder.add(image5);
        bilder.add(image6);
        bilder.add(image8);
    }

    public static void main(String[] args) {
        EinfacheAnimation gui = new EinfacheAnimation();
        gui.los();
    }

    public void los() {
        JFrame frame = new JFrame();
        frame.setLayout(new GridLayout(2, 2));
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        zeichenpanel = new MeinZeichenpanel();

        frame.getContentPane().add(zeichenpanel);

        zeichenpanel.add(new ImageComponent());

        frame.setSize(800, 800);

        frame.setVisible(true);

        for (int i = 0; i < 1900; i++) {
            x += 8;
            switch (i % 6) {
            case (0): {
                z = 0;
            }
            case (1): {
                z = 1;
            }
                break;
            case (2): {
                z = 2;
            }
                break;
            case (3): {
                z = 3;
            }
                break;
            case (4): {
                z = 4;
            }
                break;
            case (5): {
                z = 5;
            }

            }

            try {
                Thread.sleep(50);
            }

            catch (Exception e) {
            }
            
            
            zeichenpanel.setSize(800, 800);

            zeichenpanel.repaint();
            

        }
    }

    class ImageComponent extends JComponent  {

        public ImageComponent() {

            setBounds(new Rectangle(800,800));

            
             addMouseListener(new MouseAdapter() {
                    @Override
                    public void mouseClicked(MouseEvent e) {
                        ImageComponent heart = (ImageComponent)e.getSource();
                        heart.destroy();}
            
        

        
            
        
             });}
        protected void destroy() {
    System.out.println("doener macht schöner2");
            
        }
        @Override
        public void paintComponent(Graphics g) {
            super.paintComponent(g);

            g.drawImage(imago1, x, y, this);
        }

        

        

    }

    class MeinZeichenpanel extends JPanel  {

        public MeinZeichenpanel() {
            setLayout(null);

        }

        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.setColor(Color.white);

        }

        
    

      
    
}}
 

MoxxiManagarm

Top Contributor
Dein switchcase ist äquivalent zu z = i % 6

Hat es etwas mit setBounds zu tun oder mit dem MouseAdapter den ich nicht richtig verwende.
Ich sehe damit spontan kein Problem. Dein Beispiel ist aber auch schwer zu durchblicken, bitte formatiere es mit Java Codetags, verbessere die Klammerung und schmeiß die Sachen raus, die momentan keine Verwendung finden.
 

bene98

Aktives Mitglied
hab es versucht zu verbessern. Die Klammerung gerade im Bereich des Mouse-Adapters ist auch weiterhin bescheiden und hier könnte auch das Problem liegen, aber ich kenne keine bessere Lösung

Java:
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;

import javax.imageio.ImageIO;
import javax.swing.*;

@SuppressWarnings("serial")

public class EinfacheAnimation {
    int x = 0;
    int y = 70;
    int z;
    MeinZeichenpanel zeichenpanel;
    BufferedImage imago1;
    ArrayList<Image> bilder = new ArrayList<>();

    public EinfacheAnimation()

    {

        try {
            imago1 = ImageIO.read(new File("C:\\Users\\Benedikt\\Documents\\Wuestenhuhn 0.7\\Bilder snake\\head.jpg"));
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    public static void main(String[] args) {
        EinfacheAnimation gui = new EinfacheAnimation();
        gui.los();
    }

    public void los() {
        JFrame frame = new JFrame();
        frame.setLayout(new GridLayout(2, 2));
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        zeichenpanel = new MeinZeichenpanel();

        frame.getContentPane().add(zeichenpanel);

        zeichenpanel.add(new ImageComponent());

        frame.setSize(800, 800);

        frame.setVisible(true);

        for (int i = 0; i < 1900; i++) {
            z = i % 6;
            x += 8;

            try {
                Thread.sleep(50);
            }

            catch (Exception e) {
            }

            zeichenpanel.setSize(800, 800);

            zeichenpanel.repaint();

        }
    }

    class ImageComponent extends JComponent {

        public ImageComponent() {

            setBounds(new Rectangle(800, 800));

            addMouseListener(new MouseAdapter() {
                @Override
                public void mouseClicked(MouseEvent e) {
                    ImageComponent heart = (ImageComponent) e.getSource();
                    heart.destroy();
                }

            });
        }

        protected void destroy() {
            System.out.println("doener macht schöner2");

        }

        @Override
        public void paintComponent(Graphics g) {
            super.paintComponent(g);

            g.drawImage(imago1, x, y, this);
        }

    }

    class MeinZeichenpanel extends JPanel {

        public MeinZeichenpanel() {
            setLayout(null);

        }

        public void paintComponent(Graphics g) {
            super.paintComponent(g);

        }

    }
}
 

MoxxiManagarm

Top Contributor
Viel besser!! Danke...

Aber ich kann spontan eigentlich kein echtes Problem erkennen. Eventuell ist es ein Zusammenspiel aus dem sleep und repaint
 
K

kneitzel

Gast
Ein paar Anregungen hätte ich noch:

a) Wenn Du eine Methode überschreibst aber dann nichts machst außer die überschriebene Methode aufzurufen: Dann kann der Code auch gelöscht werden. Also dein MeinZeichenpanel::paintComponent kann ganz gelöscht werden, denn der Code macht nichts. (Anders als bei Deine Klasse ImageComponent)

Ansonsten macht Dein Code doch, was er soll. Das Bild wandert und wenn man drauf klickt, dann wird destroy aufgerufen - was natürlich nur ausgibt: doener macht schöner2

b) Aber der Code mutet doch etwas seltsam an - so mit den inneren Klassen die dann auf x und y der parent Klasse zugreifen. Das würde ich auch so nicht machen. Was spricht denn dagegen, jeder Klasse seine eigene Datei zu geben?
Die ImageComponent hat dann eine x und y Koordinate incl. getter/setter. Die Variablen x und y verschwinden in der Hauptklasse. So würde dann langsam ein "Schuh" draus.

c) Dann ist MeinZeichenpanel ein einfaches JPanel. Es hat keinerlei neue Eigenschaften. Lediglich das Layout wurde gesetzt. Das geht dann auch direkt in der Methode los:
Java:
        JPanel panel = new JPanel();
        panel.setLayout(null);
        panel.setSize(800, 800);
        frame.getContentPane().add(panel);

d) Wie man bei dem Code schon sieht: Die Größe wird doch nirgends geändert. Also musst Du die Größe nicht ständig neu setzen sondern es reicht ein einmaliges setzen - daher ist das da hoch gewandert.

e) Wie man bei dem Code in c) ebenfalls sieht: panel wird nur in los() benutzt. Daher reicht es, die Variable als lokale Variable in der Methode zu definieren. Du hast ja auch noch das Frame. Darüber kommst Du ansonsten auch noch an Dein Panel heran.

Dann ist noch offen: Dieses Sleep sollte nicht wirklich im UI Thread statt finden. Das kann man einfach in einem separaten Thread machen ...

Also mit diesen Änderungsvorschlägen würde der Code dann etwas bereinigt so aussehen:
Java:
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;

import javax.imageio.ImageIO;
import javax.swing.*;

@SuppressWarnings("serial")

public class EinfacheAnimation {
    public final static int START_X = 0;
    public final static int START_Y = 70;
    BufferedImage imago1;
    ArrayList<Image> bilder = new ArrayList<>();

    public EinfacheAnimation()
    {
        try {
            imago1 = ImageIO.read(new File("./head.jpg"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        EinfacheAnimation gui = new EinfacheAnimation();
        gui.los();
    }

    public void los() {
        JFrame frame = new JFrame();
        frame.setLayout(new GridLayout(2, 2));
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel panel = new JPanel();
        panel.setLayout(null);
        panel.setSize(800, 800);
        frame.getContentPane().add(panel);
        ImageComponent imageComponent = new ImageComponent(START_X, START_Y, imago1);
        panel.add(imageComponent);
        frame.setSize(800, 800);
        frame.setVisible(true);
        panel.repaint();
        new Thread( () -> {
            for (int i = 0; i < 100; i++) {
                imageComponent.setX(imageComponent.getX() + 8);

                try {
                    Thread.sleep(50);
                } catch (Exception e) { }
                panel.repaint();
            }
        }).start();
    }
}

Java:
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;

public class ImageComponent  extends JComponent {

    int x;
    int y;
    BufferedImage image;

    public int getX() { return x; }
    public void setX(final int x) { this.x = x; }
    public int getY() { return y; }
    public void setY(final int y) { this.y = y; }

    public ImageComponent(int x, int y, BufferedImage image) {
        this.x = x;
        this.y = y;
        this.image = image;

        setBounds(new Rectangle(800, 800));

        addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                ImageComponent heart = (ImageComponent) e.getSource();
                heart.destroy();
            }
        });
    }

    protected void destroy() {
        System.out.println("doener macht schöner2");
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawImage(image, x, y, this);
    }
}

Das einfach einmal auf die Schnelle meine Anmerkungen. Wenn etwas unverständlich ist, dann einfach melden. Und wenn bei Dir etwas nicht geht: Bitte genau angeben, was genau Du erwartest und was genau bei Dir passiert.

Ach ja: Und die Schleife habe ich etwas angepasst. Bei 800 Breite reichen 100 Schritte aus, damit das Bild verschwunden ist ...
 

bene98

Aktives Mitglied
Ich bedanke mich für die Unterstützung. Ich habe weiterhin das Problem (auch wenn ich den kompletten Code von JustNobody übernehme), dass ich überall klicken kann und das Event wird ausgelöst. Ich kann den Bereich verändern auf den ich klicken kann, wenn ich setBounds ändere.
Ich kann sonst höchstens mal versuchen, es auf dem Laptop laufen zu lassen, vielleicht ist es da ja anders.
 
K

kneitzel

Gast
Bisher hast Du ja auch nur einen Click auf dein ImageComponent. Du willst aber doch ein klick auf das Bild.

Das Bild hat width und height, Du hast die Position x und y. Und Du hast im Event den Punkt, auf den geklickt wurde.

Also musst Du einfach nur prüfen: Ist der Punkt aus x und y in dem Rechteck des Bildes?

Also einfügen einer Instanzvariable imageRect von Typ Rectangle.
Im Konstruktor erzeugen mit x, y, breite und Höhe des Bildes
In setX die Location des imageRect setzen.
Und dann im Event Listener einfach prüfen, ob der Punkt des Mausklicks innerhalb des Rechtecks liegt. (Da findest Du bestimmt eine Methode für in Rectangle ... schau Dir einmal die Dokumentation des Klasse an.)
 

MoxxiManagarm

Top Contributor
Ich habe weiterhin das Problem (auch wenn ich den kompletten Code von JustNobody übernehme), dass ich überall klicken kann und das Event wird ausgelöst.
Achso jetzt habe ich dein Problem verstanden, irgendwie stand ich vorher auf dem Schlauch. Die ImageComponent darf nicht so groß sein wie der Hintergrund. Die ImageComponent sollte nur das bewegende Bild selbst sein. Die ImageComponent hat dann eine Position im Hintergrund. Wenn du das so machst dann zählt der Klick auch nur für die ImageComponent. Aktuell ist die ganze ImageComponent deine Zeichenfläche, auf der du nur ein bewegliches Bild malst.
 

MoxxiManagarm

Top Contributor
Ich habe mal ein paar Änderungen vorgenommen

Java:
public class SimpleAnimation {
    DrawPanel zeichenpanel;

    public SimpleAnimation() {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        zeichenpanel = new DrawPanel();

        zeichenpanel.add(new ImageComponent());
        frame.add(zeichenpanel);

        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        new SimpleAnimation();
    }

    class ImageComponent extends JComponent  {
        private int x = 0;
        private int y = 70;

        BufferedImage imago1;

        public ImageComponent() {
            try {
                imago1 = ImageIO.read(new File("...."));
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            setBounds(new Rectangle(x, y, imago1.getWidth(), imago1.getHeight()));

            addMouseListener(new MouseAdapter() {
                @Override
                public void mousePressed(MouseEvent e) {
                    ImageComponent heart = (ImageComponent)e.getSource();
                    heart.destroy();
                }
            });

            new Timer(50, e -> {
                x += 8;
                setLocation(x, y);
                zeichenpanel.repaint();
            }).start();
        }

        protected void destroy() {
            System.out.println("doener macht schöner2");
        }

        @Override
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.drawImage(imago1, 0, 0, this);
        }
    }

    class DrawPanel extends JPanel  {
        public DrawPanel() {
            setPreferredSize(new Dimension(800, 800));
            setLayout(null);
        }

        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.setColor(Color.white);
        }
    }
}
 
K

kneitzel

Gast
Die Idee von @MoxxiManagarm wäre die zweite Variante, die Denkbar ist. Die Frage ist, was man da genau wie haben möchte.

Aber da dann bitte wieder die üblichen Änderungen: DrawPanel kann direkt verschwinden, denn nur für das setLayout und das setPrefferedSize braucht man keine solche Komponente. Also kann man das zeichenpanel direkt zu einem JPanel machen und dann so initialisieren:

Java:
        zeichenpanel = new JPanel();
        zeichenpanel.setPreferredSize(new Dimension(800, 800));
        zeichenpanel.setLayout(null);

Und das mit der inneren Klasse ist weiterhin etwas, das in meinen Augen nicht wirklich Sinn macht.

Wenn man also ImageComponent als Komponente haben will, die nur das Image selbst zeigt, dann wären die zwei Klassen so:
Java:
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;

import javax.imageio.ImageIO;
import javax.swing.*;

@SuppressWarnings("serial")

public class EinfacheAnimation {
    public final static int START_X = 0;
    public final static int START_Y = 0;
    BufferedImage imago1;
    ArrayList<Image> bilder = new ArrayList<>();

    public EinfacheAnimation()
    {
        try {
            imago1 = ImageIO.read(new File("./head.jpg"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        EinfacheAnimation gui = new EinfacheAnimation();
        gui.los();
    }

    public void los() {
        JFrame frame = new JFrame();
        frame.setLayout(new GridLayout(2, 2));
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel panel = new JPanel();
        panel.setLayout(null);
        panel.setSize(800, 800);
        frame.getContentPane().add(panel);
        ImageComponent imageComponent = new ImageComponent(imago1);
        panel.add(imageComponent);
        imageComponent.setLocation(START_X, START_Y);
        frame.setSize(800, 800);
        frame.setVisible(true);
        panel.repaint();

        new Thread( () -> {
            while (imageComponent.getLocation().x < panel.getWidth()) {
                imageComponent.setLocation(imageComponent.getLocation().x  + 8, imageComponent.getY());
                panel.repaint();

                try {
                    Thread.sleep(100);
                } catch (Exception e) { }
            }
        }).start();
    }
}

Java:
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;

public class ImageComponent  extends JComponent {

    BufferedImage image;

    public ImageComponent(BufferedImage image) {
        this.image = image;

        setBounds(new Rectangle(image.getWidth(), image.getWidth()));

        addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                destroy();
            }
        });
    }

    protected void destroy() {
        System.out.println("doener macht schöner2");
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawImage(image, 0, 0, null);
    }
}

Das wäre dann die Umsetzung etwas umgeschrieben....
 
K

kneitzel

Gast
Ich bin mir nicht sicher, wie da die Performance wird. Er wird ja am Ende mehrere fliegende Elemente haben und diverse Anzeigen ...

Daher wäre mein Ansatz generell gewesen, nur eine Komponente zu haben. In einem Thread wird dann im Hintergrund immer die Bewegung gemacht, ein (!) Bild gemalt, das den ganzen Bildschirm darstellt um dann dieses eine Bild nur anzuzeigen.

Das war zumindest mal meine Taktik, also ich in Java ein Spiel geschrieben habe.

Ansonsten ist mir noch durch den Kopf gegangen:
Die destroy Methode und den Handler würde ich aber noch verschieben. Dann ist die Klasse ImageControl wirklich nur ein einfaches Control, das ein Image anzeigt.
Und in der Hauptklasse hat man dann ggf. eine Liste von mehreren Controls. Und über getSource() vom Parameter kann man dann das Control gezielt entfernen (So man es mit mehreren ImagesControls machen würden wonach es dann ja jetzt aussieht.
 

MoxxiManagarm

Top Contributor
Die Performance leidet nicht bei ein paar wenigen Hühnern. Man darf nur nicht den Fehler machen und repaint für jede Bewegung aufrufen. Ich habe typischer Weise in meiner Vergangenheit repaint Timer gebaut und sie auf 60FPS gesetzt.
 

bene98

Aktives Mitglied
hi, ich hab es jetzt mal so gemacht, wie gestern von JustNobody beschrieben. Ich hab das Rectangle allerdings ein wenig vergrößert, weil das Bild so klein ist.
Java:
package moorhuhn;

import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;

import javax.swing.JComponent;

@SuppressWarnings("serial")
public class ImageComponent  extends JComponent {

    int x;
    int y;
    BufferedImage image;
    Rectangle imageRect;

    public int getX() { return x; }
    public void setX(final int x) { this.x = x; imageRect.setLocation(x, y); }
    public int getY() { return y; }
    public void setY(final int y) { this.y = y; }

    public ImageComponent(int x, int y, BufferedImage image) {
    
      
        this.x = x;
        this.y = y;
        this.image = image;

        setBounds(new Rectangle(800,200));
        imageRect = new Rectangle(x,y,image.getWidth()+100, image.getHeight()+100);
        addMouseListener(new MouseAdapter() {
            @Override
            public void mousePressed(MouseEvent e) {
                ImageComponent heart = (ImageComponent) e.getSource();
               int koordx=e.getX();
               int koordy=e.getY();
               if(imageRect.contains(koordx,koordy))
               { heart.destroy();}
            }
        });
    }

    protected void destroy() {
        System.out.println("doener macht schöner2");
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawImage(image, x, y, this);
    }
}
Code:
package moorhuhn;




import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import javax.imageio.ImageIO;
import javax.swing.*;




public class einfacheAnimation2 {
    public final static int START_X = 0;
    public final static int START_Y = 70;
    BufferedImage imago1;
    ArrayList<Image> bilder = new ArrayList<>();

    public einfacheAnimation2()
    {
        try {
            imago1 = ImageIO.read(new File("C:\\Users\\Benedikt\\Documents\\Wuestenhuhn 0.7\\Bilder snake\\head.jpg"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        einfacheAnimation2 gui = new einfacheAnimation2();
        gui.los();
    }

    public void los() {
        JFrame frame = new JFrame();
        frame.setLayout(new GridLayout(2, 2));
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel panel = new JPanel();
        panel.setLayout(null);
        panel.setSize(800, 800);
        frame.getContentPane().add(panel);
        ImageComponent imageComponent = new ImageComponent(START_X, START_Y, imago1);
        panel.add(imageComponent);
        frame.setSize(800, 800);
        frame.setVisible(true);
        panel.repaint();
        new Thread( () -> {
            for (int i = 0; i < 100; i++) {
                imageComponent.setX(imageComponent.getX() + 8);

                try {
                    Thread.sleep(50);
                } catch (Exception e) { }
                panel.repaint();
            }
        }).start();
    }
}
 
Zuletzt bearbeitet:
K

kneitzel

Gast
Ok, da dann nur für die spätere Weiterführung:

Hier ist die Idee, dass ImageComponent dazu da ist, ein Bild zu malen und darzustellen. Dieses Bild besteht aus mehreren Elementen: Hintergrund, fliegende Objekte, die man anklicken kann zum abschießen, .....
Das bedeutet also: Diese ImageComponent hat einiges an Logik, die Du selbst schreiben musst:
- Du kriegst einen Click und musst heraus finden, ob und was getroffen wurde.
+ Der große Vorteil, den ich etwas sehe ist: Du hast die volle Kontrolle und kannst dann Dinge wie Double Buffering anwenden, (Du malst das Bild also nicht mehr langsam in der paintComponent, sondern Du malst immer erst ein Bild fertig und das wird dann in paintComponent nur noch angezeigt.) Das verhindert ein Flackern und so, das ich damals bei mir hatte. (Aber mein Spiel hatte einiges mehr an Elementen anzuzeigen und es ist ca. 20 Jahre her ... Computer sind jetzt etwas leistungsfähiger!)

Wenn @MoxxiManagarm in #40 schreibt, dass die Performance Ihrer Erfahrung nach ausreicht, dann kann es durchaus Sinn machen, die andere Methodik zu verwenden. Gerade unerfahrene Entwickler haben es dann deutlich einfacher. Der große Vorteil ist hier, dass Du nicht mehr die Clicks auswerten musst. Jede Komponente, die man abschießen kann, hat einen Click Handler und da musst Du keine Mauspositionen mehr prüfen oder so.

=> Das war auch der Grund, wieso ich die Idee auch noch einmal als Code aufbereitet habe. Denn Ihre Idee könnte für Dich deutlicher besser geeignet sein!

Den Hintergrund würde ich aber dann nicht über das Panel machen sondern der Hintergrund ist einfach eine ImageComponent mit dem Hintergrundbild (Das musst Du natürlich als erstes hinzu fügen, damit das zu "unterst" ist....

Und der ImageComponent kannst Du den Eventhandler weg nehmen. Da wo Du die Instanz erzeugst kannst Du auch den Click-Handler dazu packen. Dann hast Du eine Stelle, die das Verhalten steuert... Aber das kannst Du natürlich so machen, wie Du möchtest. Das sind nur noch ein paar Anregungen.
 

Blender3D

Top Contributor
Was mache ich falsch?
Das ganze Spiel sollte nur einen JPanel benutzen in dem innerhalb eines Gameloops gezeichnet wird. Hintergrund Hühner etc.
Das bedeutet Imagecomponent sollte ein Methode
Java:
draw(  Graphics g )
besitzen und seine Position und Dimension verwalten.
aber selbst kein JComponent sein. Im Gameloop iterierst Du dann über die Objekte und kannst auf Kollisionen checken. Beim Mouseklick kannst Du ebenfalls mittels Mouseposition und durch iterieren über die Objekte auf einen Treffer checken.
Zum Zeichen kannst Du alles in ein Image schreiben und das dann in paintComponent() zeichnen lassen.;)
 

bene98

Aktives Mitglied
ich habe die Sache jetzt folgendermaßen aufgefasst:
1.) Es gibt die Möglichkeit alles (Hintergrund, Hühner etc) in einem Image zu speichern und dann immer wieder das komplette Bild zeichnen zu lassen. ob etwas getroffen wurde muss man allerdings einzeln prüfen, was mehr Aufwand bedeutet. Es kommt aber eher nicht zu einem Bildflackern, wobei nicht sicher ist, wie
viele Aktionen dafür parallel ausgeführt werden müssten, um die herbeizuführen.
2.) Zweite Möglichkeit:Man kann mehrere Komponenten parallel zeichnen lassen direkt mit einem Event-Händler verknüpfen, weswegen es einfacher ist festzustellen, ob ein Treffer vorliegt.

Ich würde es gerne möglich einfach halten. ich bin noch Anfänger und muss es daher simpel halten und würde dabei gerne was lernen über Java-Konzepte. (ich will kein möglichst perfektes Spiel, sondern eins das größtenteils läuft.)
Ich möchte ja die Anzahl der Hühner, deren Geschwindigkeit, die Flugrichtung, möglicherweise auch deren Entfernung über zufallszahlen berechen lassen. Es geht sicherlich mit beiden Ansätzen, aber wäre das evtl. einfacher, wenn jedes Flugobjekt seinen eigenen Event-Handler hätte?
 

Blender3D

Top Contributor
1.) Es gibt die Möglichkeit alles (Hintergrund, Hühner etc) in einem Image zu speichern und dann immer wieder das komplette Bild zeichnen zu lassen. ob etwas getroffen wurde muss man allerdings einzeln prüfen, was mehr Aufwand bedeutet. Es kommt aber eher nicht zu einem Bildflackern, wobei nicht sicher ist, wie
viele Aktionen dafür parallel ausgeführt werden müssten, um die herbeizuführen.
Der Gameloop könnte in etwa so aussehen. Ist aus einem Snakegame das ich ein wenig refactored hatte aus einem Post im Forum.
https://www.java-forum.org/thema/snake-game-verbessern.187009/#post-1208176

Java:
@Override
    public void run() {
        init();
        long startTime;
        long elapsed;
        long wait;
        while (running) {
            startTime = System.nanoTime();
            update(); // Position aendern Kollision checken
            render(); // Image zeichnen
            repaint(); // paintComonent() zeichnet das Image 1x
            elapsed = System.nanoTime() - startTime;
            wait = targetTime - elapsed / 1000000;
            if (wait > 0) {
                try {
                    Thread.sleep(wait);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }
 

bene98

Aktives Mitglied
Hallo, nun habe ich folgendes Problem. Ich habe nun die Dateien für die Darstellung des Huhn geladen und zwei Hühner sich über den Bildschirm fliegen lassen. Schwierigkeit ist nun, dass die Bewegung verschwommen ist, weil das vorherige Bild nicht gelöscht wird.
Zuvor habe ich es so gemacht, dass ein weißes Rechteck das zusätzlich gezeichnet wurde, alles vorherige gelöscht hat.
Das funktioniert nun aber nicht mehr. Wenn ich das weiße Rechteck zeichnen lasse (in der paintComponent-Methode der Klasse imageComponent)
, dann erhalte ich ein Huhn (die Bilder variieren nicht mehr). Wenn ich es nicht zeichnen lasse, erhalte ich zwei Schlangen mit Hühnern und wechselndem Flügelschlag. Danke
Benedikt


Code:
package moorhuhn;




import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import javax.imageio.ImageIO;
import javax.swing.*;




public class einfacheAnimation2 {
    public final static int START_X = 0;
    public final static int START_Y = 70;
    BufferedImage imago1;
    BufferedImage imago2;
    BufferedImage imago3;
    BufferedImage imago4;
    BufferedImage imago5;
    BufferedImage imago6;
    ImageComponent imageComponent1;
    ImageComponent imageComponent2;
    BufferedImage imago10;
 
    ArrayList<BufferedImage> bilder = new ArrayList<>();

    public einfacheAnimation2()
    {
        try {
            imago1 = ImageIO.read(new File("C:\\Users\\Benedikt\\Documents\\Wuestenhuhn 0.7\\Wuestenhuhn\\data\\pictures\\animation\\chickenRight\\1.png"));
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            imago2 = ImageIO.read(new File("C:\\Users\\Benedikt\\Documents\\Wuestenhuhn 0.7\\Wuestenhuhn\\data\\pictures\\animation\\chickenRight\\2.png"));
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            imago3 = ImageIO.read(new File("C:\\Users\\Benedikt\\Documents\\Wuestenhuhn 0.7\\Wuestenhuhn\\data\\pictures\\animation\\chickenRight\\3.png"));
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            imago4 = ImageIO.read(new File("C:\\Users\\Benedikt\\Documents\\Wuestenhuhn 0.7\\Wuestenhuhn\\data\\pictures\\animation\\chickenRight\\4.png"));
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            imago5 = ImageIO.read(new File("C:\\Users\\Benedikt\\Documents\\Wuestenhuhn 0.7\\Wuestenhuhn\\data\\pictures\\animation\\chickenRight\\5.png"));
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            imago6 = ImageIO.read(new File("C:\\Users\\Benedikt\\Documents\\Wuestenhuhn 0.7\\Wuestenhuhn\\data\\pictures\\animation\\chickenRight\\6.png"));
        } catch (IOException e) {
            e.printStackTrace();}
       
       
        bilder.add(imago1);
        bilder.add(imago2);
        bilder.add(imago3);
        bilder.add(imago4);
        bilder.add(imago5);
        bilder.add(imago6);
    }

    public static void main(String[] args) {
        einfacheAnimation2 gui = new einfacheAnimation2();
        gui.los();
    }

    public void los() {
        JFrame frame = new JFrame();
        frame.setLayout(new GridLayout(2, 2));
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel panel = new JPanel();
        panel.setLayout(null);
        panel.setSize(1000, 1000);
        frame.getContentPane().add(panel);
       
        for (int i=0; i<100; i++) {
        int o= i%6;
        ImageComponent imageComponent = new ImageComponent(START_X, START_Y, bilder.get(o));
        ImageComponent imageComponent2= new ImageComponent(START_X+50, START_Y+80, bilder.get(o));
        panel.add(imageComponent);
        panel.add(imageComponent2);
        frame.setSize(1000, 1000);
        frame.setVisible(true);
        panel.repaint();
        new Thread( () -> {
            for (int k = 0; k < 100; k++) {
                imageComponent.setX(imageComponent.getX() + 8);
                imageComponent2.setX(imageComponent.getX()+8);

                try {
                    Thread.sleep(40);
                } catch (Exception e) { }
                panel.repaint();
            }
        }).start();
       
       
       
    }}}
 

bene98

Aktives Mitglied
Also ich hab mich jetzt mal ein wenig über gameloops belesen. Ich werd das sicher nochmal lesen, man versteht nicht alles sofort. V.a. nicht in Englisch.
Wir hätten also folgende Grundschritte. Den Aspekt der zeitlichen Verzögerung auf unterschiedlichen PCs lasse ich zunächst weg.
Ich habe folgenden Text gelesen: https://gameprogrammingpatterns.com/game-loop.html


Code:
while (true)
{
  processInput();
  update();
  render();
}

Ich müsste also eine weitere Klasse haben, in der ich die quasi das Spiel verwalte. In einer Methode, die processInput() heißen könnte, wird geschaut, wohin der Mauszeiger bewegt wurde.

Update:
Wenn er in dem entsprechenden Rechteck des Huhns liegt, dann muss das Huhn verschwinden. Ansonsten bewegen sich die Hühner auf einer horizontalen Linie weiter.

Unter render() würde es dann vor allem darum gehen, die repaint()_Methode der imageComponent aufzurufen.

habe ich das so annähernd richtig verstanden?
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
krgewb Keine richtige Doku Java Basics - Anfänger-Themen 5
N Interpreter-Fehler Compiler zeigt keine Fehler an, aber das Programm läuft nicht (BlueJ) Java Basics - Anfänger-Themen 2
G Endlosschleife keine Rückgabe Java Basics - Anfänger-Themen 36
Nooobi Regex und .matches() geben keine Ausnahme Java Basics - Anfänger-Themen 10
berserkerdq2 Warum ist das keine Referenzkopie mehr? Java Basics - Anfänger-Themen 26
O Java 17 keine Pflicht um Exceptiones zu behandeln? Java Basics - Anfänger-Themen 2
nbergmann Installation unter jdk.java.net: Keine ZIP-Datei zum entpacken Java Basics - Anfänger-Themen 2
M Eclipse kennt keine String Klasse mehr Java Basics - Anfänger-Themen 1
K Erste Schritte "Taschenrechner" zeigt keine Komma Zahlen an. Java Basics - Anfänger-Themen 8
M Keine Ausführung von System.out.println() Java Basics - Anfänger-Themen 3
H Warum kann man keine Parameter in die main-Methode packen? Java Basics - Anfänger-Themen 4
B Nach eingefügtem Code erkennt Compiler keine Instanzvar und meldet SyntaxError Java Basics - Anfänger-Themen 2
A keine Ergebnisse - String nummer in array nummer converting Java Basics - Anfänger-Themen 1
JavaClap "Bruchrechner" liefert Fehler/keine Ausgabe bei Addition und Subtraktion Java Basics - Anfänger-Themen 0
M Regex nur Zahlen und Punkt zulassen, Keine Eingabe(Leeres TextFeld) nicht zulassen Java Basics - Anfänger-Themen 6
C Ganzzahlige Werte in Boolean ausgeben und überprüfen ob Primzahl oder nicht, wenn es keine Primzahl ist soll es die Primfaktorzerlegung ausgeben Java Basics - Anfänger-Themen 4
I Regex findet keine Treffer Java Basics - Anfänger-Themen 4
B Keine Ausgabe .. Woran liegt das? Ich komme nicht weiter Java Basics - Anfänger-Themen 14
T Bei mir wird keine javac angezeigt sondern nur javacpl Java Basics - Anfänger-Themen 2
R Keine Verbindung mit MariaDB Java Basics - Anfänger-Themen 18
O Input/Output newbile und keine Ahnung! Java Basics - Anfänger-Themen 16
S Kann keine Bilder laden? Java Basics - Anfänger-Themen 9
C Problem: PC ohne Internet und keine Möglichkeit Programme zu laden Java Basics - Anfänger-Themen 5
Bun17 Keine Ausgabe in der Konsole Java Basics - Anfänger-Themen 2
R Keine Verbindung zu MySql über Netbeans Java Basics - Anfänger-Themen 15
D jsoup.select findet keine elemente Java Basics - Anfänger-Themen 2
U Null Exception aber keine Ahnung warum Java Basics - Anfänger-Themen 5
W Was bedeutet im Struktogramm „zufall“ aufrufen (keine Parameterübergabe)? Java Basics - Anfänger-Themen 8
T Keine Ahnung vom Programieren Java Basics - Anfänger-Themen 28
A SelectionSort bringt keine konstanten Ergebnisse Java Basics - Anfänger-Themen 4
J RPN Taschenrechner - keine Lösung!! Java Basics - Anfänger-Themen 84
I equals (Override) mit eigener Exception (keine Runtime-Exception) Java Basics - Anfänger-Themen 9
C Keine javac.exe in bin-Datei Java Basics - Anfänger-Themen 3
A Vollkommene Zahlen: Findet keine Einzige Java Basics - Anfänger-Themen 9
J Input/Output javac HelloWorld.java - Keine Textausgabe in der Konsole Java Basics - Anfänger-Themen 4
H JDK installieren keine Installationsroutine bei Javainstallation sichtbar Java Basics - Anfänger-Themen 4
H Buttons zeigen keine Reaktion Java Basics - Anfänger-Themen 6
I Programm von mir - keine Ahnung mehr ob richtig falsch:-( Java Basics - Anfänger-Themen 6
D Datentypen Datentyperstellung | Kompiler sagt Syntax Error doch ich find keine Lösung Java Basics - Anfänger-Themen 2
snipesss IDE zeigt keine Fehler an, Programm wird jedoch nicht ausgeführt. Java Basics - Anfänger-Themen 18
Khorgoroth Erste Schritte Keine Ausgabe Java Basics - Anfänger-Themen 2
P Listen sortieren mit Binärbaum gibt keine Ausgabe ab 10000 Integern Java Basics - Anfänger-Themen 14
Z AWT package -> keine Konsole? Java Basics - Anfänger-Themen 2
Henri keine Ausgabe Java Basics - Anfänger-Themen 5
J TableView zeigt keine Daten an Java Basics - Anfänger-Themen 14
C Java stellt unter Windows keine Umlaute dar Java Basics - Anfänger-Themen 9
A Keine Konsolenausgabe Java Basics - Anfänger-Themen 5
D Methoden Filewriter macht keine Zeilenumbrüche Java Basics - Anfänger-Themen 3
D Compiler-Fehler NullPointerExeption aber Ecplise zeigt keine Fehler an?! Java Basics - Anfänger-Themen 8
D addActionListener zeigt keine Wirkung Java Basics - Anfänger-Themen 8
S Warum erlaubt ein while-Loop keine Variablen-Declaration wie der for-Loop..? Java Basics - Anfänger-Themen 6
M Lottozahlen 6 aus 49 keine doppelten Java Basics - Anfänger-Themen 5
D Keine Ausgabe in meinem Helden Programm Java Basics - Anfänger-Themen 2
M Keine Ausgabe Java Basics - Anfänger-Themen 4
C PrintWriter schreibt keine in Strings enthaltenen Zeilenumbrüche Java Basics - Anfänger-Themen 9
D Keine Funktion bei "else" Java Basics - Anfänger-Themen 5
J Rückgabe als Wert, keine Referenz Java Basics - Anfänger-Themen 3
K Keine doppelten Zufallszahlen im Array Java Basics - Anfänger-Themen 17
X Einfach verkettete Liste, keine Fehlermeldung Programm friert ein Java Basics - Anfänger-Themen 4
1 Mini Programm, keine Eingabe möglich.. Java Basics - Anfänger-Themen 6
P Wiedereinstieg und kann keine Dateien mehr öffnen... Java Basics - Anfänger-Themen 13
R Keine doppelten Zufallszahlen Java Basics - Anfänger-Themen 2
T Buffererwriter keine Exception obwohl Client weg Java Basics - Anfänger-Themen 2
D Java Eclipse hat scheinbar keine library Java Basics - Anfänger-Themen 2
M Keine Datenbank verbindung Java Basics - Anfänger-Themen 14
E Keine Ausgabe der Konsole Java Basics - Anfänger-Themen 4
Pentalon Eclipse JUNO keine Vorschläge von Methoden bzw. Interfaces der eigenen Klassen Java Basics - Anfänger-Themen 5
tuttle64 Keine Umlaute im Dos Fenster Java Basics - Anfänger-Themen 12
D Erstellte Jar datei zeigt keine Bilder an Java Basics - Anfänger-Themen 5
L Klassen Ich kann keine .jar Dateien mehr öffnen Java Basics - Anfänger-Themen 4
J Haben Chars wirklich keine KeyCodes? Java Basics - Anfänger-Themen 12
L Applet : keine Recht für Zugriff auf Clipboard (trotz Zertifikat) Java Basics - Anfänger-Themen 4
A contains bzw. indexOf liefert keine Treffer? Java Basics - Anfänger-Themen 3
M Java Webstart keine Zugriffe Java Basics - Anfänger-Themen 7
W Eclipse erstellt keine Klassen Java Basics - Anfänger-Themen 6
B Aus einem Eclipse Projekt eine .jar - keine Bilder drin Java Basics - Anfänger-Themen 7
K org.h2.jdbc.JdbcSQLException: Keine Daten verfügbar Java Basics - Anfänger-Themen 9
J Mehrere Zufallszahlen erzeugen, aber keine darf doppelt erzeugt werden - Wie? Java Basics - Anfänger-Themen 5
E String soll mit Großbuchstaben anfangen und keine Sonderzeichen enthalten Java Basics - Anfänger-Themen 4
P Zugriff auf Attribute einer Klasse, zu der keine Verbindung besteht Java Basics - Anfänger-Themen 11
J InputStreamReader + BufferedReader - keine Eingabemöglichkeit Java Basics - Anfänger-Themen 10
T JTable keine spaltenbeschriftung Java Basics - Anfänger-Themen 2
G Input/Output FilenameFilter aber bitte keine Unterordner Java Basics - Anfänger-Themen 5
M nach jar export keine db abfrage möglich Java Basics - Anfänger-Themen 2
G JDK installieren keine eclipse.exe gefunden Java Basics - Anfänger-Themen 16
S Erste Schritte Wo steht eigentlich das ein jar keine andere jars enthalten darf? Java Basics - Anfänger-Themen 19
O Erste Schritte Klassenname zurückgeben, keine instanz Java Basics - Anfänger-Themen 23
K keine Reaktion im TableModel nach ändern der liste? Java Basics - Anfänger-Themen 2
T keine buchstaben!nur zahlen eingabe möglich Java Basics - Anfänger-Themen 48
M keine geschwungenen Klammern Java Basics - Anfänger-Themen 9
E Input/Output Socket bekommt keine Verbindung bei funktionierendem Fremdziel Java Basics - Anfänger-Themen 2
V JavaApplet versendet keine mail Java Basics - Anfänger-Themen 8
B Interface Nach "package"-Nennung keine Toolbar-Icons mehr Java Basics - Anfänger-Themen 5
B Geerbte Instanz kann keine void Methode ausführen?! Java Basics - Anfänger-Themen 15
S Java Web Start lädt keine Bilder Java Basics - Anfänger-Themen 2
P Keine Rechenoperationen bei Doublewert? Java Basics - Anfänger-Themen 4
B Variablen keine Arrayübergabe für getter im Interface Java Basics - Anfänger-Themen 8
I Habe keine Idee was ich als Anfänger programmieren kann. Java Basics - Anfänger-Themen 4
R Kalender speichert keine Zeit Java Basics - Anfänger-Themen 2
A (Scheinbar) keine Schreibrechte in Linux Java Basics - Anfänger-Themen 5

Ähnliche Java Themen

Neue Themen


Oben