# transparenz per paint()-methode will nicht



## SBehnen27 (12. Apr 2005)

nun will ich doch hier auch mal mein glück versuchen.

für ein flugzeugspiel möchte ich kleine flugzeuge am himmel fliegen lassen.
die bilder sind in gifs gespeichert. alles, ausser den fliegern ist transparent.
der himmel ist eine grafik und soll hinter den fliegern zu sehen sein.

die "aufgabenstellung" ist ganz einfach.
ich möchte eine gif mittels paint methode auf ein JDialog zeichnen. Hinter dem bild liegt ein Hintergrundbild, dass zu sehen sein soll.

imo isses so, dass um den flieger ein weisser kasten gemalt wird. habs sogar mal mit dem grünfilter hier aus dem forum versucht, der ja das grün transparent machen soll. klappt auch ned ;()


bei euch spiele proggern muss das ja shcon mal jemand gemacht haben ^^


----------



## Grizzly (12. Apr 2005)

Der Flieger ist in einem transparenten GIF untergebracht und die Flächen im GIF um den Flieger rum sind transparent? Dann sollte das eigentlich in der Paint-Methode mit g.drawImage(...) funktionieren. Ein bisschen Code wäre in dem Fall ganz hilfreich...


----------



## SBehnen27 (12. Apr 2005)

hier mal der code vom flugzeug.

die bewegung, sprich das repainten kommt aus einem thread "Bewegung"


```
/*
 * Flugzeug.java
 *
 * Created on 1. April 2005, 17:33
 */

package dogfight;
import java.awt.*;
import java.awt.Image.*;
import java.awt.image.*; 
import java.awt.Graphics;
import java.awt.Graphics2D; 
import java.awt.event.*; 
import java.net.*;
import java.io.*;
/**
 *
 * @author Administrator
 */
public class Flugzeug extends Canvas implements Serializable{
    private String name;
    private int posX = 0;
    private int posY = 0;
    private int resetX = 0;
    private int resetY = 0;
    private int richtung = 8;
    private int l_richtung = 8;
    private double geschwindigkeit = 0;
    private boolean aktiv = false;
    private String farbe;
    private int id;
    private String imgPath = "images/"+farbe+"/"+richtung+".gif";
    private Image bild;
    private static Hauptmenue derFrame;
    private static Spielfeld Playground;
    private Bewegung Flug;
    
    private GreenFilter filter;
    
    /** Creates a new instance of Flugzeug */
    public Flugzeug(Hauptmenue derFrame, Spielfeld Playground, String farbe, int id, int posX, int posY) {
        this.derFrame = derFrame;
        this.Playground = Playground;
        this.farbe = farbe;
        this.id = id;
        this.posX=posX;
        this.posY = posY;
        this.richtung = 8;
        this.resetX = posX;
        this.resetY = posY;
        setImg();
    }
    public boolean getAktiv(){
        return aktiv;
    }
    public int getPosX(){
        return posX;
    }
    public int getPosY(){
        return posY;
    }
    public int getResetX(){
        return resetX;
    }
    public int getResetY(){
        return resetY;
    }
    public void setPosX(int arg){
        if (arg > 800){
            System.err.println(arg);
            posX = 0;
        }
        else if (arg < -60){
            posX = 800;
        }
        else
            posX = arg;
    }
    public void setPosY(int arg){
        if (arg>550){
            aktiv = false;  //Abgestürzt
            geschwindigkeit = 0;
            richtung = 8;
            posX = resetX;
            posY = resetY;
            setImg();
            Playground.move(id, true);
        } 
        else
            posY = arg;
    }
    public int getRichtung(){
        return richtung;
    }
    public int getLastRichtung(){
        return l_richtung;
    }
    public void setLastRichtung(){
        l_richtung = richtung;
    }
    public int getId(){
        return id;
    }
    public double getGeschwindigkeit(){
        return geschwindigkeit;
    }
    public String getName(){
        return name;
    }
    public String getImg(){
        return imgPath; 
    }
    public void setImg(){
        imgPath = "images/"+farbe+"/"+richtung+".gif";
        bild=Toolkit.getDefaultToolkit().getImage(imgPath); 
    }
    public void setRichtung(int i){
        richtung = i; 
    }
    public void setGeschwindigkeit(double arg){
        geschwindigkeit = arg;
    }
    public void shoot(){
        Schuss shot = new Schuss(this, Playground, richtung, geschwindigkeit);
        Thread T = new Thread(shot);
        T.start();
    }
    public void steer(char RL){
        if(RL == 'l'){
            if(richtung ==0){
                richtung =15;
            }
            else{
                richtung-=1;
            }
        }
        if(RL == 'r'){
            if(richtung==15){
                richtung = 0;
            }
            else{
                richtung+=1;
            }
        }
        setImg();
        Playground.move(id, false);
    }
    public void fliegen(){
        aktiv = true;
        Flug = new Bewegung(this, Playground);
        Thread T = new Thread(Flug);
        geschwindigkeit=50;
        T.start();
    }

    public void paint(Graphics g){
        g.drawImage(bild, 0, 0, this);
    }
}
```

das Spielfeld Playground is ein JDialog.
im ContentPane ist die Grafik für das Hintergrundbild.


