Главная » Статьи » Игры на java |
Виктор Курышев -Java разработка игры с нуля - логическое завершение кода
Смотри видео:
Для стрельбы одиночными выстрелами в методе обновления игрока - после добавления новой пули в список пуль установим запрет стрельбы - isFiring = false Классы в которых нужно произвести изменения: package kuzma_bubleshooter2D; import java.awt.*; /** главный герой игры */ public class Player { private double x;//координа х героя private double y; private int r; // радиус героя private int speed;// скорость private Color color1;// цвет private Color color2;// цвет2 // стаич прем - кавиши перемещения public static boolean up; public static boolean down; public static boolean left; public static boolean right; private double dx;// смещение private double dy; public static boolean isFiring;//стрельба private double health; // Constructor public Player(){ x = GamePanel.WIDTH / 2;// нач координаты героя y = GamePanel.HEIGHT / 2; r = 5; speed = 5; color1 = Color.WHITE; health = 3; // смещение dx = 0; dy = 0; // нач знач клавиш up = false; down = false; left = false; right = false; isFiring = false; } // гетеры public double getX(){ return x; } public double getY(){ return y; } public double getR(){ return r; } // - здоровья public void hit() { health--; System.out.println(health); } // обновления public void update(){ // смещение героя по игровому полю if (up && y >r){ y -= speed; } if (down && y <GamePanel.HEIGHT -r){ y += speed; } if (left && x >r){ x -= speed; } if (right && x <GamePanel.WIDTH -r){ x += speed; } if(up && left || up && right || down && left || down && right){ dy = dy * Math.sin(Math.toRadians(45)); dx = dx * Math.cos(Math.toRadians(45)); } y += dy; x += dy; dy = 0; dx = 0; if (isFiring){ // если стрельба true GamePanel.bullets.add(new Bullet()); isFiring = false; } } // отрисовка героя public void draw(Graphics2D g){ g.setColor(color1); g.fillOval((int) (x-r),(int) (y-r), 2*r,2*r); g.setStroke(new BasicStroke(3)); g.setColor(color1.darker()); g.drawOval((int) (x-r),(int) (y-r), 2*r,2*r); g.setStroke(new BasicStroke(1)); } } _________________________________________________________ Для привязки полета пули по прицелу(курсор мышки) - добавим переменные: distX и distY. distX = GamePanel.mouseX - x (разница по х от мышки до пули) distY = y - GamePanel.mouseY Закон изменения положения пули на поле : y = y - speed*distY/(Math.sqrt(distX*distX + distY*distY)) x = x + speed*distX/(Math.sqrt(distX*distX + distY*distY)) package kuzma_bubleshooter2D; import java.awt.*; /** * пуля */ public class Bullet { private double x; private double y; private int r; private Color color; private int speed; //private double bulletDX;//смещение по х //private double bulletDY;// private double distX;// разница по х от мышки до пули private double distY;// //private double dist;// расстояние от мышки до пули // Constructor public Bullet(){ // присвиваем нач положение пули = коодинатам героя x = GamePanel.player.getX(); y = GamePanel.player.getY(); r = 2;// радиус пули speed = 20; // скорость distX = GamePanel.mouseX - x ;// разница по х от мышки до пули distY = y - GamePanel.mouseY ; color = Color.WHITE;// цвет */ } // геттеры public double getX() { return x; } public double getY() { return y; } public int getR() {//для получения радиуса return r;} // смещение пули public void update(){ //y = y - speed; y = y - speed*distY/(Math.sqrt(distX*distX + distY*distY)) ; x = x + speed*distX/(Math.sqrt(distX*distX + distY*distY)); } // отрисовка public void draw(Graphics2D g){ g.setColor(color);//передаём цвет g.fillOval((int)x,(int)y,r, 2*r);//рисуем пулю } // проверка где пуля public boolean remove_f(){ if(y < 0) { //если вылетела return true; } return false; } } ___________________________________________________________ Для одиночной стрельбы вводим переменную перезарядки private boolean isFiring_on И вносим изменения в обработчики событий клавиши - пробел и кнопки мышки. package kuzma_bubleshooter2D; import java.awt.event.*; /** обработчик событий */ public class Listeners implements MouseListener, KeyListener, MouseMotionListener { // проверка нажатой клавиши private boolean isFiring_on; // дослать патрон public void keyPressed(KeyEvent e) { int key = e.getKeyCode();// получить код нажатой клавиши // проверка клавиши if (key == KeyEvent.VK_W) { Player.up = true; } if (key == KeyEvent.VK_S) { Player.down = true; } if (key == KeyEvent.VK_A) { Player.left = true; } if (key == KeyEvent.VK_D) { Player.right = true; } if (key == KeyEvent.VK_SPACE) { if (isFiring_on)// если патрон в патроннике Player.isFiring = true; //стрельба разрешена isFiring_on = false; // нет патрона } if (key == KeyEvent.VK_ESCAPE) { GamePanel.state = GamePanel.STATES.MENUE; } } // проверка отжатой клавиши public void keyReleased(KeyEvent e){ int key = e.getKeyCode(); if (key == KeyEvent.VK_W) { Player.up = false; } if (key == KeyEvent.VK_S) { Player.down = false; } if (key == KeyEvent.VK_A) { Player.left = false; } if (key == KeyEvent.VK_D) { Player.right = false; } if (key == KeyEvent.VK_SPACE) { Player.isFiring = false; isFiring_on = true; // патрон в патроннике } } public void keyTyped(KeyEvent e){ } @Override public void mouseClicked(MouseEvent e) { //GamePanel.player.isFiring = true; } @Override public void mousePressed(MouseEvent e) { if (e.getButton() == MouseEvent.BUTTON1) { GamePanel.leftMouse = true; // if (isFiring_on) Player.isFiring = true; //isFiring_on = false; } } public void mouseReleased(MouseEvent e){ if (e.getButton() == MouseEvent.BUTTON1) { GamePanel.player.isFiring = false; //isFiring_on = true; GamePanel.leftMouse = false; } } @Override public void mouseEntered(MouseEvent e) { } @Override public void mouseExited(MouseEvent e) { } @Override public void mouseDragged(MouseEvent e) {// метод переноса мышкой GamePanel.mouseX = e.getX();// получаем коорд. мыши GamePanel.mouseY = e.getY();// } @Override public void mouseMoved(MouseEvent e) { GamePanel.mouseX = e.getX();// GamePanel.mouseY = e.getY();// } } | |
Просмотров: 1950 | |
Всего комментариев: 0 | |