Arhn - архитектура программирования

как я могу очистить свой прямоугольник после его рисования на экране?

Я понимаю, что основной компонент, которого не хватает в моей игре, — это ощущение времени, тиков или FPS. Я планирую внедрить это в ближайшее время, но хотел бы получить отзывы о том, как вместо этого настроить свои «пули». Я хочу, чтобы пользователь нажал пробел, и пуля выстрелила по экрану. Сейчас подобрался без ощущения фпс; однако он рисуется как одна гигантская линия, а это означает, что «след» пули никогда не исчезает. Мне интересно, почему, когда я вызываю перерисовку, прямоугольник может перемещаться по экрану с помощью моей клавиатуры, но всякий раз, когда я что-то автоматически устанавливаю для перемещения, он просто оставляет «след», хотя я вызываю repaint(); в каждом методе.

Кроме того, как я могу создать свою пулю из другого класса?

public class drawingComponent extends JComponent implements KeyListener {

    public Rectangle hello = new Rectangle(300, 100, 50, 50);
    Rectangle bullet = new Rectangle(310,75, 10,10);
    boolean goingon = false;

    public drawingComponent(){
        addKeyListener(this);
    }

    public void paintComponent(Graphics g){
        Graphics2D g2 = (Graphics2D) g;
        g2.setColor(new Color(255,25,0));
        g2.setFont(new Font("monospace", Font.BOLD+Font.ITALIC, 30));
        g2.drawString("nothing yet",300,320);
        g2.fill(hello);
        setFocusable(true);
        requestFocus();
        g2.setColor(new Color(0,25,0));
        if (goingon == true){
            while (bullet.y < 1000){
                bullet.y=bullet.y+10;
                g2.fill(bullet);
            }
            bullet.y=300;
        }   
    }

    @Override
    public void keyPressed(KeyEvent e) {
        if(e.getKeyCode() == KeyEvent.VK_W){
            hello.y=hello.y-1;
            hello.setLocation(hello.x,hello.y);
            repaint(); 
            System.out.println(hello.y);
        }
        if(e.getKeyCode() == KeyEvent.VK_S){
            hello.y=hello.y+1;
            hello.setLocation(hello.x,hello.y);
            repaint();  
        }
        if(e.getKeyCode() == KeyEvent.VK_A){
            hello.x=hello.x-1;
            hello.setLocation(hello.x,hello.y);
            repaint();      
        }
        if(e.getKeyCode() == KeyEvent.VK_D){
            hello.x=hello.x+1;
            hello.setLocation(hello.x,hello.y);
            repaint();

        }
        if(e.getKeyCode() == KeyEvent.VK_SPACE){
            goingon = true;
            repaint();
        }
    }

    @Override
    public void keyReleased(KeyEvent e) {
        if(e.getKeyCode() == KeyEvent.VK_SPACE){
            goingon = false;
            repaint();
        }
    }

    @Override
    public void keyTyped(KeyEvent e) {
        // TODO Auto-generated method stub
    }
}

Ответы:


1

Начни с ремонта цепи окраски...

@Override
protected void paintComponent(Graphics g){
    super.paintComponent(g);
    Graphics2D g2 = (Graphics2D) g;
    g2.setColor(new Color(255,25,0));
    g2.setFont(new Font("monospace", Font.BOLD+Font.ITALIC, 30));
    g2.drawString("nothing yet",300,320);
    g2.fill(hello);

Затем прекратите изменять состояние компонента из метода рисования...

    //setFocusable(true);
    //requestFocus();
    g2.setColor(new Color(0,25,0));
    if (goingon == true){
    while (bullet.y < 1000){
        bullet.y=bullet.y+10;
        g2.fill(bullet);
    }
    bullet.y=300;



}

Рисование должно просто рисовать текущее состояние компонента, оно никогда не должно пытаться изменить состояние компонента, это может вызвать другой запрос на рисование, который поместит ваш код в бесконечный цикл рисования и поглотит ваши циклы ЦП.

Swing использует пассивный алгоритм рендеринга, это означает, что рисование выполняется только тогда, когда менеджер перерисовки считает, что это необходимо сделать, а это означает, что рисование может быть выполнено случайным образом и в основном без вашего вмешательства...

Основываясь на том факте, что вы пытаетесь сфокусироваться на компоненте, я предполагаю, что вы пытаетесь решить проблемы, связанные с KeyListener. Вместо этого вы должны использовать API привязок клавиш. Дополнительные сведения см. в разделе Как использовать привязки клавиш.

Взгляните на Рисование в AWT и Swing и Выполнение пользовательского рисования для получения дополнительной информации.

11.11.2014

2

Не забудьте вызвать super.paintComponent() в переопределенном методе paintComponent(), который очищает представление предварительного просмотра.

Подробнее...

11.11.2014
Новые материалы

Коллекции публикаций по глубокому обучению
Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

Представляем: Pepita
Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

Советы по коду Laravel #2
1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

3 способа решить квадратное уравнение (3-й мой любимый) -
1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

Создание VR-миров с A-Frame
Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

Демистификация рекурсии
КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..