Auto bewegen (mit SuM)

AXEALASKA

Mitglied
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:
Java:
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:
Java:
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

Mitglied
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

Mitglied
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? :D

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

Klasse RotatorExample:
Java:
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
Java:
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

Mitglied
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

Mitglied
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

Mitglied
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

Mitglied
Java:
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!

Bekanntes Mitglied
Java:
Damit kann man einfach nur das Bild Gurke bewegen, aber ohne jegliche Ansätze von AffineTransform.
[/QUOTE]

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? ???:L

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

FranzMe

Gast
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

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

Der Franz
Was meinst du mit bzw. sind Threads? :D
 

langhaar!

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

Mitglied
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

Mitglied
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. -.- :D
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. :D


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 :D ) 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!

Bekanntes Mitglied
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.
 
Zuletzt bearbeitet:

AXEALASKA

Mitglied
Ok ich bin wieder etwas weiter gekommen. :)
Nun folgender Quelltext:
Java:
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

Mitglied
Genauer:
Java:
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? :)
 

AXEALASKA

Mitglied
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. :(
 
Zuletzt bearbeitet:

!GH!Budd

Mitglied
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

Mitglied
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

Mitglied
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.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Blndner Auto Beispiel Java Basics - Anfänger-Themen 4
Igig1 Autoparkplatz verkettete Liste erstes und letztes Auto Java Basics - Anfänger-Themen 13
K Ein Objekt Auto kennt den Inhalt seines links und rechtsstehenden Autos, wie soll man das ermöglichen Java Basics - Anfänger-Themen 2
F Auto String mit Array Name aus Datei... oder so ähnlich Java Basics - Anfänger-Themen 4
E Klassen Auto Klasse Java Basics - Anfänger-Themen 6
P Klassen In einer Autoklasse das Objekt Auto mittels Collection Speichern Java Basics - Anfänger-Themen 4
T Erste Schritte Auto betanken Java Basics - Anfänger-Themen 3
B Klassen Programm für einen Auto Boardcomputer Java Basics - Anfänger-Themen 20
U auto. Typenkonvertierung Java Basics - Anfänger-Themen 19
B ""fahrendes Auto"" Java Basics - Anfänger-Themen 14
N Arraylist Auto sortieren Java Basics - Anfänger-Themen 7
Private Void Auto-Aktualisierung der Zeitanzeige Java Basics - Anfänger-Themen 10
A Auto-Updater Java Basics - Anfänger-Themen 4
C Auto tanken Java Basics - Anfänger-Themen 6
N Hey Leute und zwar versuche ich gerade ein 2D Spiel zu Programmieren aber die Figur will sich nicht nach links oder rechts bewegen :( Java Basics - Anfänger-Themen 12
N Java Spiel Figur auf dem Hintergrundbild bewegen. Java Basics - Anfänger-Themen 11
D Wie Objekte im JFrame frei bewegen lassen? Java Basics - Anfänger-Themen 3
D wie kann man in Pong mit eclipse den schläger bewegen Java Basics - Anfänger-Themen 1
IamArctic Quaxli Tutorial, Rotorblätter bewegen sich nicht mehr Java Basics - Anfänger-Themen 4
T Auf einem Schachbrett bewegen programmieren Java Basics - Anfänger-Themen 2
S ProgrammierHilfe dringend gesucht ( Icon bewegen) Java Basics - Anfänger-Themen 9
J Button über Pfeiltasten bewegen Java Basics - Anfänger-Themen 8
I in Richtung bewegen Java Basics - Anfänger-Themen 2
Franzi1001 ScrollBar lässt sich nicht bewegen Java Basics - Anfänger-Themen 4
N Bewegtes Objekt soll sich um eine Parallele bewegen Java Basics - Anfänger-Themen 0
CptK Interface Bilder über Bildschirm bewegen, bis der Abstand zum vorherigen zu groß wird Java Basics - Anfänger-Themen 13
Y Kreis auf einer Kreisbahn bewegen Java Basics - Anfänger-Themen 5
H Spieler bewegen :) Java Basics - Anfänger-Themen 6
R JTree bewegen Java Basics - Anfänger-Themen 6
GRAZZ0R MouseListener - Rechteck Bewegen Java Basics - Anfänger-Themen 1
J Durch 2-Dimensionales Array "bewegen" will nicht so recht hinhauen Java Basics - Anfänger-Themen 2
J Spieler bewegen Java Basics - Anfänger-Themen 3
N String auf JPanel bewegen Java Basics - Anfänger-Themen 6
G zwei Objekte bewegen - der eine bewegt sich nicht flüssig? Java Basics - Anfänger-Themen 10
F Objekt in Richtung eines anderen Objekts bewegen Java Basics - Anfänger-Themen 4
K Bild mit Maus innerhalb eines Rahmens bewegen Java Basics - Anfänger-Themen 5
G Figuren bewegen-Aufgabe mit static Java Basics - Anfänger-Themen 9
D Kreis mit Pfeiltaste bewegen Java Basics - Anfänger-Themen 3
JAVAnnik Problem beim Objekt bewegen Java Basics - Anfänger-Themen 20
E JFrame Fenster bewegen Java Basics - Anfänger-Themen 8
G Shape bewegen Java Basics - Anfänger-Themen 4
F Bilder enfügen und Bewegen Java Basics - Anfänger-Themen 6
N OOP Objekte entlang Pfaden bewegen Java Basics - Anfänger-Themen 15
B Button bewegen Java Basics - Anfänger-Themen 8
H Grafik auf einem JPanel bewegen. Java Basics - Anfänger-Themen 7
L Balken mit Pfeiltasten bewegen Java Basics - Anfänger-Themen 3
P Fenster bewegen Java Basics - Anfänger-Themen 4
S Mehrere Bilder bewegen Java Basics - Anfänger-Themen 5
Spin Objekte bewegen lassen Java Basics - Anfänger-Themen 16
A grafik 2d Objekte mit der Maus bewegen Java Basics - Anfänger-Themen 4
N Objekte bewegen funktioniert nicht Java Basics - Anfänger-Themen 5
U Neuling: Hintergrund bewegen Java Basics - Anfänger-Themen 14
G Maus mit java bewegen Java Basics - Anfänger-Themen 6
W Jlabel bewegen Java Basics - Anfänger-Themen 8
B KeyListener (etwas bewegen) Java Basics - Anfänger-Themen 10
7 Benutzer kann Button bewegen Java Basics - Anfänger-Themen 4
H Bewegen einer Figur Java Basics - Anfänger-Themen 3
R Buttons können sich bewegen und JButtons nicht? Java Basics - Anfänger-Themen 5
K striche die sich auf dem hintergrundbild bewegen Java Basics - Anfänger-Themen 10
J Bewegen durch das Labyrinth Java Basics - Anfänger-Themen 7
A Kreis mit gedrückter Maustaste bewegen. Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben