PingPongBall wird nicht angezeigt

dichter

Mitglied
Hallo liebe java-forum- community,

aufregung! mein erster Beitrag🙂

zu meinem problem: ich bin gerade dabei ein simples pingpong zu programmieren.
dazu habe folgende Klassen: Display, Ball und die Panels

Mein Problem ist nun, dass ich in der Displayklasse voher folgende Zeile hatte:
g.drawImage(ball, ( PingPong.getXSIZE() / 2 ) - ball.getWidth() , ( PingPong.getYSIZE() / 2 ) - ball.getHeight() , null);
welches mir den ball in der Mitte des spielfeldes angezeigt hatte.

da ich aber für die bewegung des Balls mit xpos und ypos klar machen möchte, wurde
folgende Zeile draus: g.drawImage(ball, ball.xpos, ball.ypos, null);

Nun die panels werden noch angezeigt. der Ball allerdings nicht. Auch eine Ausgabe von ball.xpos und ball.ypos ergibt sinnvolle werte.

hat jemand ne idee woran es liegen könnte, dass die XY-Werte in ordnung sind aber der ball dennnoch nicht gezeichnet wird?

mfg dichter

Java:
import java.awt.Graphics;

import javax.swing.JPanel;

public class Display extends JPanel{
    
    Ball ball;
    Panel panel_player1, panel_player2;
        
    public Display(){
        
        ball = new Ball();
        panel_player1 = new Panel();
        panel_player2 = new Panel();
                    
    }
    
    public void paintComponent(Graphics g){
        
        //Spielfläche
        g.drawRect(0, 0, PingPong.getXSIZE() - 1 , PingPong.getYSIZE() - 1 );
        //Ball
        g.drawImage(ball, ball.xpos, ball.ypos, null);
        System.out.println(ball.xpos + " " + ball.ypos);
        //Panels
        g.drawImage(panel_player1, 0 , ( PingPong.getYSIZE() / 2 ) - panel_player1.getHeight() , null);
        g.drawImage(panel_player2, PingPong.getXSIZE() -  panel_player1.getWidth(), (PingPong.getYSIZE() / 2 ) -  panel_player2.getHeight() , null);
        
    }

Klasse Ball
Java:
import java.awt.image.BufferedImage;
import java.io.IOException;

import javax.imageio.ImageIO;

public class Ball extends BufferedImage {

    public int xpos = 0, ypos = 0;
    public int speed = 3;
    
