Предыдущие экземпляры символов не стираются

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

К сожалению, я не могу опубликовать изображение .......... Так...

Иероглиф "C"

Это идет от

C

к

С С

когда я пытаюсь двигаться вправо.

package WASD;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.*;

public class WASD extends JFrame implements KeyListener, ActionListener{
    private int playerX = 400;
    private int playerY = 400;
    int C = 1;
    private int RESTART = 0; // Three ENTER = Restart
    private Timer timer;
    JFrame j = new JFrame();
    private int previousX = -50;
    private int previousY = -50;
    public WASD() {
        JPanel panel = new JPanel();
        setTitle("Not supposed to be a painting program.");
        setSize(2000, 2000);

        timer = new Timer(8, this);

        this.getContentPane().add(panel);

        addKeyListener(this);
        setVisible(true);
        setFocusable(true);
        setFocusTraversalKeysEnabled(false);

        setDefaultCloseOperation(EXIT_ON_CLOSE);

    }
    public static void main(String[] args){
        WASD W = new WASD();
    }
    public void paint(Graphics g) { //TODO paint is only working once, then failing forever.
        //////////////////////////
        g.setColor(Color.BLACK);
        g.drawRect(0, 0, 3000, 3000); // Background


        if (C == 1) g.setColor(Color.RED);

        else if (C == 2) g.setColor(Color.BLUE);
        else if (C == 3) g.setColor(Color.GREEN);
        else if (C == 4) g.setColor(Color.YELLOW);
        else if (C>4){
            g.setColor(Color.GRAY); 
            try {
                Thread.sleep(1000); //Gray pauses for a second I guess...
            } 
            catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            C = 1;
        }
        g.fillRect(playerX, playerY, 50, 50); // Player/
        g.setColor(Color.BLACK);
        g.fillRect(previousX, previousY, 50, 50);
        g.dispose(); //Last thing
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        timer.start();
        repaint();
    }
    @Override
    public void keyPressed(KeyEvent K) {
        // TODO Auto-generated method stub
        int e = K.getKeyCode();

        repaint();  //timer.start(); does not affect this. g.dispose() is unavailable.
    /*
    If this repaint is used, then the previous locations 
    that the player was at will be painted as well.
    Basically, instead of moving, all instances 
    made will not be deleted. #PaintingApplication

    However, if it is not used, then the CHARACTER will not move at all.

    It seems that the problem is not about 

    playerX, or playerY, 

    instead, it is about the program not refreshing.
    */
        if ((e == KeyEvent.VK_RIGHT || e == KeyEvent.VK_D) && playerX<2000){
            playerX += 200;
        }
        else if ((e == KeyEvent.VK_LEFT || e == KeyEvent.VK_A) && playerX>0){
            playerX -= 200;
        }
        else if ((e == KeyEvent.VK_UP || e == KeyEvent.VK_W) && playerY>0){
            playerY -= 200;
        }
        else if (e == KeyEvent.VK_DOWN || e == KeyEvent.VK_S && playerY<2000){ // Easter egg bug 1
            playerY += 200;
        }
        else if (e == KeyEvent.VK_C){
            C++;
        }

        else if (e == KeyEvent.VK_ENTER){
            if (RESTART == 3){
                playerX = 400;
                playerY = 400;
                RESTART = 0; //TODO
                repaint();
            }
            else{
                RESTART++;
            }
        }
        else{
            RESTART = 0;
        }

    }

    @Override public void keyTyped(KeyEvent arg0) {}
    @Override public void keyReleased(KeyEvent arg0) {}
}
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
0
39
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Прошу прощения за такую ​​простую ошибку. Проблема в функции "рисовать". Линия

g.drawRect(0, 0, 3000, 3000); //Outline of Rectangle

должно быть

g.fillRect(0, 0, 3000, 3000); //Actually filling the background.

Другие вопросы по теме