Ein Bild auf aktueller position drehen

xtoph

Mitglied
Hi Leutz,

häng jetzt schon den ganzen Tag an diesem Problem, vielleicht kann hier einer helfen....


Ich möchte mit dem Bild "fahren" wenn ich nach vorn bzw hinten drücke. und bei rechts und links, soll es sich drehen. Aba genau auf der Stelle wo es steht. Egal wo ich vorher hingefahren bin. Mein Problem, entweder er fährt nich da hin wo ich will, dafür kann ich drehen, oder er dreht nich und ich kann hinfahren wo ich will.

Wäre schön, wenn mir jemand helfen könnte...

Code:
import java.awt.*;
  import java.awt.event.*;
  import java.applet.*;
  import java.awt.geom.*;
      public class Tastatur extends Applet{
      	int b,c,d;
  	double a,rx,ry,e,f;
  	Image i;

  	  	  	public void init(){
  		Cursorempfaenger ce = new Cursorempfaenger(this);

  		  	  	//Startposition		
  		rx=20;  	
	ry=20;  		
  		addKeyListener(ce);  		
requestFocus();  	
	setSize(1024,768);  	
	Toolkit tk = Toolkit.getDefaultToolkit();  	
	i = tk.getImage("Bild.jpg");  	
	a=0;  	
}  	  
	public void paint(Graphics g){  	
	  		Graphics2D g2d = (Graphics2D) g;    				  		  		//rotation  			g2d.translate( rx+75, rx+50);  	
			g2d.rotate(a);  	
		          g2d.translate(-(rx+75),-(rx+50));  		

  			g2d.drawImage(i,(int)rx,(int)ry,this);  
		    		  			}	
	    }   

   class Cursorempfaenger extends KeyAdapter {  
	Tastatur tApplet;  	  
	Cursorempfaenger(Tastatur tApplet){  
	this.tApplet = tApplet;  	}  	  

	public void keyPressed(KeyEvent event){  	
	switch(event.getKeyCode()){  			
          case (KeyEvent.VK_DOWN) : tApplet.ry=tApplet.ry+2; break;  		
	case (KeyEvent.VK_UP)   : tApplet.ry=tApplet.ry-2;  break;  
	case (KeyEvent.VK_LEFT) : tApplet.a=tApplet.a-0.03;break;  
	case (KeyEvent.VK_RIGHT):tApplet.a=tApplet.a+0.03;  break;  }
  		  		tApplet.repaint();  	
	} 
 }
 
Hallo!

Schau mal hier:

Es werden zuerst 30 Bilder mit den möglichen Transformationen vorgerechnet welche dann nur noch passend ausgewählt werden müssen ...
So etwas in Realtime zu machen ist zu rechenaufwändig...