```
package dogfight;


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

public class ContentPane extends JPanel {
   
   private Image pic;
   private int x;
   private int y;
   private String filename;
   
   public void loadImage(String filename, int x, int y){
      
      this.filename = filename;
      this.x = x;
      this.y = y;
      pic = getToolkit().getImage( filename );
                                             
      MediaTracker mt = new MediaTracker( this );
      mt.addImage( pic, 0 );
                         
      try {
           //Warten, bis das Image vollständig geladen ist,
           mt.waitForAll();
      } catch (InterruptedException e) {
           //nothing
      }
 
   }
   
   public void paintComponent(Graphics g){

        if ( pic != null ) {              
           g.drawImage( pic, 0, 0,x,y, this);
        }
   }  // paint 
}
```

hier noch der konstruktor vom Spielfeld:

```
public Spielfeld(java.awt.Frame parent, boolean modal, Hauptmenue derFrame) {
        super(parent, modal);
        initComponents();
        this.derFrame = derFrame;
        ContentPane HG = new ContentPane();
        HG.loadImage("images/Playground.png",800,600);
        HG.setDoubleBuffered(true);
        getContentPane().add(HG);
        HG.setBounds(0,0,800,600); 
        rot.requestFocus();
        rot.addKeyListener(this);
        erzeugeFlieger();
        getContentPane().add(Flieger[0]);
        Flieger[0].setBounds(100,100,60,60);
    }
```


----------



## Grizzly (13. Apr 2005)

Sorry, das ich gestern keine Zeit mehr hatte, Dein Problem anzuschauen. Werd' versuchen, das heute nachzuholen.


----------



## Grizzly (13. Apr 2005)

So, hab' mir jetzt den Code mal angeschaut bzw. halt den Teil, den Du gepostet hast. Den Fehler habe ich nicht gefunden, aber mir ist aufgefallen, dass Du das Programm etwas - naja, sagen wir - merkwürdig aufgebaut hast. Irgendwie hast Du alles als Swing / AWT Komponente programmiert.

Wäre es nicht einfach, nur ein JPanel in das Fenster oder den Dialog einzubauen, auf dem Du dann zeichnest? Die Engine würde dann die repaint() Methode des JPanel aufrufen und dieser würde dann das Spielfeld neu zeichnen. Die Klasse Flugzeug würde einfach nur die Flugzeug-Daten sowie alle Bilder beeinhalten und das jeweilige aktuelle Bild dem JPanel zurückliefern. Für Schüsse & Co. würde das dann entsprechend gelten.
Somit hättest Du nur eine Swing / AWT Klasse und könntest den Rest beliebig programmieren.


----------



## SBehnen27 (13. Apr 2005)

bei weitem nicht alles. da is ja noch einiges mehr, was es da gibt... das sind halt bloss die 3 files, in denen gezeichnet wird...

so langsam bin ich kurz davor zu glauben, dass man gar keine gifs so anzeigen kann, dass das hintergrundbild sichtbar ist  mit ner HG-Farbe klappt das sicherlich ganz hervorragend... nur mit nem HGbild hab ich noch nirgends nen code gefunden


----------



## Grizzly (13. Apr 2005)

Hintergrund Bild mit transparenten Gifs darüber kann man schon zeichnen (selber schon ausprobiert  ). Hast Du mal setOpaque(true) auf die Komponenten angewendet? Ansonsten würde ich das mal wirklich aus den Komponenten raus machen und nur eine Komponente zum Zeichnen verwenden.


----------



## SBehnen27 (13. Apr 2005)

meinst du setOpaque(false) (true wäre nicht transparent) auf die Flieger[0] - [3] anzuwenden?
das geht ned...

hast du nicht noch code schnipsel von deinem erfolgserlebnis diesbezüglich?


----------



## Grizzly (13. Apr 2005)

Das Problem ist, dass diese "Erfolgserlebnisse" komplett anders aussehen. Wenn Du mir mal den kompletten Code+Bilder zukommen lassen könntest, könnte ich Dir mal so eine Version draus basteln. Heisst: Wenn Du willst...


----------



## SBehnen27 (13. Apr 2005)

kein ding. is ja noch ned sooo viel und geheim isses schonmal gar ned.
schreib mir ne mail an sbehnen27@gmx.net 
dann antworte ich drauf mit dem code im anhang.
Hast du netbeans? dann schick ich dir das ganze projekt.


----------



## Grizzly (14. Apr 2005)

So, weiss jetzt zumindest mal, warum das mit der Transparenz bei Deinen Flugzeugen nicht funktioniert. Das liegt daran, dass Du von Canvas ableitest, was wiederrum von Component ableitet. Und diese Komponente kann man nicht transparent machen.

Werd' mal versuchen, das Program umzustellen. Könnte aber 'ne Weile dauern, da Du ja so gut wie alles in AWT/Swing gelöst hast. Hut ab, hätte nicht gedacht, dass man so was so realisieren kann. Bisher habe ich noch nie ein Spiel in AWT/Swing gesehen. Schon wieder etwas schlauer.


----------



## SBehnen27 (14. Apr 2005)

is schon das 2. spiel in swing / awt ^^
das erste war allerdings ne art Kartenspiel im stile von "Magic the Gathering", "Etherlords" oder (weit entfernt) Yu-Gi-Oh...
da hab ich mich auch schon gewundert, warum die transparenz ned geht


----------



## SBehnen27 (8. Mai 2005)

erledigt.
wenn das zu zeichnende objekt statt von Canvas von JComponent erbt, werden transparenzen berücksichtigt.


----------

