Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Java программирование > Общие вопросы по Java, Java SE, Kotlin
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.03.2019, 19:33   #1
blackzero90
Новичок
Джуниор
 
Регистрация: 03.03.2019
Сообщений: 1
Восклицание Добавление управления к анимации

здравствуйте. есть прога (работает, НО), моделирующая движущегося робота, который натыкается "лучом" на препятствие и строит "свое виденье" его расположения. НО нужно добавить парочку моментов, которые я не очень понимаю, как сделать: 1) движение робота здесь автоматическое, а надо сделать чтобы пользователь мог с клавы управлять им (как в игре, передвижение, повороты) 2)сделать несколько рандомных препятствий, и чтоб робот динамически строил их расположение как только луч наткнется на них
Код:
 import java.awt.Graphics;
 import java.awt.Graphics2D;
 import java.awt.RenderingHints;
 import javax.swing.JFrame;
 import javax.swing.JPanel;
 
public class Game extends JPanel {
static final int Win_length = 1200;
static final int Win_width = 800;
 
static int rob_prime_x = 50;    // Координата нулевой точки оси x системы координат, связанной с роботом в мировой системе координат
static int rob_prime_y = 300;  // Координата нулевой точки оси y СКР в МСК
static int rob_body_x = 0;  // Координата X левого верхнего угла корпуса робота в МСК
static int rob_body_y = 0;  // Координата Y левого верхнего угла корпуса робота в МСК
static int rob_body_width = 50; // ширина робота
static int rob_body_length = 100;   // длина робота
 
static int obst_body_x;//координата препятствия
static int obst_body_y = 50;
static int obst_lenght;
 
 
static int scan_body_lenght = 30;// длина сканера
static int scan_body_weight = 30;// ширина сканера
static int sensor_position_rob_x = 5;// позиция сканера относительно робота по Х
static int sensor_position_rob_y = -40;// позиция сканера относительно робота по У
static int sensor_position_world_x ;// положение сканера в мире п Х
static int sensor_position_world_y ;// положение сканера в мире п У
 
static int wave_lenght = 190;// длина испускаемого луча
static int wave_weight = scan_body_weight;// ширина луча
static int wave_position_scan_x;// положение луча относительно сканера по Х
static int wave_position_scan_y;// положение луча относительно сканера по У
 
static int calc_obst_beg ; //координата начала препятствия
static int calc_obst_end  ; //координата конца преп
static int calc_obst_lenght  ; // длина реал преп
 
static int robVision_obst_x = 0 ;//положение преп, как видит робот по Х
static int robVision_obst_y = 0; // по У не учит
static int robVision_obst_lenght = 0;
 
Game() {
    do
    {   // чтобы препятствие не пересекало границу
        obst_body_x = (int) Math.round((300 + Math.random() * 600 ));
        obst_lenght = (int) Math.round(100+(Math.random() * 250) );
    }
    while (!(obst_body_x + obst_lenght < Win_length - 150)); // "Кривое решение". Просто прописывается координата, за которую препятствие не может заступать
}
 
private void moveRobot() {  // начало координат находится в центре корпуса
    rob_prime_x = rob_prime_x + 1;  // изменение координаты x центра
    rob_body_x = rob_prime_x - (rob_body_length / 2);   // вычисление ЛВУ по x относительно центра
 
    //rob_prime_y = rob_prime_y + 1;    // изменение координаты y центра
    rob_body_y = rob_prime_y - (rob_body_width / 2); // вычисление ЛВУ по y относительно центра 
 
    sensor_position_world_x = rob_prime_x + sensor_position_rob_x - (scan_body_lenght/2); // вычисление положения датчика относительно мира по Х
    sensor_position_world_y = rob_prime_y + sensor_position_rob_y - (scan_body_weight/2); // по У
 
    wave_position_scan_x = sensor_position_world_x; // привязка ИК-волны к датчику
    wave_position_scan_y = sensor_position_rob_y + 95;
 
    // ИИ вычисление координат преп
    if (wave_position_scan_x  ==  obst_body_x) { // 
            calc_obst_beg = rob_prime_x; 
        }
        else if (wave_position_scan_x   <=  obst_body_x + obst_lenght) {    // координата конца увеличивается до нахождения правой грани
            calc_obst_end = rob_prime_x;
        }
    calc_obst_lenght = calc_obst_end - calc_obst_beg; // вычисляем длину преп
 
    // виденье робота для проверки
    robVision_obst_x = calc_obst_beg - scan_body_lenght/2; 
    robVision_obst_y = calc_obst_end - scan_body_lenght/2;
    robVision_obst_lenght = robVision_obst_y - robVision_obst_x;
}
 
public void paint(Graphics g) {
    super.paint(g);
    Graphics2D g2d = (Graphics2D) g;
    Graphics2D gty = (Graphics2D) g;
 
    Graphics2D gO = (Graphics2D) g; //преп
    Graphics2D gs = (Graphics2D) g;// сканер
 
    Graphics2D gq = (Graphics2D) g;//луч
 
    Graphics2D str = (Graphics2D)g; //строки с координатами
    Graphics2D str1 = (Graphics2D)g;
    Graphics2D str2 = (Graphics2D)g;
 
    Graphics2D rv = (Graphics2D)g; // виденье робота
 
    g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
            RenderingHints.VALUE_ANTIALIAS_ON);
    g2d.drawRect(rob_body_x, rob_body_y, rob_body_length, rob_body_width); // рисуем робота
    gty.drawRect(1100, 25, 10, 700);
 
    gO.drawRect(obst_body_x, obst_body_y, obst_lenght, obst_body_y); // рисуем преп
    gs.drawRect(sensor_position_world_x, sensor_position_world_y, scan_body_lenght, scan_body_weight); // рисуем сенсор
 
    gq.drawRect(wave_position_scan_x,wave_position_scan_y,wave_weight, wave_lenght); // рисуем луч
 
    String calc_obst_beg1 = String.valueOf(calc_obst_beg); 
    str.drawString("Координата начала: " + calc_obst_beg1, 300, 350); //вывод вычисленной координаты начала преп
    String calc_obst_end1 = String.valueOf(calc_obst_end);
    str1.drawString("Координата конца: " + calc_obst_end1, 600, 350); //вывод вычисленной координаты конца преп 
 
    String calc_obst_lenght1 = String.valueOf(calc_obst_lenght);// вывод вычисленной длины преп
    str2.drawString("Длина : " + calc_obst_lenght1, 800, 350);
 
    if (calc_obst_beg != 0) rv.drawRect(robVision_obst_x, 550, calc_obst_lenght, 20);   // построение "видения" робота после нахождения левой грани препятствия
 
}
 
public static void main(String[] args) throws InterruptedException {
    JFrame frame = new JFrame("Robots move");
    Game game = new Game();
    frame.add(game);
    frame.setSize(Win_length, Win_width);
    frame.setVisible(true);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 
    while (true) {
        game.moveRobot();
        game.repaint();
        Thread.sleep(5);
 
        if (rob_prime_x + rob_body_length / 2 == Win_length - 120) break;
    }
}
}
blackzero90 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Dev-c++ добавление элементов управления для новичка Flud Общие вопросы C/C++ 2 12.11.2015 13:26
добавление анимации в готовый проект C# d3[Z.oRg] Фриланс 2 29.05.2012 20:28
Добавление элементов управления при измененном масштабе Fierce Microsoft Office Excel 0 18.03.2010 21:35
Анимации Shadow_1329 Gamedev - cоздание игр: Unity, OpenGL, DirectX 15 05.06.2009 21:47
Анимации Sanek777 Общие вопросы Delphi 0 02.11.2008 17:19