# Auto bewegen (mit SuM)



## AXEALASKA (2. Jun 2012)

Hallo,
ich möchte ein Spiel programmieren, wo man (vorerst noch nur) ein Auto bewegen kann.
Ich soll das zwar eigentlich in Java machen, aber da kenn ich mich nicht aus. In der Schule hatten wir bis jetzt nur Java mit SuM (Stifte und Mäuse, Link: SuM-Bibliotheken für BlueJ) und deswegen habe ich das erstmal damit versucht, was auch ganz gut klappt. Nur das Problem ist, dass sich mein Auto zwar lenken lässt, aber immer dieselbe Richtung hat. Ich verwende übrigens BlueJ.

Hier erst mal der Quelltext:
Klasse Spiel:

```
import sum.kern.*;
/**
 * @author 
 * @version 
 */
public class Spiel
{
    // Bezugsobjekte
    Bildschirm meinBildschirm;
    Buntstift meinStift;
    Tastatur hatTastatur;
    Maus Maus;
    Auto car;
    
    // Attribute
    double zGeschwindigkeit;
    double zWinkel;
    
    // Konstruktor
    public Spiel()
    {
        meinBildschirm = new Bildschirm(1000,600);
        meinStift = new Buntstift();
        hatTastatur = new Tastatur();
        Maus = new Maus();
        run();
    }

    // Dienste
    public void run()
    {
        car = new Auto(100,100,5,0);
        do
        {
            if (hatTastatur.wurdeGedrueckt())
            {
                switch (hatTastatur.zeichen())
                {
                    case 'w': zGeschwindigkeit += 0.1; break;
                    case 's': zGeschwindigkeit -= 0.1; break;
                    case 'd': zWinkel += 5; break;
                    case 'a': zWinkel -= 5; break;
                }
                hatTastatur.weiter();
            }
            //Reibung
            else if (zGeschwindigkeit>0)
            {
                 zGeschwindigkeit -= 0.0005;
            }
            else if (zGeschwindigkeit<0)
            {
                 zGeschwindigkeit += 0.0005;
            }
            car.bewegeUm(zGeschwindigkeit, zWinkel);
            //car.dreheUm(zWinkel);
            if (car.hPosition() < -50)
                car.bewegeBis(meinBildschirm.breite(), car.vPosition());
            if (car.hPosition() > meinBildschirm.breite())
                car.bewegeBis(0, car.vPosition());
            if (car.vPosition() < -20)
                car.bewegeBis(car.hPosition(), meinBildschirm.hoehe());
            if (car.vPosition() > meinBildschirm.hoehe())
                car.bewegeBis(car.hPosition(), 0);
            
                
            //optional    
            meinStift.bewegeBis(400,400);
            meinStift.schreibeText("Winkel: " + zWinkel + " Geschw.: " + zGeschwindigkeit);
            meinStift.bewegeBis(400,400);
            meinStift.radiere();
            meinStift.schreibeText("Winkel: " + zWinkel + " Geschw.: " + zGeschwindigkeit);
            meinStift.normal();
        } while (!Maus.doppelKlick());
    }
}
```

Klasse Auto:

