Движение объекта (квадрата) по экрану, управление клавишами-стрелками и WASD - Java

Узнай цену своей работы

Формулировка задачи:

Всем доброго времени суток! Всё, что нужно от программы: двигать квадрат размером 20*20 кв. пикселей клавишами вверх-влево-вниз-вправо, а так же клавишами WASD. И от того, нажата ли Shift одновременно с вышеназванными клавишами, зависит длина шага этого квадрата. Проблема в том, что фигура отрисовывается нормально, и прога никаких ошибок в консоль не выводит, но квадрат не реагирует на клавиши. Вообще. Тупо стоит на месте. Скорее всего (на мой взгляд), проблема связана с фокусом, да вот сам не разбираюсь ещё в таких вещах, поэтому могу ошибиться. Подскажите, что не так? Вот код:
Листинг программы
  1. import java.awt.Color;
  2. import java.awt.Graphics;
  3. import java.awt.Graphics2D;
  4. import java.awt.Toolkit;
  5. import java.awt.event.KeyAdapter;
  6. import java.awt.event.KeyEvent;
  7. import java.awt.geom.Rectangle2D;
  8. import javax.swing.JFrame;
  9. import javax.swing.JPanel;
  10. public class SwingSquareMoving {
  11. public static void main(String[] args) {
  12. SwingSquareMovingFrame frame=new SwingSquareMovingFrame();
  13. frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  14. frame.setVisible(true);
  15. }
  16. }
  17. class SwingSquareMovingFrame extends JFrame {
  18. SwingSquareMovingFrame() {
  19. int screenWidth=Toolkit.getDefaultToolkit().getScreenSize().width;
  20. int screenHeight=Toolkit.getDefaultToolkit().getScreenSize().height;
  21. setLocation(screenWidth/6, screenHeight/6);
  22. setSize((screenWidth*2)/3, (screenHeight*2)/3);
  23. setTitle("Square Moving Test Program");
  24. setContentPane(new SquareView());
  25. }
  26. }
  27. class SquareModel {
  28. SquareModel(int squareX, int squareY, int squareSide) {
  29. x=squareX;
  30. y=squareY;
  31. side=squareSide;
  32. }
  33. public Rectangle2D createSquare() {
  34. return new Rectangle2D.Float((float)x, (float)y, (float)side, (float)side);
  35. }
  36. public int getX() {
  37. return x;
  38. }
  39. public int getY() {
  40. return y;
  41. }
  42. public int getSide() {
  43. return side;
  44. }
  45. public void setX(int inputX) {
  46. x=inputX;
  47. }
  48. public void setY(int inputY) {
  49. y=inputY;
  50. }
  51. public void setSide(int inputSide) {
  52. side=inputSide;
  53. }
  54. private int x;
  55. private int y;
  56. private int side;
  57. }
  58. class SquareView extends JPanel {
  59. SquareView() {
  60. data=new SquareModel(INITIAL_X, INITIAL_Y, SQUARE_SIDE);
  61. square=data.createSquare();
  62. addKeyListener(new SquareController());
  63. setFocusable(true);
  64. }
  65. public void moveSquare(int dx, int dy) {
  66. data.setX(data.getX()+dx);
  67. data.setY(data.getY()+dy);
  68. square=data.createSquare();
  69. repaint();
  70. }
  71. public void paintComponent(Graphics g) {
  72. super.paintComponent(g);
  73. Graphics2D g2=(Graphics2D)g;
  74. g2.setPaint(Color.BLUE);
  75. g2.fill(square);
  76. }
  77. private SquareModel data;
  78. private Rectangle2D square;
  79. public static final int INITIAL_X=100;
  80. public static final int INITIAL_Y=100;
  81. public static final int SQUARE_SIDE=20;
  82. private class SquareController extends KeyAdapter {
  83. public void KeyPressed(KeyEvent event) {
  84. int keyCode=event.getKeyCode();
  85. int d;
  86. if(event.isShiftDown()) d=STEP_INCREMENT;
  87. else d=PIXEL_INCREMENT;
  88. if(keyCode==KeyEvent.VK_LEFT) moveSquare(-d, 0);
  89. else if(keyCode==KeyEvent.VK_RIGHT) moveSquare(d, 0);
  90. else if(keyCode==KeyEvent.VK_UP) moveSquare(0, -d);
  91. else if(keyCode==KeyEvent.VK_DOWN) moveSquare(0, d);
  92. }
  93. public void KeyTyped(KeyEvent event) {
  94. char keyChar=event.getKeyChar();
  95. int d;
  96. if(Character.isUpperCase(keyChar)) {
  97. d=STEP_INCREMENT;
  98. keyChar=Character.toLowerCase(keyChar);
  99. } else {
  100. d=PIXEL_INCREMENT;
  101. }
  102. if(keyChar=='a' || keyChar=='ф') moveSquare(-d, 0);
  103. else if(keyChar=='d' || keyChar=='в') moveSquare(d, 0);
  104. else if(keyChar=='w' || keyChar=='ц') moveSquare(0, -d);
  105. else if(keyChar=='s' || keyChar=='ы'|| keyChar=='і') moveSquare(0, d);
  106. }
  107. public static final int PIXEL_INCREMENT=1;
  108. public static final int STEP_INCREMENT=SQUARE_SIDE;
  109. }
  110. }
P.S. Потоки и исключения ещё не учил, а потому хочу реализовать данную программу с минимум необходимых знаний. Конечно, если это получится. В противном случае - пните по нужным темам для изучения. И да, каково качество исполнения схемы MVC?

Решение задачи: «Движение объекта (квадрата) по экрану, управление клавишами-стрелками и WASD»

textual
Листинг программы
  1. package easybudda.movingsquare;
  2.  
  3. import javax.swing.SwingUtilities;
  4. import javax.swing.JFrame;
  5.  
  6. public class MovingSquare {
  7.  
  8.     public static void main(String[] args) {
  9.         SwingUtilities.invokeLater(new Runnable() {
  10.             @Override
  11.             public void run() {
  12.                 JFrame frm = new JFrame("Moving Square");
  13.                 frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  14.                 frm.add(new PaintPanel());
  15.                 frm.pack();
  16.                 frm.setVisible(true);
  17.             }
  18.         });
  19.     }
  20. }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 3.909 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы