Simples Beispiel für das Bewegen eines Objektes in Richtung der Maus

  • Java

    Simples Beispiel für das Bewegen eines Objektes in Richtung der Maus

    *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


    C-Quellcode

    1. import javax.swing.*;
    2. import java.awt.*;
    3. import java.awt.event.*;
    4. import java.awt.geom.AffineTransform;
    5. /**
    6. * Simples Beispiel um ein Objekt auf die Maus zubewegen zu lassen
    7. */
    8. public class Main extends JPanel implements KeyListener, MouseListener, MouseMotionListener {
    9. private int width = 100;
    10. private int height = 100;
    11. private int x = (800 / 2) - (width / 2) ;
    12. private int y = (600 / 2) - (height / 2);
    13. private double rota = 0;
    14. int speed = 5;
    15. /**
    16. * Startet das Programm
    17. */
    18. public static void main(String[] args) {
    19. JFrame frame = new JFrame();
    20. frame.setSize(800,600);
    21. frame.setTitle("Beispiel: Bewegen in Richtung der Maus");
    22. frame.setVisible(true);
    23. Main pane = new Main();
    24. frame.add(pane);
    25. }
    26. /**
    27. * Constuctor der Klasse, hier werden alle actionlistener hinzugefügt.
    28. */
    29. public Main() throws HeadlessException {
    30. this.addKeyListener(this);
    31. this.addMouseListener(this);
    32. this.addMouseMotionListener(this);
    33. this.setFocusable(true);
    34. }
    35. /**
    36. * Zeichnen unseres Objektes das wir bewegen möchten.
    37. */
    38. @Override
    39. public void paintComponent(Graphics g) {
    40. super.paintComponent(g);
    41. System.out.println(rota + " - " + Math.toRadians(rota));
    42. Graphics2D g2d = (Graphics2D) g;
    43. g2d.rotate(Math.toRadians(rota), x + width /2,y + height / 2);
    44. g2d.drawRect(x,y,width,height);
    45. g2d.drawLine(x + width, y + height /2 , x + width + 30, y + height / 2);
    46. }
    47. @Override
    48. public void keyTyped(KeyEvent e) {
    49. }
    50. /**
    51. * Wenn nun der Button "W" gedrückt wird, soll sich das Objekt auf die Maus zubewegen. Hierzu muss
    52. * die variable rota von grad in radians umgewandelt werden.
    53. * @param e
    54. */
    55. @Override
    56. public void keyPressed(KeyEvent e) {
    57. if(e.getKeyCode() == KeyEvent.VK_W)
    58. {
    59. float rAngel = (float) Math.toRadians(rota);
    60. x += speed * Math.cos(rAngel);
    61. y += speed * Math.sin(rAngel);
    62. }
    63. this.repaint();
    64. }
    65. @Override
    66. public void keyReleased(KeyEvent e) {
    67. }
    68. /**
    69. * Berechnet den Winkel zwischen der Maus und dem Objekt und speichert diesen
    70. * in der variable rota
    71. */
    72. @Override
    73. public void mouseClicked(MouseEvent e) {
    74. int oX = x + width / 2;
    75. int oY = y + height / 2;
    76. float rAngel = (float) Math.atan2(e.getY() - oY, e.getX() - oX);
    77. rota = (float) Math.toDegrees(rAngel);
    78. System.out.println(rota);
    79. }
    80. @Override
    81. public void mousePressed(MouseEvent e) {
    82. }
    83. @Override
    84. public void mouseReleased(MouseEvent e) {
    85. }
    86. @Override
    87. public void mouseEntered(MouseEvent e) {
    88. }
    89. @Override
    90. public void mouseExited(MouseEvent e) {
    91. }
    92. @Override
    93. public void mouseDragged(MouseEvent e) {
    94. }
    95. /**
    96. * Berechnet den Winkel zwischen der Maus und dem Objekt und speichert diesen
    97. * in der variable rota
    98. */
    99. @Override
    100. public void mouseMoved(MouseEvent e) {
    101. int oX = x + width / 2;
    102. int oY = y + height / 2;
    103. float rAngel = (float) Math.atan2(e.getY() - oY, e.getX() - oX);
    104. rota = (float) Math.toDegrees(rAngel);
    105. this.repaint();
    106. }
    107. }

    Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von „Andy“ ()