```
import sum.kern.*;
/**
 * @author 
 * @version 
 */
public class Auto
{
    // Bezugsobjekte
    Buntstift hatStift;
    
    // Attribute
    private double zGeschwindigkeit;
    private double zWinkel;
    
    // Konstruktor
    public Auto(int pH, int pV, double pGeschwindigkeit, double zWinkel)
    {
        hatStift = new Buntstift();
        hatStift.bewegeBis(pH, pV);
        this.zeichne();
    }

    // Dienste
    public void zeichne()
    {
        double lH, lV;
        
        lH = this.stift().hPosition();
        lV = this.stift().vPosition();
        
        //Auto zeichnen
        this.stift().runter();
        this.stift().zeichneRechteck(50,20);
        this.stift().hoch();
        this.stift().bewegeBis(lH+20, lV);
        this.stift().runter();
        this.stift().zeichneRechteck(20,20);
        
        // zurueck zur Ausgangsposition
        this.stift().hoch();
        this.stift().bewegeBis(lH, lV);
        this.stift().dreheBis(0);
    }
    
    public void bewegeUm(double a, double b)
    {
        this.loesche();
        hatStift.dreheBis(-b);
        hatStift.bewegeUm(-a);
        this.zeichne();
    }
    
    /**public void dreheUm(double b)
    {
        this.loesche();
        hatStift.dreheUm(-b);
        this.zeichne();
    }*/
    
    private void loesche()
    {
        hatStift.radiere();
        this.zeichne();
        hatStift.normal();
    }

    public void bewegeBis(double H, double V)
    {
        this.loesche();
        hatStift.bewegeBis(H, V);
        this.zeichne();
    }
    
    public double hPosition()
    {
        return hatStift.hPosition();
    } 

    public double vPosition()
    {
        return hatStift.vPosition();
    } 

    protected Buntstift stift()
    {
        return hatStift;
    }

    public void gibFrei()
    {
        hatStift.gibFrei();
    }
}
```

Das Spiel könnt ihr auch leider nur ausführen, wenn ihr BlueJ habt und dort die SuM Bibliotheken installiert habt. Wie das geht, steht auf der Seite vom oben erwähnten Link.

Ich hoffe ihr könnt mir weiter helfen, auch wenn es kein richtiges Java ist.

LG AXEALASKA


----------



## FranzM (3. Jun 2012)

Hey,

du musst dir das so Vorstellen:

Du hast dein Frame, was deine Spielfläche darstellt.
Und dein Auto ist ja quasi eine Fläche, welche auf deinem Spielfeld ist.

Das heißt dein Spielfeld ist in einer Size:

 Breite: x 
 Hoehe: y

Dein Auto ist ist an folgenden Positionen:

autoposition_x
autoposition_y

Um dein Auto auch zu drehen, musst du die Autoposition gegen das Spielfeld drehen.
Das geht am besten mithilfe von Matritzen.
Schau mal bei Wiki nach Drehmatrix und dann der Punkt: 
Drehmatrix der Ebene R² 

Wenn du es verstehst dann geht das. Aber am besten du spielst einfach mal darmit rum.
Vielleicht liefert deine Klasse auch was mit. 

MfG 
Franz


----------



## AXEALASKA (3. Jun 2012)

Hallo 

Danke für die schnelle Antwort.
Ich habe mir das mal auf Wikipedia angeschaut und auch soweit verstanden, aber ich brauch doch nur R_alpha und nicht R_alpha+beta, oder?
Und brauche ich die aktive oder passive Drehung? 
Und mein größtes Problem ist, wie schreib ich das in Java? 

Ich habe im Internet noch einen schönen Quelltext gefunden, wo sich ein Quadrat dreht.

Klasse RotatorExample:

