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;
public static Menue menue;
private int FPS;//
private double millisToFPS;// fps в миллсек
private long timerFPS;// таймер fps
private int sleepTime; //сколько он будет спать
private enum STATES{MENUE,PLAY} //обьявляем перечсления
private STATES state = STATES.MENUE;// переменная меню
// конструктор
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();
menue = new Menue();//
while (true) { // игровой цикл
if (state.equals(STATES.MENUE)){// если пер state == MENUE
background.update();// фон
background.draw(g);// рисуем фон
menue.draw(g);// рисуем меню
gameDraw();// перерсовываем на панель
}
if (state.equals(STATES.PLAY)){// ира
gameUpdate(); //обновление
gameRender(); //перерисовка
gameDraw(); ////перенос изображения на панель
}
timerFPS = System.nanoTime();// присвоим текущ время
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.*;
import java.io.Console;
/**
* меню игры
*/
public class Menue {
private int buttonWidth;//шширина кнопки
private int buttonHeight;//высота кнопки
private Color color1;//цвет
private String s;//надпись
//
public Menue(){
buttonWidth = 120;
buttonHeight =60;
color1 = Color.WHITE ;
s = "Старт";
}
public void draw(Graphics2D g){
g.setColor(color1);//передаём цвет
g.setStroke(new BasicStroke(3));//обводка
g.drawRect(GamePanel.WIDTH/2-buttonWidth/2,GamePanel.HEIGHT/2-buttonHeight/2,buttonWidth,buttonHeight);//квадрат по центру
g.setStroke(new BasicStroke(1));//обводка
g.setColor(color1);//передаем цвет
g.setFont(new Font("Consolas",Font.BOLD,40));//передаем шрифт
long length = (int) g.getFontMetrics().getStringBounds(s,g).getWidth();//ширина строки
g.drawString(s,(int)(GamePanel.WIDTH/2-length/2),(int)(GamePanel.HEIGHT/2+buttonHeight/4));//рисуем надпись
}
}
|