Главная » Статьи » Игры на java |
Первая игра на Java (часть-5)
package jgames1; import javax.swing.*; /** * Created by nikelen on 2017-01-29. */ public class Main { public static void main(String[] args) { JFrame f = new JFrame("JGames");// создаем окно с названием f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// закрытие окна при клике крестика f.setSize(1100,600); // размер окна f.add(new Road());// добвляем в фрейм дорогу(класс) f.setVisible(true); // окно видемо } } ---------------------------------------------------- ------------------------------- ----------------------------- package jgames1; import javax.swing.*; import javax.swing.Timer; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.util.*; import java.util.List; /** * Created by nikelen on 2017-01-29. */ public class Road extends JPanel implements ActionListener,Runnable { // класс дорога помещаем на панель Timer mainTimer = new Timer(20,this);// Таймер(класс) будет каждые 20мс запускать какую то функцию actionPerformed(this) Image img = new ImageIcon("res/dor.jpg").getImage();//загрузка картинки дороги Player p = new Player();// инициализ класс плеер Thread enemiesFactory= new Thread(this); // создаём параллельный поток(порождает соперников) List<Enemy> enemies = new ArrayList<Enemy>(); // создём список для хрнения противников public Road(){// конструктор mainTimer.start(); //запуск Таймера enemiesFactory.start();//запуск парал потока addKeyListener(new MyKeyAdapter()); // добавляем обработчик соб. клавиатуры setFocusable(true);//делаем дорогу в фокусе (для нажатия клавиш) } private class MyKeyAdapter extends KeyAdapter {// наследуем класс обработчик, в котором все методы пустые(реализуем нужные) public void keyPressed(KeyEvent e){ // перегружаем метод нажатия клавиши p.keyPressed(e); // вызов метода keyPressed для рlayer } public void keyReleased(KeyEvent e){ // перегружаем метод отпускания клавиши p.keyReleased(e); // вызов метода для рlayer } } public void paint(Graphics g) { // метод перерисовывает панель g = (Graphics2D) g;// приведение типов(рисует Graphics2D) g.drawImage(img, p.layer1, 0, null); //рисуем(что,x-слой1 и у не изменяем,...) g.drawImage(img, p.layer2, 0, null); g.drawImage(p.img, p.x, p.y, null);//рисуем(для плеер метод имж,х-плеер и у-плеер,...) g.setColor(Color.WHITE);//задаем цвет объекту Соlor Font font = new Font("Arial",Font.ITALIC,20);//Создём объект класса фонт (передаем в конструктор параметры) g.setFont(font);//устанвливаем наш шрифт font double v = (200/Player.MAX_V) * p.v;// расчет скорости ((Graphics2D) g).drawString("Скорость:" + v +" km/h",100,30 );//отрисовываем строку скорости Iterator<Enemy> i = enemies.iterator();// итератор(цикл) по списку соперников while (i.hasNext()){ //пока сущ элемент Enemy e = i.next();//создаем новый объект из текущего элемента if(e.x >= 2400 || e.x <= -2400){// если координаты элемента списка соперников >или< i.remove();// удаляем элемент из списка соперников } else { e.move();// к элементу применяем метод перемещения g.drawImage(e.img,e.x,e.y,null);//отрисовываем элемент в координатах } } } public void actionPerformed(ActionEvent e) {//// обновление событий каждые 20мс p.move(); //плеер перемещается repaint(); //перересовывет всё testCollisionWithEnemies();// проверка столкновений
testWin();// проверка выиграша в игре
}
private void testWin() { // метод проверки на выиграш
if (p.s > 40000){
JOptionPane.showMessageDialog(null,"ПОБЕДА!!!!!");
System.exit(0);
}
}
private void testCollisionWithEnemies(){ // метод проверки столкновений Iterator<Enemy> i = enemies.iterator();// итератор по списку соперников while (i.hasNext()){ // Enemy e = i.next(); // if (p.getRect().intersects(e.getRect())){ // если плеер столкнулся с элементом списка соперников JOptionPane.showMessageDialog(null,"BOOM!!!! BOOM!!!"); System.exit(1); //выход в систему } } } @Override public void run(){// метод Runnable(точка входа во второй поток) while (true){ // бесконечный цикл создания соерников Random rand = new Random();// ссылка на Рандом try { Thread.sleep(rand.nextInt(2000));//засыпаем рандомно от0 о 2000мс enemies.add(new Enemy(1200,rand.nextInt(600), rand.nextInt(60),this));// добвляем соперника в рандом координатах }catch (InterruptedException e){ // e.printStackTrace(); } } } } ----------------------------------- ------------------------------------------------- ------------------------------------- package jgames1; import javax.swing.*; import java.awt.*; import java.awt.event.KeyEvent; /** * Created by nikelen on 2017-01-29. */ public class Player { public static final int MAX_V = 100; //мах ускорение public static final int MAX_TOP = 10;// мах верх положение public static final int MAX_BOTTOM = 480;// мах нижнее положение Image img_c = new ImageIcon("res/f1.png").getImage();//загрузка картинки машина прямо Image img_l = new ImageIcon("res/f_l1.png").getImage();//загрузка картинки машина влево Image img_r = new ImageIcon("res/f_r1.png").getImage();//загрузка картинки машина вправо Image img = img_c;//загрузка картинки по умолчанию int v = 0; // скорость int dv = 0; // ускорение int s = 0; //путь int x = 30; // нач координаты int y = 100; int dy = 0; int layer1 = 0; // первый слой(дорога) int layer2 = 1200; public Rectangle getRect(){ // получение прямоугоьников из машинки return new Rectangle(x,y,110,40); //возвращаем конструктор с размером машинки } public void move() { // метод движения s+= v; // путь увеличивается v +=dv;// скорость увеличивается if (v <= 0) v = 0;//если скорость =0 if (v>= MAX_V) v = MAX_V;// если скорость болье мах y-=dy;// изменение координаты у(зависит от поворота) if (y<= MAX_TOP) y = MAX_TOP;// верхняя граница if (y>= MAX_BOTTOM) y = MAX_BOTTOM;// нижняя граница if (layer2 -v <= 0){// цикл показа слоёв дороги layer1 = 0; layer2 = 1200; } else{ layer1 -= v;//слой уменьется layer2 -= v; } } public void keyPressed(KeyEvent e){ //метод обработки события нажатие клавиши int key = e.getKeyCode();//получаем код нажатой клавиши if (key == KeyEvent.VK_RIGHT) {// если курс влево dv = 5; //ускорение + } if (key == KeyEvent.VK_LEFT) {// если курс влево dv = -5; //ускорение - } if (key == KeyEvent.VK_UP) {// если курс вверх dy = 10; //поворот + img = img_l;//меняем каринку (поворот машины) } if (key == KeyEvent.VK_DOWN) {// если курс вниз dy = -10; //поворот - img = img_r;//меняем каринку (поворот машины) } } public void keyReleased(KeyEvent e) { //метод обработки события отуск клавиши int key = e.getKeyCode();//получаем код нажатой клавиши if (key == KeyEvent.VK_RIGHT || key == KeyEvent.VK_LEFT) {// если курс влево dv = 0; //ускорение 0 } if (key == KeyEvent.VK_UP || key == KeyEvent.VK_DOWN) {// если курс влево dy = 0; //поворот 0 img = img_c; // меняем картинку(машина прямо) } } } ------------------------------------------------ -------------- -------------------------------------------------- package jgames1; import javax.swing.*; import java.awt.*; /** * Created by nikelen on 2017-01-31. */ public class Enemy { Image img = new ImageIcon("res/f1.png").getImage();//загрузка картинки int v = 0; // скорость //int dv = 0; // ускорение //int s = 0; //путь int x = 30; // нач координаты int y = 100; //int dy = 0; Road road; // создаём поле дорога public Rectangle getRect(){ // получение прямоугоьников из машинки return new Rectangle(x,y,110,40); //возвращаем конструктор с размером машинки } public Enemy (int x,int y, int v, Road road ){ // конструктор this.x = x; this.y = y; this.v = v; this.road = road; } public void move(){ // метод движения x = x - road.p.v + v; // изменение положения врага } } ########################################################################
| |
Просмотров: 416 | |
Всего комментариев: 0 | |