```
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.Stroke;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferStrategy;
 
import javax.swing.JFrame;

public class RotatorExample extends JFrame {
 
    BufferStrategy strategy;
 
    Stroke stroke = new BasicStroke(3.0F);
 
    Thread runner = new Thread() {
        public void run() {
 
            int theta = 0;
            while (true) {
                Graphics2D g = (Graphics2D) strategy.getDrawGraphics();
                g.clearRect(0, 0, 320, 240);
 
                g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                        RenderingHints.VALUE_ANTIALIAS_ON);
 
                theta += 5;
                theta %= 360;
 
                AffineTransform at = AffineTransform.getRotateInstance(Math
                        .toRadians(theta), 105, 105);
 
                g.setTransform(at);
                g.setStroke(stroke);
 
                g.drawRect(80, 80, 50, 50);
                g.setColor(Color.RED);
                g.drawLine(80, 80, 80, 80);
 
                g.dispose();
                strategy.show();
                try {
                    sleep(150L);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    };
 
    public RotatorExample() {
        super("RotatorExample");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setSize(320, 240);
        setVisible(true);
        createBufferStrategy(2);
        strategy = getBufferStrategy();
        runner.start();
    }

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

Da stand auch, dass dieser Befehl 
	
	
	
	





```
AffineTransform at = AffineTransform.getRotateInstance(Math
.toRadians(theta), 105, 105);
```
 die Drehung erzeugt, aber wie macht er das?
Und später soll mein Auto nicht gezeichnet, sondern ein Bild sein und man kann es mit den Pfeiltasten steuern, also auch nach links und rechts drehen? Ich habe keine Ahnung, wie ich das mit der Drehmatrix machen soll. 

LG AXEALASKA


----------



## FranzM (3. Jun 2012)

Hehe. Ist ja nicht schlimm, jeder fängt klein an.

Ich kann dir nur raten, alles von klein an hoch zu ziehen und dich langsam zu steigern.
Du versuchst gerade viel zu viele sachen auf einmal:

1. Umstieg von deiner JBlue oder wie es hieß auf das "Standart Java"
2. Verstehen der Problematik
3. Ideenflucht <- Während du über das eine Nachdenkst fallen die andere sachen ein.

Gut finde ich aber das du versuchst das Problem zu Abstrahieren.

Wie könntest du dein Problem Lösen.
Eine deiner Fragen, die du zuletzt gestellt hast beantwortet sich von selbst, wenn du weißt wo du suchen musst.

Da du ja die JAVA Doku hast (Google Suche: Java API 7 <- zum Beispiel), kannst du diese auch nutzen um den QUellcode des drehenden CUbes zu verstehen.

AffineTransform (Java Platform SE 7 )
<- Klick auf die Funktion in deinem Artikel und du landest da.

Ob dein Auto ein Bild ein Dreieck oder ein Viereck oder was weiß ich ist, ist doch dabei fast egal. 
Gut, bei einem Bild musst du anders rangehen, da du ja mehrere Bilder brauchst. Aber das ist vorerst egal. 
Versuche dein Auto mal durch ein Viereck(Quadrat ist UNgeeignet, weil du ja die Drehung sonnst nnicht siehst(bei 90° Drehung) ...
Das zauberst du einfach auf ein weißes Buffered Image(zum Beispiel) 
 <- 1. Aufgabe: Belese dich über BufferedImage und erzeuge das Graphics Object irgendwas.drawRect(..) 
Nun überlegst du wie du dein Rechteck bewegst:
 <- 2. KeyListener/Adapter etc verwenden, falls das nicht 100% verstanden ist, nachlesen.
Nun kannst du dank deiner Events/Listener auf die tastendrücke reagieren.
 <- 3. Wenn ich nach rechts Klicke soll sich mein Auto(Rechteck) um X° drehen. 
     Da kommt der Wiki Artikel ins Spiel. Wenn du den in ruhe liest, wirst du wissen was du brauchst  

Hilfreicher Tip: Versuch es mit einer sogenannten DoppelBuffer Strategie:
Du hast dann quasi ein Bereich der nur zum Rechnen ist und ein Bereich der zum Anzeigen da ist. Das sorgt dafür, das du kein unschönes geflacker hast.

Ich hoffe ich konnte dir damit ein wenig weiterhelfen, doch das studieren und erweitern deines Wissens, schaffst du nur durch das schaffen von Grundlagen. Und wenn du mal ein guter programmierer werden willst, dann ist es wichtig, das du selbst bock hast dein Quellcode immer zu Optimieren =) 
Also: Fang klein an, versuch es irgendwie zum laufen zu bekommen und arbeite deinen Code so lange auf bis du ihn im schlaf erklären könntest und er für deinen jetzigen Wissenstand optimal ist.
Und wenn du dann was neues gelernt hast, schau dir deinen alten quellcode an und denk drüber nach ob das aus Heutiger sicht gut war. Und du wirst sehen das du ganz schnell sehr viel besser wirst =)


----------



## AXEALASKA (3. Jun 2012)

Dankeschön für die tolle Antwort, ich werde mich gleich mal daran setzen.


----------



## AXEALASKA (12. Jun 2012)

Leider muss ich sagen, dass ich das überhaupt nicht hinkriege und weder die Methode AffineTransform, noch BufferedStrategy richtig verstehe. (
Ich kriege es ja nicht mal hin, einen Hintergrund auf die GUI zu machen und gleichzeitig ein Auto anzuzeigen, bei mir öffnen sich dann immer 2 Fenster. -.-
Kannst du mir nicht vielleicht ein bisschen helfen?


----------



## FranzM (12. Jun 2012)

Hey,

ein "bisschen" gern, aber reinhängen musst du dich schon. =) 

Ja dann stell doch bitte eine konkrete Frage oder poste mal den Quelltext an dem was schief geht.

Franz


----------



## AXEALASKA (14. Jun 2012)

```
import java.awt.Graphics2D;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
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;
 
