Ich verstehe nicht, was ich angeben soll



  • Game game = new Game("Game",340,340,50, IUpdatable.class,60, Game.renderable);
    

    hier weiß ich nicht was bei IUpdatable.class und Game.renderable (beides sind nur Platzhalter in diesem Fall) angegeben werden soll.

    Game wurde so initizalisiert:

    public Game(String title, int width, int height, int targetUpdates, IUpdatable updatable, int targetRenders,
    			IRenderable renderable)
    

    Das ist was als Erklärung angegeben wird.

             * @param updatable     das Objekt, dessen
    	 *                      {@linkplain IUpdatable#update(long)}-Methode bei einem
    	 *                      Update aufgerufen werden soll
    	 * @param renderable    das Objekt, dessen
    	 *                      {@linkplain IRenderable#render(Renderer)}-Methode beim
    	 *                      Rendern aufgerufen werden soll
    

    Die Klassen

    public interface IRenderable {
    
    	/**
    	 * Wird beim Rendern aufgerufen.
    	 * @param renderer das Renderer-Objekt, mit dem gezeichnet werden kann
    	 */
    	public void render(Renderer renderer);
    }
    
    public interface IUpdatable {
    
    	/**
    	 * Wird bei einem Update aufgerufen.
    	 * @param elapsedMillis die vergangene Zeit seit dem letzen Update-Aufruf in Millisekunden
    	 */
    	public void update(long elapsedMillis);
    }
    

  • Mod

    Das kann man nicht konkret beantworten. Es geht ja gerade darum, dass du dort einsetzen kannst, was du möchtest, ohne an irgendwelche Vorgaben gebunden zu sein, außer an die (sehr allgemeinen) Interfaces und das abstrakte Konzept, dass Updateable irgendeine Art von auffrischbarem Gamestate darstellen soll, und Renderable irgendwie das Konzept von etwas Darstellbarem umsetzen soll.

    Oder verstehst du nicht, was das überhaupt soll mit Callbacks und Interfaces? Auf der Ebene von Sinn und Zweck ist es genau dafür da, was ich oben gesagt habe, nämlich dass der Nutzer flexibel definieren kann ,was genau passiert. Eine Erklärung auf technischer Ebene ist nicht unbedingt etwas für einen kurzen Forenbeitrag.



  • @Martin1809 sagte in Ich verstehe nicht, was ich angeben soll:

    Die Klassen [IRenderable und IUpdatable]

    Das sind ja genau genommen Interfaces und keine Klassen, von denen man eine Instanz erzeugen kann. Du musst eine eigene Klasse schreiben, die das Interface IRenderable implementiert und dann ein Objekt der Klasse übergeben.

    Genauso bei IUpdateable.

    Du kannst auch direkt in dem Parameter ein anonymes Objekt erstellen: dann steht das sowas wie

    new Game("Game",340,340,50, new IUpdatable() {  
        @Override
        public void update(long elapsedMillis) {
            System.out.println(elapsedMillis);
        }, 60, new IRenderable() {
          @Override 
           public void render(Renderer renderer) {}
        }
    );
    

    (minus Syntaxfehler, mein Java ist auch etwas eingerostet)

    Das ergibt aber natürlich nur kleinen Dingen sinn, ansonsten ist es besser, eine echte Klasse, die implements IIrgendwas, zu nutzen.



  • Also ich habe jetzt IUpdatable und IRenderable in eine eigene Klassen getan

    package de.rub;
    
    import gameCore.IRenderable;
    import gameCore.IUpdatable;
    import gameCore.Renderer;
    
    import java.awt.*;
    import java.awt.image.BufferedImage;
    
    import de.rub.Block;
    
    import javax.swing.*;
    
    public class World {
    
        public static IUpdatable upd(Block block) {
            IUpdatable upd = new IUpdatable() {
                @Override
                public void update(long elapsedMillis) {
                    System.out.println(rend(block));
                }
            };
            return upd;
        }
    
        public static IRenderable rend(Block block) {
            IRenderable rend = new IRenderable() {
                @Override
                public void render(Renderer renderer) {
                        Image player;
                        ImageIcon u2 = new ImageIcon("C:/Users/marti/IdeaProjects/Spieleprojekt/lib/Bilder/player.png");
                        player = u2.getImage();
                        BufferedImage bufferedImage = new BufferedImage(320, 320, BufferedImage.TYPE_INT_RGB);
                        Graphics2D g = (Graphics2D) bufferedImage.getGraphics();
                        g.drawImage(player, 120, 230, 50, 50, null);
    
                        renderer.drawImage((BufferedImage) player, 120, 230, 50, 50);
                }
            };
            return rend;
        }
    }
    

    Und die Klasse Game initialisiert in Main

            new Game("Game",340,340,50,World.upd(new Block().bufferedImage),60,World.rend(new Block()));
    

    Allerdings bekomme ich dann ein ganzen Haufen von Fehleranzeigen, wenn ich versuche das auzuführen

    de.rub.World$2@7d29c386
    de.rub.World$2@382b5247
    de.rub.World$2@4247cbac
    de.rub.World$2@9d9ae20
    Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: class sun.awt.image.ToolkitImage cannot be cast to class java.awt.image.BufferedImage (sun.awt.image.ToolkitImage and java.awt.image.BufferedImage are in module java.desktop of loader 'bootstrap')
    	at de.rub.World$2.render(World.java:37)
    at gameCore.Game.paintComponent(Game.java:105)
    	at java.desktop/javax.swing.JComponent.paint(JComponent.java:1074)
    	at java.desktop/javax.swing.JComponent.paintChildren(JComponent.java:907)
    	at java.desktop/javax.swing.JComponent.paint(JComponent.java:1083)
    	at java.desktop/javax.swing.JComponent.paintChildren(JComponent.java:907)
    	at java.desktop/javax.swing.JComponent.paint(JComponent.java:1083)
    	at java.desktop/javax.swing.JLayeredPane.paint(JLayeredPane.java:586)
    	at java.desktop/javax.swing.JComponent.paintChildren(JComponent.java:907)
    	at java.desktop/javax.swing.JComponent.paintToOffscreen(JComponent.java:5262)
    	at java.desktop/javax.swing.RepaintManager$PaintManager.paintDoubleBufferedImpl(RepaintManager.java:1643)
    	at java.desktop/javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(RepaintManager.java:1618)
    	at java.desktop/javax.swing.RepaintManager$PaintManager.paint(RepaintManager.java:1556)
    	at java.desktop/javax.swing.RepaintManager.paint(RepaintManager.java:1323)
    	at java.desktop/javax.swing.JComponent.paint(JComponent.java:1060)
    	at java.desktop/java.awt.GraphicsCallback$PaintCallback.run(GraphicsCallback.java:39)
    	at java.desktop/sun.awt.SunGraphicsCallback.runOneComponent(SunGraphicsCallback.java:75)
    	at java.desktop/sun.awt.SunGraphicsCallback.runComponents(SunGraphicsCallback.java:112)
    	at java.desktop/java.awt.Container.paint(Container.java:2002)
    	at java.desktop/java.awt.Window.paint(Window.java:3928)
    	at java.desktop/javax.swing.RepaintManager$4.run(RepaintManager.java:876)
    	at java.desktop/javax.swing.RepaintManager$4.run(RepaintManager.java:848)
    	at java.base/java.security.AccessController.doPrivileged(AccessController.java:391)
    	at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
    	at java.desktop/javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:848)
    	at java.desktop/javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:823)
    	at java.desktop/javax.swing.RepaintManager.prePaintDirtyRegions(RepaintManager.java:772)
    	at java.desktop/javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1884)
    	at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:316)
    	at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:770)
    	at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721)
    	at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:715)
    	at java.base/java.security.AccessController.doPrivileged(AccessController.java:391)
    	at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
    	at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:740)
    	at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
    	at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
    	at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
    	at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
    	at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
    	at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
    de.rub.World$2@3a5f696e
    

    Was habe ich falsch gemacht?



  • @Martin1809 sagte in Ich verstehe nicht, was ich angeben soll:

    Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: class sun.awt.image.ToolkitImage cannot be cast to class java.awt.image.BufferedImage (sun.awt.image.ToolkitImage and java.awt.image.BufferedImage are in module java.desktop of loader 'bootstrap')
    	at de.rub.World$2.render(World.java:37)
    

    Sieh' Dir die genannte Zeile (37 in World.java) an.



  • @Swordfish Weißt du wie ich das Problem lösen kann, den ich finde nichts im Internet


  • Mod

    @Martin1809 sagte in Ich verstehe nicht, was ich angeben soll:

    @Swordfish Weißt du wie ich das Problem lösen kann, den ich finde nichts im Internet

    Wirklich? Ich habe im Leben nie Java programmiert und habe keine 15 Sekunden gebraucht, zig Lösungen zu finden. Indem man einfach die Wörter googelt. Du hast einfach nur nichts gemacht. Wieso behauptest du dann etwas anderes?



  • Mit "Sieh dir ... an" kann im Zweifelsfall auch "Poste ... hier und wir erklären dir was da schief läuft" gemeint sein. Nur eins ist klar, ohne den Code an der Stelle zu kennen, kann hier wahrscheinlich niemand erraten, was du falsch machst.


  • Mod

    Er hat es gepostet, geht in dem Roman etwas unter:
    Zeile 37

    renderer.drawImage((BufferedImage) player, 120, 230, 50, 50);
    

    und Meldung

    class sun.awt.image.ToolkitImage cannot be cast to class java.awt.image.BufferedImage (sun.awt.image.ToolkitImage and java.awt.image.BufferedImage are in module java.desktop of loader 'bootstrap')
    	at de.rub.World$2.render(World.java:37)
    

    Google findet buchstäblich tausende Ergebnisse zur Konvertierung von ToolkitImage nach BufferedImage, selbst wenn man bloß die beiden Wörter sucht.



  • Ups. Ich hab sogar 2mal gesucht und es nicht gesehen 😕



  • Da doch schon im Code ein BufferedImage erzeugt wird (aus dem player-Image) ist die Lösung doch offensichlich: einfach diese Variable benutzen!



  • @Th69 Danke, so funktioniert es.



  • Ich habe ganz viele antworten mit TollkitImage gefunden, allerdings wird bei mir immer "Create Type parameter 'ToolkitImage' angezeigt und wenn ich 'java.awt.Toolkit' importiere, wird es immer noch so angezeigt.
    Bei manchen habe ich auch 'import java.awt.ToolkitImage' gesehen allerdings gibt es das bei mir nicht, weiß jemand wie so?



  • @Martin1809

    Ich kenne die Bib nur als sun.awt.image.ToolkitImage, gibts glaub ich aber in der open JDK nicht.


Anmelden zum Antworten