Главная » Статьи » Игры на 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) {

 }

}

Категория: Игры на java | Добавил: kuzma (23.02.2017)
Просмотров: 493 | Рейтинг: 0.0/0
Всего комментариев: 0
avatar

Программирование игр на Python

Django - создание сайтов с нуля

Javascript - просто используем готовые решения