Ein Bild rotieren

Kocha

Gesperrt
Hallo Leute :D


Mal angenommen, man würde ne Pacman Kopie schreiben, hat da nur ein Bild des Pacmans, das Pacman nach oben schauend darstellt, und muss jetzt das ganze im Prog innen umdrehn, also n Image Objekt um 90° kippen, wie macht man das? :O


Mit java.awt.geom.AffineTransform dreht man ja eigentlich einen Teil des auf dem Bildschirm angezeigten, also nicht das Image Objekt selbst, gibt's da nich ne einfachere Lösung? :O


Vielen Dank ^^
 
Mit dem java.awt.image.PixelGrabber kannst Du ein Bild in einzelne Pixel zerlegen und somit auch unterschiedlich wieder zusammensetzen. Es sind also nicht nur Drehungen, sondern auch Spiegelungen oder Schachbrett-Versatz ect. möglich - je nachdem, wie Du den Pixel-Array umstrukturierst.
 
Hallo!

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

import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.geom.AffineTransform;
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 PacMan extends JFrame {

	final static int W = 320;

	final int PAC_W = 48;

	final static int H = 240;

	final int PAC_H = 48;

	boolean leftKeyDown, rightKeyDown, upperKeyDown, lowerKeyDown;

	BufferStrategy strategy;

	int x = 160, y = 120;

	BufferedImage pac;

	double theta = 0.0D;

	Thread runner = new Thread() {
		public void run() {
			while (true) {
				Graphics2D g = (Graphics2D) strategy.getDrawGraphics();
				g.clearRect(0, 0, W, H);

				g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
						RenderingHints.VALUE_ANTIALIAS_ON);

				int pacMiddleX = x + PAC_W / 2;
				int pacMiddleY = y + PAC_H / 2;

				g.setTransform(AffineTransform.getRotateInstance(Math
						.toRadians(theta), pacMiddleX, pacMiddleY));

				g.drawImage(pac, x, y, PacMan.this);

				g.dispose();
				strategy.show();

				if (leftKeyDown) {
					x -= 8;
					theta = 180.0D;
				}

				if (rightKeyDown) {
					x += 8;
					theta = 0.0D;
				}

				if (upperKeyDown) {
					y -= 6;
					theta = -90.0D;
				}

				if (lowerKeyDown) {
					y += 6;
					theta = 90.0D;
				}

				try {
					sleep(100L);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}

			}
		}
	};

	public PacMan() {
		super("PacMan");
		setDefaultCloseOperation(EXIT_ON_CLOSE);

		try {
			pac = ImageIO.read(new File("c:/pac.png"));
		} catch (IOException e) {
			e.printStackTrace();
		}

		addKeyListener(new KeyAdapter() {

			public void keyPressed(KeyEvent e) {
				int keyCode = e.getKeyCode();
				switch (keyCode) {
				case KeyEvent.VK_UP:
					upperKeyDown = true;
					break;
				case KeyEvent.VK_DOWN:
					lowerKeyDown = true;
					break;
				case KeyEvent.VK_RIGHT:
					rightKeyDown = true;
					break;
				case KeyEvent.VK_LEFT:
					leftKeyDown = true;
				}
			}

			public void keyReleased(KeyEvent e) {
				int keyCode = e.getKeyCode();
				switch (keyCode) {
				case KeyEvent.VK_UP:
					upperKeyDown = false;
					break;
				case KeyEvent.VK_DOWN:
					lowerKeyDown = false;
					break;
				case KeyEvent.VK_RIGHT:
					rightKeyDown = false;
					break;
				case KeyEvent.VK_LEFT:
					leftKeyDown = false;
				}
			}

		});

		setSize(W, H);
		setVisible(true);
		createBufferStrategy(2);
		strategy = getBufferStrategy();
		runner.start();
	}

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

Gruß Tom
 

Anhänge

  • pac.png
    pac.png
    1,8 KB · Aufrufe: 501
Zurück