*Verschoben aus dem Sourcecodeaustausch*
Hallo, da ich mich die letzten Monate sehr mit der Spielentwicklung auseinander gesetzt habe, und somit auch mit der Steuerung von Objekten, habe ich vor dem Problem gestanden, mit welcher art von Steuerung ich gerne den Charakter des Spielers bewegen möchte. Sicherlich könnte man ihn einfach auf der X und Y Achse bewegen, jedoch finde ich das diese art der Steuerung schon in die Jahre gekommen ist und selbst in einem heutigem 2D oder 2.5D Spiel eher nichts mehr zu suchen haben sollte. Deswegen habe ich mir überlegt, dass der Spieler die Möglichkeit haben sollte mit der Maus den Charakter zu bewegen bzw die Laufrichtung festzulegen.
Der Ablauf der ganzen Steuerung funktioniert im Grunde wie folgt, Wir haben 2 Punkte, die des Objektes und die der Maus. Mithilfe dieser zwei punkte können wir nun den Winkel zueinander berechnen, danach das Objekt anhand des zuvor berechneten Winkels rotieren und darauf zubewegen lassen.
Hier könnt ihr euch das ganze mal anschauen, wie es Funktioniert: streamable.com/7xscb
Hallo, da ich mich die letzten Monate sehr mit der Spielentwicklung auseinander gesetzt habe, und somit auch mit der Steuerung von Objekten, habe ich vor dem Problem gestanden, mit welcher art von Steuerung ich gerne den Charakter des Spielers bewegen möchte. Sicherlich könnte man ihn einfach auf der X und Y Achse bewegen, jedoch finde ich das diese art der Steuerung schon in die Jahre gekommen ist und selbst in einem heutigem 2D oder 2.5D Spiel eher nichts mehr zu suchen haben sollte. Deswegen habe ich mir überlegt, dass der Spieler die Möglichkeit haben sollte mit der Maus den Charakter zu bewegen bzw die Laufrichtung festzulegen.
Der Ablauf der ganzen Steuerung funktioniert im Grunde wie folgt, Wir haben 2 Punkte, die des Objektes und die der Maus. Mithilfe dieser zwei punkte können wir nun den Winkel zueinander berechnen, danach das Objekt anhand des zuvor berechneten Winkels rotieren und darauf zubewegen lassen.
Hier könnt ihr euch das ganze mal anschauen, wie es Funktioniert: streamable.com/7xscb
C-Quellcode
- import javax.swing.*;
- import java.awt.*;
- import java.awt.event.*;
- import java.awt.geom.AffineTransform;
- /**
- * Simples Beispiel um ein Objekt auf die Maus zubewegen zu lassen
- */
- public class Main extends JPanel implements KeyListener, MouseListener, MouseMotionListener {
- private int width = 100;
- private int height = 100;
- private int x = (800 / 2) - (width / 2) ;
- private int y = (600 / 2) - (height / 2);
- private double rota = 0;
- int speed = 5;
- /**
- * Startet das Programm
- */
- public static void main(String[] args) {
- JFrame frame = new JFrame();
- frame.setSize(800,600);
- frame.setTitle("Beispiel: Bewegen in Richtung der Maus");
- frame.setVisible(true);
- Main pane = new Main();
- frame.add(pane);
- }
- /**
- * Constuctor der Klasse, hier werden alle actionlistener hinzugefügt.
- */
- public Main() throws HeadlessException {
- this.addKeyListener(this);
- this.addMouseListener(this);
- this.addMouseMotionListener(this);
- this.setFocusable(true);
- }
- /**
- * Zeichnen unseres Objektes das wir bewegen möchten.
- */
- @Override
- public void paintComponent(Graphics g) {
- super.paintComponent(g);
- System.out.println(rota + " - " + Math.toRadians(rota));
- Graphics2D g2d = (Graphics2D) g;
- g2d.rotate(Math.toRadians(rota), x + width /2,y + height / 2);
- g2d.drawRect(x,y,width,height);
- g2d.drawLine(x + width, y + height /2 , x + width + 30, y + height / 2);
- }
- @Override
- public void keyTyped(KeyEvent e) {
- }
- /**
- * Wenn nun der Button "W" gedrückt wird, soll sich das Objekt auf die Maus zubewegen. Hierzu muss
- * die variable rota von grad in radians umgewandelt werden.
- * @param e
- */
- @Override
- public void keyPressed(KeyEvent e) {
- if(e.getKeyCode() == KeyEvent.VK_W)
- {
- float rAngel = (float) Math.toRadians(rota);
- x += speed * Math.cos(rAngel);
- y += speed * Math.sin(rAngel);
- }
- this.repaint();
- }
- @Override
- public void keyReleased(KeyEvent e) {
- }
- /**
- * Berechnet den Winkel zwischen der Maus und dem Objekt und speichert diesen
- * in der variable rota
- */
- @Override
- public void mouseClicked(MouseEvent e) {
- int oX = x + width / 2;
- int oY = y + height / 2;
- float rAngel = (float) Math.atan2(e.getY() - oY, e.getX() - oX);
- rota = (float) Math.toDegrees(rAngel);
- System.out.println(rota);
- }
- @Override
- public void mousePressed(MouseEvent e) {
- }
- @Override
- public void mouseReleased(MouseEvent e) {
- }
- @Override
- public void mouseEntered(MouseEvent e) {
- }
- @Override
- public void mouseExited(MouseEvent e) {
- }
- @Override
- public void mouseDragged(MouseEvent e) {
- }
- /**
- * Berechnet den Winkel zwischen der Maus und dem Objekt und speichert diesen
- * in der variable rota
- */
- @Override
- public void mouseMoved(MouseEvent e) {
- int oX = x + width / 2;
- int oY = y + height / 2;
- float rAngel = (float) Math.atan2(e.getY() - oY, e.getX() - oX);
- rota = (float) Math.toDegrees(rAngel);
- this.repaint();
- }
- }
Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von „Andy“ ()