public class MoveImage45 extends JFrame {
 
    private BufferStrategy strategy;
 
    private BufferedImage img;
 
    private int x = 0, y = 0;
 
    private int w, h;
 
    private boolean leftDown, rightDown, upDown, downDown, running = true;
 
    private Thread runner = new Thread() {
        {
            setPriority(MIN_PRIORITY);
        }
 
        public void run() {
            try {
                while (running) {
                    Graphics2D g = (Graphics2D) strategy.getDrawGraphics();
                    g.clearRect(0, 0, 960, 540);
 
                    if (rightDown) {
                        x += 15;
                    } else if (leftDown) {
                        x -= 15;
                    } else if (upDown) {
                        y -= 15;
                    } else if (downDown) {
                        y += 15;
                    }
 
                    if (img != null)
                        g.drawImage(img, x, y, MoveImage45.this);
                    g.dispose();
                    strategy.show();
                    sleep(50L);
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    };
 
    public MoveImage45() {
        super("MoveImage");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
 
        try {
            img = ImageIO.read(new File("gurke.jpg"));
            w = img.getWidth();
            h = img.getHeight();
        } catch (IOException e) {
            e.printStackTrace();
        }
 
        addKeyListener(new KeyAdapter() {
            public void keyPressed(KeyEvent evt) {
                int code = evt.getKeyCode();
                switch (code) {
                case KeyEvent.VK_LEFT:
                    leftDown = true;
                    break;
                case KeyEvent.VK_RIGHT:
                    rightDown = true;
                    break;
                case KeyEvent.VK_UP:
                    upDown = true;
                    break;
                case KeyEvent.VK_DOWN:
                    downDown = true;
                    break;
                default:
                    ;
                }
            }
 
            public void keyReleased(KeyEvent evt) {
                int code = evt.getKeyCode();
                switch (code) {
                case KeyEvent.VK_LEFT:
                    leftDown = false;
                    break;
                case KeyEvent.VK_RIGHT:
                    rightDown = false;
                    break;
                case KeyEvent.VK_UP:
                    upDown = false;
                    break;
                case KeyEvent.VK_DOWN:
                    downDown = false;
                    break;
                default:
                    ;
                }
            }
 
            public void keyTyped(KeyEvent evt) {
                int code = evt.getKeyChar();
                switch (code) {
                case KeyEvent.VK_ESCAPE:
                    running = false;
                    System.exit(0);
                }
            }
        });
 
        setSize(960, 540);
        setResizable(false);
        setIgnoreRepaint(true);
        setVisible(true);
        createBufferStrategy(2);
        strategy = getBufferStrategy();
    }
 
    public static void main(String[] args) {
        new MoveImage45().start();
    }
 
    /**
     *  
     */
    private void start() {
        runner.start();
    }
}
```

Damit kann man einfach nur das Bild Gurke bewegen, aber ohne jegliche Ansätze von AffineTransform.
Eigentlich konnte ich da auch ein Hintergrund zeichnen lassen, aber dann wurden immer 2 Fenster geöffnet.

LG AXE


----------



## langhaar! (14. Jun 2012)

AXEALASKA hat gesagt.:


> ```
> Damit kann man einfach nur das Bild Gurke bewegen, aber ohne jegliche Ansätze von AffineTransform.
> [/QUOTE]
> 
> ...


----------



## FranzMe (14. Jun 2012)

Hey, 
schau dir doch mal deine Threads an... dein Graphic object wird immer in einem neuen Thread erzeugt... 

Und wieso magst du überhaupt threads verwenden? 

Der Franz


----------



## AXEALASKA (14. Jun 2012)

> Was willst du damit sagen? Bist du der Meinung, das Ergebnis ist in Ordnung, obwohl kein AffineTransform benutzt wird oder meinst du, soweit läuft es schon, es wird aber nur vertikale und horizontale Bewegung unterstützt?


Damit meine ich das zweite.


> Ist der Code von dir oder nur irgendwas, was du dir als Beispiel angesehen hast und es macht nicht das, was du benötigst?


Der Code ist aus dem Internet und daran habe ich versucht, weiterzuarbeiten und es macht auch nicht das, was ich benötige.


> Hey,
> schau dir doch mal deine Threads an... dein Graphic object wird immer in einem neuen Thread erzeugt...
> 
> Und wieso magst du überhaupt threads verwenden?
> ...


Was meinst du mit bzw. sind Threads?


----------



## langhaar! (14. Jun 2012)

AXEALASKA hat gesagt.:


> Der Code ist aus dem Internet und daran habe ich versucht, weiterzuarbeiten und es macht auch nicht das, was ich benötige.



Hast du dir den Code mal angesehen? Dort wird eine ganz andere Aufgabenstellung implementiert. (Bewegung in jeweils eine der vier Himmelsrichtungen)
Zu fragen, warum dort keine Drehung ist, ist ähnlich, als würdest du fragen, warum eine Methode zur Primzahlermittlung nicht Pi berechnet.


----------



## AXEALASKA (15. Jun 2012)

> Hast du dir den Code mal angesehen? Dort wird eine ganz andere Aufgabenstellung implementiert. (Bewegung in jeweils eine der vier Himmelsrichtungen)
> Zu fragen, warum dort keine Drehung ist, ist ähnlich, als würdest du fragen, warum eine Methode zur Primzahlermittlung nicht Pi berechnet.


Ja ach...
Ich hab ja auch nicht hingekriegt, AffineTransform zu benutzen, ich wollte das eigentlich darauf aufbauen, weil ich da dann schon mal stehen habe, wie man die Tastatur benutzt.


----------



## AXEALASKA (15. Jun 2012)

Also um mich nochmal genauer auszudrücken:
Ich weiß nicht genau, wie ich und was ich jetzt genau von und AffineTransform programmieren muss, weil es da ja so viele Methoden und so gibt und ich keine Ahnung davon habe, und dann ist auch noch alles auf Englisch. -.- 
Bin erst in der 10. Klasse, habe also noch nie wirklich was von Matrixen bzw. Drehmatrixen gehört, nur bei Linearen Gleichungssystem, was hier aber sicher nicht hilft. 


Und noch mal zum Programm:
Es soll nachher eine .exe Datei sein. Wenn man sie öffnet, erscheint ein 1280*720p großes Fenster mit einem Hintergrund, darauf 3 Buttons "Starten", "Upgradeshop" (der ist schon fertig  ) und "Beenden".
Bei "Starten" soll dann ein Auto erscheinen, mit dem man über den Bildschirm fahren kann. Am besten wäre es, wenn das Auto auch nicht quer über den Bildschirm fahren kann, sondern an den im Hintergrund gezeichneten Reifenstapeln abprallt oder stehen bleibt. Jeder 10 Sekunden soll man dann 1000$ kriegen, womit man dann das Auto im Upgradeshop besser machen kann. (3 Mögl.: 1. Motor -> Max Geschw. wird erhöht, 2. Reifen -> Auto dreht sich schneller (wobei ich nicht weiß, ob das überhaupt geht mit AffineTransform) und 3. Nitro -> wenn man "n" drückt, wird man für 10 Sekunden ein bisschen schneller)
Es wäre echt geil, wenn ich das realisieren könnte, wobei das wichtigste ist, dass ich eine GUI habe und mit dem Auto darüber fahren kann.

LG AXE


----------



## langhaar! (15. Jun 2012)

Leg eine Anzahl von Winkeln fest, in der dein Auto fahren können soll (z.B. 32).
Merk dir den Winkel bei einer Drehung, mal 32 Bilder deines Autos in allen Winkeln und zeig das entsprechende Bild an. In Abhängigkeit des Winkels holst du über eine Funktion die Änderungen, die sich entsprechend des Winkels für x und y ergeben. Dann brauchst du nicht mit Matrizen hantieren.

Aber realistisch sehe ich zwei Möglichkeiten:
Bezahl jemand, der dir das programmiert.
Alternativ sammel Erfahrung mit einfacheren Programmen.


----------



## AXEALASKA (16. Jun 2012)

Das Auto ist nur von oben gemalt, es gibt nur eine Grafik. Diese soll sich aber auch um alle Winkel drehen können.


----------



## AXEALASKA (17. Jun 2012)

Ok ich bin wieder etwas weiter gekommen. 
Nun folgender Quelltext:

```
import java.awt.Graphics2D;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.Stroke;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferStrategy;
 
import javax.swing.JFrame;

public class Autospiel extends JFrame {
 
    BufferStrategy strategy;
    
    private boolean leftDown, rightDown, upDown, downDown, running = true;
 
    Stroke stroke = new BasicStroke(3.0F);
 
    Thread runner = new Thread() {
        public void run() {
 
            int theta = 0;
            while (true) {
                Graphics2D g = (Graphics2D) strategy.getDrawGraphics();
                g.clearRect(0, 0, 320, 240);
 
                g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                        RenderingHints.VALUE_ANTIALIAS_ON);
 
                
                if (rightDown) {
                        theta += 5;
                    } else if (leftDown) {
                        theta -= 5;
                    }
                theta %= 360;
 
                AffineTransform at = AffineTransform.getRotateInstance(Math
                        .toRadians(theta), 105, 105);
 
                g.setTransform(at);
                g.setStroke(stroke);
 
                g.drawRect(80, 80, 50, 50);
                g.setColor(Color.RED);
                g.drawLine(80, 80, 80, 80);
 
                g.dispose();
                strategy.show();
                try {
                    sleep(150L);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    };
 
    public Autospiel() {
        super("Autospiel");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        
        addKeyListener(new KeyAdapter() {
            public void keyPressed(KeyEvent evt) {
                int code = evt.getKeyCode();
                switch (code) {
                case KeyEvent.VK_LEFT:
                    leftDown = true;
                    break;
                case KeyEvent.VK_RIGHT:
                    rightDown = true;
                    break;
                default:
                    ;
                }
            }
 
            public void keyReleased(KeyEvent evt) {
                int code = evt.getKeyCode();
                switch (code) {
                case KeyEvent.VK_LEFT:
                    leftDown = false;
                    break;
                case KeyEvent.VK_RIGHT:
                    rightDown = false;
                    break;
                default:
                    ;
                }
            }
 
            public void keyTyped(KeyEvent evt) {
                int code = evt.getKeyChar();
                switch (code) {
                case KeyEvent.VK_ESCAPE:
                    running = false;
                    System.exit(0);
                }
            }
        });
        
        setSize(320, 240);
        setVisible(true);
        createBufferStrategy(2);
        strategy = getBufferStrategy();
        runner.start();
    }

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

Es erscheint nun ein Quadrat mit einem roten Punkt in einer Ecke (damit ich die Drehung besser erkennen kann). Wenn ich die linke bzw. rechte Pfeiltaste drücke, dreht sich das Rechteck in die jeweilige Richtung.

Jetzt habe ich noch 2 Fragen:
1. Wie kriege ich es hin, dass ich ein Bild und kein gezeichnetes Quadrat drehen kann und
2. wie kriege ich es hin, dass, wenn das Bild z.B. um 20° gedreht ist, sich das Bild z.B. auf Druck der oberen Pfeiltaste um z.B. 5px in die Richtung 20° bewegt.
(Die 2. Frage ist die wichtigere, da ich die Grafik zur Not auch mit den einzelnen Pixeln zeichnen kann, also bitte am stärksten darauf eingehen) 

LG AXEALASKA


----------



## AXEALASKA (17. Jun 2012)

Genauer:

```
import java.awt.Graphics2D;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.Stroke;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferStrategy;
 
import javax.swing.JFrame;

public class Autospiel extends JFrame {
 
    BufferStrategy strategy;
    
    private boolean leftDown, rightDown, upDown, downDown, running = true;
    
    private int x = 0, y = 0;
 
    Stroke stroke = new BasicStroke(3.0F);
 
    Thread runner = new Thread() {
        public void run() {
 
            int theta = 0;
            while (true) {
                Graphics2D g = (Graphics2D) strategy.getDrawGraphics();
                g.clearRect(0, 0, 320, 240);
 
                g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                        RenderingHints.VALUE_ANTIALIAS_ON);
 
                
                if (rightDown) {
                        theta += 5;
                    } else if (leftDown) {
                        theta -= 5;
                    } else if (upDown) {
                        x += 5;
                    } else if (downDown) {
                        y += 5;
                    }
                theta %= 360;
 
                AffineTransform at = AffineTransform.getRotateInstance(Math
                        .toRadians(theta), 105 + x, 105 + y);
 
                g.setTransform(at);
                g.setStroke(stroke);
 
                g.drawRect(90 + x, 80 + y, 30, 50);
                g.drawRect(90 + x, 100 + y, 30, 20);
                g.setColor(Color.RED);
                g.drawLine(120 + x, 80 + y, 120 + x, 80 + y);
 
                g.dispose();
                strategy.show();
                try {
                    sleep(150L);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    };
 
    public Autospiel() {
        super("Autospiel");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        
        addKeyListener(new KeyAdapter() {
            public void keyPressed(KeyEvent evt) {
                int code = evt.getKeyCode();
                switch (code) {
                case KeyEvent.VK_LEFT:
                    leftDown = true;
                    break;
                case KeyEvent.VK_RIGHT:
                    rightDown = true;
                    break;
                case KeyEvent.VK_UP:
                    upDown = true;
                    break;
                case KeyEvent.VK_DOWN:
                    downDown = true;
                    break;    
                default:
                    ;
                }
            }
 
            public void keyReleased(KeyEvent evt) {
                int code = evt.getKeyCode();
                switch (code) {
                case KeyEvent.VK_LEFT:
                    leftDown = false;
                    break;
                case KeyEvent.VK_RIGHT:
                    rightDown = false;
                    break;
                case KeyEvent.VK_UP:
                    upDown = false;
                    break;
                case KeyEvent.VK_DOWN:
                    downDown = false;
                    break;    
                default:
                    ;
                }
            }
 
            public void keyTyped(KeyEvent evt) {
                int code = evt.getKeyChar();
                switch (code) {
                case KeyEvent.VK_ESCAPE:
                    running = false;
                    System.exit(0);
                }
            }
        });
        
        setSize(320, 240);
        setVisible(true);
        createBufferStrategy(2);
        strategy = getBufferStrategy();
        runner.start();
    }

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

Das mit dem '+ x' und '+ y' klappt leider nicht. 
Könnt ihr mir da vielleicht helfen, wie das geht?


----------



## Termi (17. Jun 2012)

AXEALASKA hat gesagt.:


> 1. Wie kriege ich es hin, dass ich ein Bild und kein gezeichnetes Quadrat drehen kann und




Verstehe die Frage nicht richtig.
Du musst anstatt des Quadrats dein Bild zeichnen lassen?


Graphics2D (Java Platform SE 7 )

-> drawImage


----------



## AXEALASKA (18. Jun 2012)

Ok danke und zu Frage 2? 

edit:
Wenn ich "drawImage(Image img, AffineTransform xform, ImageObserver obs)" nehme, was muss ich dann bei ImageObserver angeben? Ich habe leider keine Ahnung, was das ist.


----------



## Termi (19. Jun 2012)

Probiers mit null.


----------



## AXEALASKA (23. Jun 2012)

Danke hat geklappt. 

Und habt ihr noch Antworten zu den vorherigen Fragen?


----------



## !GH!Budd (23. Jun 2012)

Hallo AXEALASKA!

Ich möchte mal gerne fragen, was eigentlich dein Ziel mit dem Projekt ist. Möchtest du 
a) eine Projektarbeit für die Schule realisieren
b) beim Lernen einer Programmiersprache weiterkommen oder
c) einfach deine bisher erworbenen Kenntnisse für etwas sinnvolles privat nutzen?

Ich frage deswegen, weil die Antworten dann hier vielleicht grundlegend anders ausfallen könnten. Ich habe Schon eine Lösung für das was du vorhast mit den SuM Klassen gesehen. Zum Lernen sind diese generell nicht so schlecht. ist deine Intention also (b), schlage ich vor, dass du auf diesen Weg zurückkehrst. (Für außenstehende: SuM ist die Implementierung einer Turtle-Grafik.) Auch bei (a) wäre sicherlich dieser Weg der bessere. Denn dann zeigst du dem Lehrer, dass du den Unterrichtsstoff auch verstanden hast. Wenn eher (c) zutriffst, ist es sicher gut, den jetzt eingeschlagenen Weg zu verfolgen und dich "durchzuwurschteln".

Viel Erfolg bei deinem Projekt!


----------



## AXEALASKA (24. Jun 2012)

Ja, das ist Projekt ist für die Schule.
Unser Lehrer hat uns Anfang Mai oder so einfach gesagt: "Schreibt ein Spiel eurer Wahl mit einer GUI in reinem Java". Blöd war nur, dass wir vorher nur mit SuM gearbeitet haben.
Deswegen brauchte ich auch ein bisschen Hilfe, da ich zwar den Syntax von Java (halbwegs) kann, aber nicht so viele Befehle kenne.
LG axe


----------



## !GH!Budd (24. Jun 2012)

Was heißt schon "in reinem Java". Letztendlich sind ja die SuM Klassen auch reines Java. Es ist halt eine Art Framework. Klassen, die man mitbenutzen kann. Wenn du jetzt mit dem Projekt schon etwas weitergekommen bist und das so durchziehen willst, sei dir das gegönnt. Du wirst sicherlich viel lernen, wenn du es bis zum Ende durchziehst. Aber auch mit SuM funktioniert es. Wie gesagt, ich kenne eine solche Implementierung. Es gibt einen Dienst, der das Auto zeichnet, der nur relative Stiftbewegungen erlaubt. Und wenn sich dann das Auto drehen soll, muss man halt den Stift drehen. Funktionierte in dem Projekt super, hat ne Eins gegeben.


----------



## AXEALASKA (24. Jun 2012)

Ja, wir dürfen aber kein SuM benutzen...


----------



## !GH!Budd (24. Jun 2012)

Achso. Das hatte ich bisher falsch verstanden.


----------



## AXEALASKA (24. Jun 2012)

Ja, das meinte ich auch mit reinem Java.


----------