* Sorry für die super naive Bewegungsroutine ... :-( *

Code:
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.geom.AffineTransform;
import java.awt.geom.Rectangle2D;
import java.awt.image.AffineTransformOp;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

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

/*
 * Created on 22.03.2004
 * 
 * To change the template for this generated file go to Window - Preferences -
 * Java - Code Generation - Code and Comments
 */
/**
 * @author Darimont
 * 
 * To change the template for this generated type comment go to Window -
 * Preferences - Java - Code Generation - Code and Comments
 */
public class ImageRotator extends JFrame {

	private BufferedImage[] images;

	private BufferedImage screen;

	private double angle;

	private int xPos = 10;

	private int yPos = 100;

	private int arrowWidth = 42;

	private int arrowHight = 42;

	private int imgHeight;

	private int imgWidth;

	private Rectangle2D[] rectangles;

	private BufferedImage source;

	private int imgNo;

	private boolean finished = false;

	public ImageRotator() {
		super("ImageRotator");
		setSize(320, 240);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		try {
			source = ImageIO.read(new File("c:/arrow.gif"));
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		addKeyListener(new KeyAdapter() {

			public void keyPressed(KeyEvent evt) {

				int keyCode = evt.getKeyCode();
				switch (keyCode) {
					case KeyEvent.VK_UP :
						{
							System.out.println("UP");
							calcPos();

						}
						break;
					case KeyEvent.VK_DOWN :
						{
							System.out.println("DOWN");
							calcPos();
						}
						break;
					case KeyEvent.VK_LEFT :
						{
							System.out.println("LEFT");
							imgNo =
								(imgNo == 0) ? images.length - 1 : imgNo - 1;
						}
						break;
					case KeyEvent.VK_RIGHT :
						{
							System.out.println("RIGHT");
							imgNo =
								(imgNo == images.length - 1) ? 0 : imgNo + 1;
						}
						break;
					default :
						;
				}
			}
		});
		setVisible(true);
		screen = (BufferedImage) createImage(320, 240);
		Rectangle r = new Rectangle(42, 42);
		rectangles = new Rectangle2D[60];
		for (int i = 0; i < rectangles.length; i++) {
			rectangles[i] = r;
		}

		images = createRotations(source, rectangles);
		System.gc();
		System.out.println("Generating images finished");
		finished = true;

		new Thread() {

			public void run() {
				this.setPriority(Thread.MIN_PRIORITY);
				while (true) {
					draw();
					try {
						Thread.sleep(10l);
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
			}
		}
		.start();

	}

	public void draw() {
		screen.getGraphics().fillRect(0, 0, 320, 240);
		screen.getGraphics().drawImage(images[imgNo], xPos, yPos, this);
		getContentPane().getGraphics().drawImage(screen, 0, 0, this);
	}

	/**
	 *  
	 */
	private void calcPos() {
		// TODO Auto-generated method stub
		int winkel = 6 * imgNo;
		System.out.println("Winkel: " + winkel);
		int xPosOld = xPos;
		int yPosOld = yPos;
		int dx = 0;
		int dy = 0;
		int schrittWeite = 2;
		double scale = 10.0d;

		if (winkel >= 0 && winkel <= 90) { //Erster Quadrant
			//System.out.println("(90 - winkel) / 90: " + (90 - winkel) / 90);
			dy = (int) ((90.0d - winkel) / 90.0d * scale * schrittWeite);
			yPos = yPos - dy;

			dx = (int) ((winkel / 90.0d) * scale * schrittWeite);

			xPos = xPos + dx;

		} else if (winkel > 90 && winkel <= 180) { // Zweiter Quadrant

			dx = (int) ((180.0d - winkel) / 90.0d * scale * schrittWeite);
			xPos = xPos + dx;

			dy = (int) ((winkel / 180.0d) * scale * schrittWeite);

			yPos = yPos + dy;

		} else if (winkel > 180 && winkel <= 270) { // Dritter Quadrant

			dy = (int) ((270.0d - winkel) / 90.0d * scale * schrittWeite);
			yPos = yPos + dy;

			dx = (int) ((winkel / 270.0d) * scale * schrittWeite);

			xPos = xPos - dx;

		} else { //Vierter Quadrant

			dx = (int) ((360.0d - winkel) / 90.0d * scale * schrittWeite);
			xPos = xPos - dx;

			dy = (int) ((winkel / 360.0d) * scale * schrittWeite);

			yPos = yPos - dy;
		}

		if (!inBounds(xPos, yPos)) {
			xPos = xPosOld;
			yPos = yPosOld;
		}

		System.out.println("dx: " + dx);
		System.out.println("dy: " + dy);

	}

	/**
	 * @param pos
	 * @param pos2
	 * @return
	 */
	private boolean inBounds(int xPos, int yPos) {
		// TODO Auto-generated method stub
		Dimension d = this.getSize();
		return (
			(xPos >= 0 && xPos <= (d.getWidth() - arrowWidth))
				&& (yPos >= (0 + this.getInsets().top)
					&& yPos <= (d.getHeight() - arrowHight)));

	}

	public static void main(String[] args) {
		new ImageRotator();
	}

	public void paint(Graphics g) {
		super.paint(g);

	}

	public static BufferedImage[] createRotations(
		BufferedImage source,
		Rectangle2D[] frameDimension) {
		BufferedImage[] target = new BufferedImage[frameDimension.length];
		int cx = source.getWidth() / 2;
		int cy = source.getHeight() / 2;
		for (int i = target.length - 1; i >= 0; i--) {
			AffineTransformOp afo =
				new AffineTransformOp(
					AffineTransform.getRotateInstance(
						(Math.PI * 2 * i) / frameDimension.length,
						cx,
						cy),
					AffineTransformOp.TYPE_BILINEAR);
			target[i] =
				afo.createCompatibleDestImage(source, source.getColorModel());
			Rectangle2D r = (frameDimension[i] = afo.getBounds2D(source));
			r.setRect(
				r.getX() - cx,
				r.getY() - cy,
				r.getWidth(),
				r.getHeight());
			afo.filter(source, target[i]);
		}
		return target;
	}

}

Gruß Tom
 

Anhänge

  • imgrot.png
    imgrot.png
    2,3 KB · Aufrufe: 362
Zuletzt bearbeitet:
Hallo!

ups..... ;-)

Mein Problem, entweder er fährt nich da hin wo ich will, dafür kann ich drehen, oder er dreht nich und ich kann hinfahren wo ich will.

.... ups, hab ich wohl überlesen. Du musst da wahrscheinlich so vorgehen, dass du deine Events Asynchron zu der Darstellung verarbeiten lässt.
Sprich, alle von dir gedrückte Tasten abfolgen werden an eine Queue (Warteschlange) abgegeben, welche dann asynchron vom Anzeige Thread abgearbietet wird... so bekommst du auch das gleichzeitige Lenken und nach vorne Fahren hin ...

Gruß Tom
 
hi,

erstmal THX für deine schnelle Hilfe. Deine Lösung ist echt gut, aba ich glaub ein bissel zu krass, für das was ich machen will.

Problem bei mir is nur, dass ich nich den aktuellen mittelpunkt des bildes bestimmt bekomme, um den ich dann drehen würde.
 
Zurück