transparenz per paint()-methode will nicht

Status
Nicht offen für weitere Antworten.

SBehnen27

Aktives Mitglied
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

Top Contributor
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

Aktives Mitglied
hier mal der code vom flugzeug.

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

Code:
/*
 * 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.

Code:
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:
Code:
 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

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

Grizzly

Top Contributor
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

Aktives Mitglied
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

Top Contributor
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

Aktives Mitglied
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

Top Contributor
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

Aktives Mitglied
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

Top Contributor
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

Aktives Mitglied
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

Aktives Mitglied
erledigt.
wenn das zu zeichnende objekt statt von Canvas von JComponent erbt, werden transparenzen berücksichtigt.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
L Transparenz wird magenta Spiele- und Multimedia-Programmierung 3
Streeber Problem mit Transparenz/TextDrawing in LWJGL/Slick2d (OpenGL) Spiele- und Multimedia-Programmierung 1
F OpenGL - Transparenz mit Depth Peeling Spiele- und Multimedia-Programmierung 0
aze Java3D:Farbige Flächen verschwinden lassen(Transparenz- oder Colorinterpolator?)) Spiele- und Multimedia-Programmierung 5
BattleMaster246 OpenGL - Transparenz Spiele- und Multimedia-Programmierung 10
I JOGL: Problem mit Blending bei Billboards (Transparenz) Spiele- und Multimedia-Programmierung 2
L Java 3 D - Transparenz einzelner Punkte Spiele- und Multimedia-Programmierung 6
Z Transparenz in BufferedImage Spiele- und Multimedia-Programmierung 8
G Punkt in Image auf Transparenz prüfen Spiele- und Multimedia-Programmierung 6
G Transparenz - Geschwindigkeit Spiele- und Multimedia-Programmierung 3
G png transparenz geschwindigkeitsproblem Spiele- und Multimedia-Programmierung 2
L Skalierung von Bildern mit Transparenz Spiele- und Multimedia-Programmierung 7
S Fehlerhafte Darstellung durch Transparenz? Spiele- und Multimedia-Programmierung 8
D 2 Texturen & transparenz Spiele- und Multimedia-Programmierung 16
A Zeichnen außerhalb der paint-Methode Spiele- und Multimedia-Programmierung 6
S Ping Pong: KeyListener in Paint und while Spiele- und Multimedia-Programmierung 10
M Paint überzeichnet JMenu Spiele- und Multimedia-Programmierung 3
S Poker - grundlegende frage zu paint() Spiele- und Multimedia-Programmierung 10
R 2D Spiel - Level einlesen - Problem mit paint Spiele- und Multimedia-Programmierung 5
G Paint mit Graphics2D? Spiele- und Multimedia-Programmierung 8
B paintComponent Methode Spiele- und Multimedia-Programmierung 4
P Zahlenwert durch Methode ersetzen Spiele- und Multimedia-Programmierung 1
P .Wav Datei vor main-Methode abspielen? Spiele- und Multimedia-Programmierung 9
H Exeption in thread "Thread-2" NullPointerExeption: init methode? Spiele- und Multimedia-Programmierung 25
S GetBufferStrategy-Methode wird nicht angezeigt Spiele- und Multimedia-Programmierung 6
K Flackern bei repaint Methode Spiele- und Multimedia-Programmierung 3
R Aufruf einer render-Methode Spiele- und Multimedia-Programmierung 12
G Methode sleepen während das Spiel weiterläuft Spiele- und Multimedia-Programmierung 3
M Beste methode zur Map Erstellen in "Block" Games Spiele- und Multimedia-Programmierung 2
J Images laden in static Methode Spiele- und Multimedia-Programmierung 8
P NullPointerException bei Aufruf von Methode Spiele- und Multimedia-Programmierung 10
G Mein erstes minigame -> problem mit Methode Spiele- und Multimedia-Programmierung 3
D Problem Mit Miensweeper Clone & rekursive Methode Spiele- und Multimedia-Programmierung 4
M Run- Methode zu überladen Spiele- und Multimedia-Programmierung 4
S Methode verändert mein Eingabe Array oO Spiele- und Multimedia-Programmierung 6
S Problem beim laden eines Bildes in einer Methode Spiele- und Multimedia-Programmierung 14
D Methode in eigenem Thread auslagern Spiele- und Multimedia-Programmierung 9
A Hilfe bei der Methode COLOR (Java) Spiele- und Multimedia-Programmierung 10
H Bilder speichern 2 - Methode richten? Spiele- und Multimedia-Programmierung 2
S Zur Laufzeit auf die Methode einer anderen Klasse zugreifen Spiele- und Multimedia-Programmierung 5
A Methode:setPointAntialiasingEnable(true) Spiele- und Multimedia-Programmierung 2
chik Wie arbeitet die polygon.contains Methode in Java Spiele- und Multimedia-Programmierung 4

Ähnliche Java Themen

Neue Themen


Oben