Главная » Статьи » Игры на java |
Виктор Курышев -Java разработка игры с нуля (мышка)
Управление стрельбой героя левой клавишей мышки. package kuzma_bubleshooter2D; import java.awt.*; import java.awt.image.BufferedImage; import java.util.ArrayList; import javax.swing.*; public class GamePanel extends JPanel implements Runnable { // задаём размер панели public static int WIDTH = 600; public static int HEIGHT = 600; private Thread thread; // Создаем поток- ссылка на обьект класса Thread private BufferedImage image; // ссылка на обьект класса private Graphics2D g; // ссылка на обьект класса public static GameBack background;// ссылка на обьект класса public static Player player;// ссылка на обьект класса public static ArrayList<Bullet> bullets; public static ArrayList<Enemy> enemies; public static Wave wave; private int FPS;// private double millisToFPS;// fps в миллсек private long timerFPS;// таймер fps private int sleepTime; //сколько он будет спать // конструктор public GamePanel() { super(); // активируем консруктор родителя setPreferredSize(new Dimension(WIDTH, HEIGHT)); // размер передаем в обьект класса Измерения setFocusable(true); //передаем фокус requestFocus(); // акивируем addMouseListener( new Listeners());// добавляем обработчик событий addKeyListener( new Listeners());// добавляем обработчик событий } // запуск потока public void start() { thread = new Thread((Runnable) this); thread.start();// запускаем поток } //метод от интерфейса Runnable (потока) @Override public void run() { FPS = 30; // задаем желаемый FPS millisToFPS = 1000/FPS; //пересчет в миллисек sleepTime = 0; image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB); g = (Graphics2D) image.getGraphics(); g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);//сглаживание соседних пиксеей background = new GameBack(); player = new Player(); bullets = new ArrayList<Bullet>(); enemies = new ArrayList<Enemy>(); wave = new Wave(); while (true) { // игровой цикл timerFPS = System.nanoTime();// присвоим текущ время gameUpdate(); //обновление gameRender(); //перерисовка gameDraw(); ////перенос изображения на панель timerFPS = (System.nanoTime()-timerFPS)/1000000;//сколько прошло миллсек на операции выше if(millisToFPS > timerFPS){ sleepTime = (int)(millisToFPS - timerFPS); } else sleepTime = 1; try { thread.sleep(sleepTime); //засыпаем на ... мс } catch (InterruptedException ex) { //если не удается заснуть- исключение ex.printStackTrace(); } timerFPS = 0;// обнуляем таймер sleepTime = 1;// обновляем время сна } } //обновление public void gameUpdate() { //обновление background.update();// вызов метода для заднего плана player.update();// обновление //bullets.update for (int i = 0; i < bullets.size(); i++) { bullets.get(i).update();// обновлям текущую пулю boolean remove_p = bullets.get(i).remove_f();//текущую пулю проверяем где она if (remove_p) { // если правдиво(улетела) bullets.remove(i);//удаляем пулю которая вылетела i--;// } } //enemies.update for (int i = 0; i < enemies.size(); i++) { enemies.get(i).update();// обновлям текущего врага } //столкновение пули с врагом for (int i = 0; i < enemies.size(); i++) {// каждого врвгв из списка Enemy e = enemies.get(i); // выделяем элемент списка double ex = e.getX();// получаем коорд элемента double ey = e.getY(); //по списку пуль for (int j = 0; j < bullets.size(); j++) { Bullet b = bullets.get(j);// выделяем элемент списка double bx = b.getX();// получаем коорд элемента double by = b.getY(); double dx = ex - bx;// вычисляем разницу коорд элементов double dy = ey - by; double dist = Math.sqrt(dx * dx + dy * dy); // расстояние от друг друга if ((int) dist <= e.getR() + b.getR()) { // если расстояние от друг друга меньше двух радиусов e.hit();// метод уменьшения здоровья врага bullets.remove(j); // удаляем пулю из списка //Проверка здоровья врага boolean remove_p = e.remove_f(); // пер присваив значение метода пров здоров врага if (remove_p) { // если правдиво enemies.remove(i);// удалить элемент из списка врагов i--; // break;} } } } // Столкновение героя с врагом for (int i = 0; i < enemies.size(); i++) {// каждого врвгв из списка Enemy e = enemies.get(i); // выделяем элемент списка double ex = e.getX();// получаем коорд элемента double ey = e.getY(); double px = player.getX();// получаем коорд элемента double py = player.getY(); double er = player.getR(); double dx = ex - px;// вычисляем разницу коорд элементов double dy = ey - py; double dist = Math.sqrt(dx * dx + dy * dy); // расстояние от друг друга if ((int) dist < e.getR() + player.getR()) { // если расстояние от друг друга меньше двух рад e.hit(); player.hit(); //Проверка здоровья врага boolean remove_p = e.remove_f(); // пер присваив значение метода пров здоров врага if (remove_p) { // если правдиво enemies.remove(i);// удалить элемент из списка врагов i--; } } } // Вонна обновить Wave update wave.update(); } //рисуем в виртуальном окне public void gameRender() { //перерисовка background.draw(g);// вызов метода для заднего плана player.draw(g); //перерисовка - вызов метода для bullet for (int i = 0; i < bullets.size(); i++) { bullets.get(i).draw(g); } //перерисовка - вызов метода для enemies for(int i = 0; i<enemies.size(); i++) { enemies.get(i).draw(g);// рисуем текущего врага } //перерисовка - вызов метода для волны //wave.draw(g);// вызов метода перерисовки для волны if (wave.showWave()){ wave.draw(g);// вызов метода перерисовки для волны } } //перенос изображения на панель private void gameDraw() { Graphics g2 = this.getGraphics();// переоппред Graphics2d на Graphics g2.drawImage(image, 0, 0, null);// рисуем g2.dispose();// команда для уборщщика мусора } } _________________________________________________________________________ package kuzma_bubleshooter2D; import java.awt.event.*; /** обработчик событий */ public class Listeners implements MouseListener, KeyListener { // проверка нажатой клавиши public void keyPressed(KeyEvent e) { int key = e.getKeyCode();// получить код нажатой клавиши // проверка клавиши if (key == KeyEvent.VK_UP) { Player.up = true; } if (key == KeyEvent.VK_DOWN) { Player.down = true; } if (key == KeyEvent.VK_LEFT) { Player.left = true; } if (key == KeyEvent.VK_RIGHT) { Player.right = true; } if (key == KeyEvent.VK_SPACE) { Player.isFiring = true; } } // проверка отжатой клавиши public void keyReleased(KeyEvent e){ int key = e.getKeyCode(); if (key == KeyEvent.VK_UP) { Player.up = false; } if (key == KeyEvent.VK_DOWN) { Player.down = false; } if (key == KeyEvent.VK_LEFT) { Player.left = false; } if (key == KeyEvent.VK_RIGHT) { Player.right = false; } if (key == KeyEvent.VK_SPACE) { Player.isFiring = false; } } public void keyTyped(KeyEvent e){ } @Override public void mouseClicked(MouseEvent e) { } @Override public void mousePressed(MouseEvent e) { if (e.getButton() == MouseEvent.BUTTON1) { GamePanel.player.isFiring = true; } } public void mouseReleased(MouseEvent e){ if (e.getButton() == MouseEvent.BUTTON1) { GamePanel.player.isFiring = false; } } @Override public void mouseEntered(MouseEvent e) { } @Override public void mouseExited(MouseEvent e) { } } | |
Просмотров: 493 | |
Всего комментариев: 0 | |