sprites mit mit transparentem back zeichnen

  • Themenstarter Themenstarter coolerouny
  • Beginndatum Beginndatum
C

coolerouny

morgen!

ich wollte euch fragen ob wer ein example hat; wo ein sprite gezeichnet wird, aber so dass man den umriss nicht sieht
d.h wenn man im paint irgendwo im bild einen kreis zeichnet, dass dann beim gezeichneten bild in der applikation dann nur der kreis is und nicht der weiße(oder irgendeine farbe) rest.

hab schon überrall auf google gschaut da hams irgendwie auch nix

mfg
coolerouny!
 
Hallo!

am einfachsten ist es, wenn du das "sprite" nicht mit Paint sondern beispielsweise mit Paint Shop pro erstellst, den Hintergrund transparent machst und das ganze als gif oder png speicherst. Eine andere Möglichkeit bestünde darin für alle Sprites eine bestimmte Farbe als Transaprent zu definieren und die später geladenen Bilder mittels eines ImageFilters so zu bearbieten, dass die "bestimmte" Farbe den höchsten Transparenzwert erhält.

Gruß Tom
 
morgen!

kann ich vl irgendwie abfragen welche farbe ein einzelner pixel eines bildes hat (also zb der ganz oben links)

und dann alle die die gleiche farbe haben zeichnet man nicht?

mfg
coolerouny
 
Hallo!

Ja. Die Klasse BufferedImage bietet beispielsweise die Methode
int getRGB(int x, int y)

Weiterhin könntest du dann mit einem java.awt.image.RGBImageFilter deine Transparenzaktion implementieren. Aber wie gesagt, der weg über transparente png's bzw. gif's ist viiiiiiel einfacher...

Gruß Tom
 
Ich hab hier ein Beispiel aus einem Spiel, wo ich eben transparente *.gif's verwendet habe.
Also hier wird Hintergrund (bg rED, gREEN, bLUE) und Vodergrund(fg r, g, b) berechnet.

Code:
            int bg_r = (super._pxl[idx + pos] >> 16) & 0xFF;
            int bg_g = (super._pxl[idx + pos] >> 8) & 0xFF;
            int bg_b = (super._pxl[idx + pos] >> 0) & 0xFF;

            int fg_a = (pxl[idx] >> 24) & 0xFF;
            int fg_r = (pxl[idx] >> 16) & 0xFF;
            int fg_g = (pxl[idx] >> 8) & 0xFF;
            int fg_b = (pxl[idx] >> 0) & 0xFF;

            bg_r += ((fg_r - bg_r) * fg_a + fg_r) >> 8;
            bg_g += ((fg_g - bg_g) * fg_a + fg_g) >> 8;
            bg_b += ((fg_b - bg_b) * fg_a + fg_b) >> 8;

            super._pxl[idx + pos] = new Color(bg_r, bg_g, bg_b).getRGB();

Und hier meine Sprite-Klasse:

Code:
class Sprite {

    private int pxl[];
    private int width;
    private int height;

    Sprite() {
    }

    Sprite(Image img) {
        width = img.getWidth(null);
        height = img.getHeight(null);
        pxl = new int[getWidth() * getHeight()];
        PixelGrabber pg = new PixelGrabber(img, 0, 0, width, height, pxl, 0, width);
        try {
            pg.grabPixels();
        } catch(InterruptedException e) {
        }
    }

    public int[] getPixels() {
        return pxl;
    }

    public int getWidth() {
        return width;
    }

    public int getHeight() {
        return height;
    }
}
 
Bezieht sich das jetzt auch auf mein Programm-Schnipsel? Ich hatte nämlich ein Transparentes *.gif, aber aus irgendeinem unerklärlichen Grund wurde es bei der Darstellung mit drawImage nicht transparent gezeichnet... deshalb musste ich es sozusagen berechnen. Aber ich kann nicht viel dazu sagen, ist schon lange her...
 
Hallo!

Schau mal hier:
Code:
/**
 * 
 */
package de.tutorials;

import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.image.BufferStrategy;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JFrame;

/**
 * @author Tom
 * 
 */
public class TransparencyExample extends JFrame {

	BufferStrategy strategy;

	Thread runner = new Thread() {
		public void run() {

			BufferedImage img = null;
			try {
				img = ImageIO.read(new File(
						"c:/tutorials_logo.png"));
			} catch (IOException e1) {
				e1.printStackTrace();
			}
			
			int i = 0;
			
			while (true) {
				
				Graphics2D g = (Graphics2D)strategy.getDrawGraphics();
				g.clearRect(0,0,320,100);
				if(i % 2 == 0){
					i++;
					g.setColor(Color.RED);
				}else{
					i--;
					g.setColor(Color.BLUE);
				}
				g.fillRect(0,0,320,240);
				g.drawImage(img,0,30,null);
				g.dispose();
				strategy.show();
				
				try {
					sleep(500);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}
	};

	public TransparencyExample() {
		super("TransparencyExample");
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		setSize(320, 100);
		setVisible(true);
		createBufferStrategy(2);
		strategy = getBufferStrategy();
		setIgnoreRepaint(true);
		runner.start();
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		new TransparencyExample();
	}
}

Gruß Tom
 

Anhänge

  • tutorials_logo.png
    tutorials_logo.png
    5,8 KB · Aufrufe: 39
Zurück