    public Ball() {
        super(48, 47, BufferedImage.TYPE_INT_ARGB);    
        
        xpos = ( PingPong.getXSIZE() / 2 ) - this.getWidth();
        ypos = ( PingPong.getYSIZE() / 2 ) - this.getHeight();
                
        try {
            ImageIO.read(getClass().getResource("ball.png") );
             
            //weiß transparent machen
            for (int i = 0; i < getWidth() ; i++) {
                for (int j = 0; j < getHeight(); j++) {
            
                    int rgb = getRGB(i, j);
                    
                    int alpha = (rgb & 0xFF000000) >>> 24;
                    int red = (rgb & 0x00FF0000) >>> 16;
                    int green = (rgb & 0x0000FF00) >>> 8;
                    int blue = (rgb & 0x000000FF) >>> 0;
            
                    if (red == 255 && green == 255 && blue == 255) {
                        int new_rgb = (0 << 24) | (red << 16) | (green << 8) | blue;
                        setRGB(i, j, new_rgb);
            
                    }
                }
            }
            
        } catch (IOException e) {
            
            e.printStackTrace();
        }
        
    }
}
 
hä wie in variable gespeichert?


die panelbilder sind ja auch nicht in extra variablen gespeichert und werden angezeigt.
ausserdem dachte ich durch extends bufferedimage ist es doch schon ein bild, welches mit ball = new Ball() erzeugt wird oder irre ich?

mfg dichter
 
Tach,

1. also erstmal solltest du dich informieren, wann man extends benutzt.
Du erweiters das BufferedImage nicht, also sei so gut und speicher das einfach in dem Ball und ruf es danach mit ball.image auf oder mach nen Getter.

2. Das mit dem weiß zu transparent machen geht normalerweise schöner, da du auch direkt in den Pixeln der Images rumfummeln kannst, dann sparst du dir den getRGB und setRGB aufruf welcher auch noch ein wenig Zeit frisst, ist aber nicht wichtig.

3. Was ist PingPong.getXSIZE ?

4. Wo genau das Problem liegt kann ich dir im Moment nicht wirklich sagen.
Aber versuch doch mal folgendes:
Du sagst vorher gings, dann lass das Programm mal laufen, und schau was der dir für Koordinaten ausgibt.
Wenn du findest dass die Koordinate ok sein sollte, dann hardcode sie mal in die drawImage-Methode.
Wenn der Ball dann nicht zu sehen ist, dann weißt du dass die Koordinaten nicht stimmen.

Ach ja, ich denke dass die Koordinaten einfach nicht passen.
z.B PingPong.getXSIZE ist null, dann is das Bild im negativen gerendert...

mfg major
 
Zuletzt bearbeitet:
Ach ja, ich würde dir außerdem davon abraten mit JPanels zu arbeiten, Canvas mit doublebuffering ist wesentlich Performanter.
Wenn du da Probleme mit hast kannst du mich gerne anschreiben, dann leiste ich mal nen bisschen Live-Support.

mfg Major
 
hmm habs nun hinbekommen mit
Java:
this.getGraphics().drawImage(ImageIO.read(getClass().getResource("ball.png")), 0, 0, null);
statt
Java:
ImageIO.read(getClass().getResource("ball.png") );

hab aber heute morgen irgendwas gelesen dass getGraphics nicht gemacht werden sollte. warum auch immer?

zu 1. noch nicht🙂, ich hab mir aber gedacht, dass man das hier vielleicht als grundgerüst für son breakout spiel werden könnte. und wenn ich da die blockfarbe ändern will, wäre es schon gut wenn ich ein bild habe in den ich rumfuschen kann

zu 2. da hast du warscheinlich recht. das stückchen ist von google gemopst

zu 3. PingPong.getXSIZE sollte eigentlich der statische abruf der spielgröße sein, die in der hier nicht geposteten klasse PingPong enthalten ist. ich hab da die final static ints reingemacht

achso wenn ich statt JPanel canvas nehme habe ich in der PingPongklasse( da liegt der frame drin) das problem dass ich setContentPane(display), was ja dann nen canvas wäre, nicht machen kann, vorschläge seitens eclipse mit rootpane und layeredpane hats leider nicht geklappt.

danke dir trotzdem🙂
mfg dichter
 
Zuletzt bearbeitet:
Du hast ganz oben beschrieben dass du nur die Koordinaten der drawImage()-Methode verändet hast, klar funktioniert
Java:
ImageIO.read(getClass().getResource("ball.png") );
nicht, da du da nur ein Bild lädst es aber nirgends Speichers, da müsste dann noch ein this = davor...

Öhm, zu 1:
Du kannst das Image später immer noch verändern, dafür gibt es Reader und ähnliches.

zu 3: Kann ich nicht wissen, wie gesagt habe angenommen dass du nur die Koordinaten verändert hast.

Zu dem Canvas Ding:
Ich kann dir nur raten eine Engine zu nutzen, die funktionieren recht gut und haben meißt schon relativ gute Render-Techniken.
Da kann ich dir als Einsteiger aber leider nichts ans Herz legen, wüsste nicht welche wirklich Anfängerfreundlich ist.
Auf jeden fall is Canvas besser als die JPanels, kannst wenn du willst mal meine Engine anschauen, vielleicht ist die ja was für dich, stehe natürlich für Fragen zur Verfügung.

IndieEngine :
https://bitbucket.org/indieversestudios
Falls du sie ausprobieren willst: Ich bin mir nicht sicher ob IndieEngine II schon fertig war, ich glaube ja, da sind auf jeden Fall auch schon Animationen mit drin.

mfg Major
 
hallo major,

ich hab leider nicht wirklich ne vorstellung davon was eine Engine macht. soweit ich das verstanden habe, handelt es sich um eine ansammlung, die es dem programmierer einfacher machen zb mit xyz.animate() statt erst noch mit schleifen bilderarrays durchlaufen zu müssen.

hatte ganz am anfang mal sone JavaGameGrid (APLU (Aegidius Pluess) Homepagejgamegrid) rum probiert aber irgendwie nicht gecheckt wie mans richtig benutzt🙂
ist das sowas?

mfg dichter
 

Neue Themen


Zurück
Oben