Как я могу предотвратить перепрошивку? - PullRequest
3 голосов
/ 18 января 2012
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class Racing extends JFrame {
private static final long serialVersionUID = -198172151996959655L;

//makes the screen size
final int WIDTH = 900, HEIGHT = 650;

//keeps track of player speed
double plSpeed = .5;

//numbers that represent direction
final int UP = 0, RIGHT = 1, DOWN = 2, LEFT = 3, STOP = 5, START = 6;

//keeps track of player direction
int p1Direction = START;

//makes player 1's car
Rectangle p1 = new Rectangle ( 100, 325, 30, 30 );
Rectangle foreground = new Rectangle( 500, 500, 200, 200 );

//constructor
public Racing() {
    //define defaults for the JFrame
    super ("Racing");
    setSize( WIDTH, HEIGHT );
    setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
    setBackground(Color.BLACK);

    //start the inner class
    Move1 m1 = new Move1();
    m1.start();
}

//draws the cars and race track
public void paint(Graphics g) {

    super.paint(g);
    //draw p1
    g.setColor(Color.RED);
    g.fillRect(p1.x,p1.y,p1.width,p1.height);
    g.setColor(Color.GREEN);
    g.fillRect(foreground.x,foreground.y,foreground.width,foreground.height);

}
private class Move1 extends Thread implements KeyListener {
    public void run() {
        //makes the key listener "wake up"
        addKeyListener(this);

        //should be done in an infinite loop, so it repeats
        while (true) {
            //make try block, so it can exit if it errors
            try {
                //refresh screen
                repaint();

                //makes car increase speed a bit
                if (plSpeed <= 7) {
                    plSpeed += .2;
                }

                //lets the car stop
                if (plSpeed==0) {
                    p1Direction = STOP;
                }

                //moves player based on direction
                if (p1Direction==UP) {
                    p1.y -= (int) plSpeed;
                }
                if (p1Direction==DOWN) {
                    p1.y += (int) plSpeed;
                }
                if (p1Direction==LEFT) {
                    p1.x -= (int) plSpeed;
                }
                if (p1Direction==RIGHT) {
                    p1.x += (int) plSpeed;
                }
                if (p1Direction==STOP) {
                    plSpeed = 0;
                }

                //delays refresh rate
                Thread.sleep(75);

            }
            catch(Exception e) {
                //if an error, exit
                break;
            }
        }
    }

    //have to input these (so it will compile)
    public void keyPressed(KeyEvent event) {
        try {
            //makes car increase speed a bit
            if (event.getKeyChar()=='w' ||
                event.getKeyChar()=='a' ||
                event.getKeyChar()=='s' ||
                event.getKeyChar()=='d') {
                    plSpeed += .2;
                    repaint();
            }
        } catch (Exception I) {}
    }
    public void keyReleased(KeyEvent event) {}

    //now, to be able to set the direction
    public void keyTyped(KeyEvent event) {
        if (plSpeed > 0) {
            if (event.getKeyChar()=='a') {
                if (p1Direction==RIGHT) {
                    p1Brake();
                } else {
                    if (p1Direction==LEFT) {
                    } else {
                        p1Direction = LEFT;
                    }
                }
            }
            if (event.getKeyChar()=='s') {
                if (p1Direction==UP) {
                    p1Brake();
                } else {
                    if (p1Direction==DOWN) {
                    } else {
                        p1Direction = DOWN;
                    }
                }
            }
            if (event.getKeyChar()=='d') {
                if (p1Direction==LEFT) {
                    p1Brake();
                } else {
                    if (p1Direction==RIGHT) {
                    } else {
                        p1Direction = RIGHT;
                    }
                }
            }
            if (event.getKeyChar()=='w') {
                if (p1Direction==DOWN) {
                    p1Brake();
                } else {
                    if (p1Direction==UP) {
                    } else {
                        p1Direction = UP;
                    }
                }
            }
            if (event.getKeyChar()=='z') {
                p1Brake();
            }
        }
    }

    public void p1Brake () {
        try {
            while (plSpeed != 0) {
                plSpeed -= .2;
                Thread.sleep(75);
            }
        } catch (Exception e) {
            plSpeed = 0;
        }
    }
}

//finally, to start the program
public static void main(String[] args) {
    Racing frame = new Racing();
    frame.setVisible( true );
    frame.setLocationRelativeTo( null );
    frame.setResizable( false );
}

}

Это SSCCE моего кода.Если я добавлю super.paint (g);к вершине этого, внутри класса, тогда это становится все роскошным.Если я пропущу это, то всякий раз, когда вы перемещаете игрока, он создает линию, где игрок был - без перекраски.Мне нужно знать, как - и где перекрасить.Ближайший ответ на этот вопрос я получил здесь:

http://www.java -forums.org / awt-swing / 37406-repaint-без-мигания. Html

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

Примечания:

Я не знал, что вы могли бы сделать кадр с AWT, потому что я был счастлив и знаком со свингом, поэтому я не хотелменять.Извини за это.Как видите, всплывает все, что я рисую, а не только игрок.

Эндрю, вот мой скриншот: the game

О, и он не регистрирует P2.

Ответы [ 3 ]

3 голосов
/ 18 января 2012

Racing UI

Я сделал ряд изменений. Вот некоторые из них, которые я могу вспомнить.

  1. Реорганизован пользовательский рисунок из контейнера верхнего уровня в JPanel и перемещен рисунок в paintComponent().
  2. Удалено Thread и Thread.sleep(n) и заменено на Timer / ActionListener.
  3. Построил графический интерфейс на EDT.
  4. Удалена настройка размера JFrame. Вместо этого задает предпочтительный размер для JPanel (фактическая область рисования) и вызывает JFrame.pack(), чтобы получить правильный общий размер.
  5. Использует setLocationByPlatform(true) вместо очень заставки, как setLocationRelativeTo(null).

Внимательно проверьте код для получения дополнительных советов.

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class Racing extends JPanel implements KeyListener {
private static final long serialVersionUID = -198172151996959655L;

//keeps track of player speed
double plSpeed = .5;

//numbers that represent direction
final int UP = 0, RIGHT = 1, DOWN = 2, LEFT = 3, STOP = 5, START = 6;

//keeps track of player direction
int p1Direction = START;

//makes player 1's car
Rectangle p1 = new Rectangle ( 100, 25, 30, 30 );

//constructor
public Racing() {
    //define defaults for the JFrame
    setBackground(Color.BLACK);

    //makes the screen size
    setPreferredSize(new Dimension(400,50));

    //makes the key listener "wake up"
    addKeyListener(this);
    setFocusable(true);

    ActionListener al = new ActionListener() {
        public void actionPerformed(ActionEvent ae) {
            //refresh screen
            repaint();

            //makes car increase speed a bit
            if (plSpeed <= 7) {
                plSpeed += .2;
            }

            //lets the car stop
            if (plSpeed==0) {
                p1Direction = STOP;
            }

            //moves player based on direction
            if (p1Direction==UP) {
                p1.y -= (int) plSpeed;
            }
            if (p1Direction==DOWN) {
                p1.y += (int) plSpeed;
            }
            if (p1Direction==LEFT) {
                p1.x -= (int) plSpeed;
            }
            if (p1Direction==RIGHT) {
                p1.x += (int) plSpeed;
            }
            if (p1Direction==STOP) {
                plSpeed = 0;
            }
        }
    };

    Timer t = new Timer(75,al);
    t.start();
}

//draws the cars and race track
@Override
public void paintComponent(Graphics g) {

    super.paintComponent(g);
    //draw p1
    g.setColor(Color.RED);
    g.fillRect(p1.x,p1.y,p1.width,p1.height);

}

//have to input these (so it will compile)
public void keyPressed(KeyEvent event) {
    System.out.println(event);
    try {
        //makes car increase speed a bit
        if (event.getKeyChar()=='w' ||
            event.getKeyChar()=='a' ||
            event.getKeyChar()=='s' ||
            event.getKeyChar()=='d') {
                plSpeed += .2;
                //repaint();
        }
    } catch (Exception I) {}
}
public void keyReleased(KeyEvent event) {}

//now, to be able to set the direction
public void keyTyped(KeyEvent event) {
    if (plSpeed > 0) {
        if (event.getKeyChar()=='a') {
            if (p1Direction==RIGHT) {
                p1Brake();
            } else {
                if (p1Direction==LEFT) {
                } else {
                    p1Direction = LEFT;
                }
            }
        }
        if (event.getKeyChar()=='s') {
            if (p1Direction==UP) {
                p1Brake();
            } else {
                if (p1Direction==DOWN) {
                } else {
                    p1Direction = DOWN;
                }
            }
        }
        if (event.getKeyChar()=='d') {
            if (p1Direction==LEFT) {
                p1Brake();
            } else {
                if (p1Direction==RIGHT) {
                } else {
                    p1Direction = RIGHT;
                }
            }
        }
        if (event.getKeyChar()=='w') {
            if (p1Direction==DOWN) {
                p1Brake();
            } else {
                if (p1Direction==UP) {
                } else {
                    p1Direction = UP;
                }
            }
        }
        if (event.getKeyChar()=='z') {
            p1Brake();
        }
    }
}

public void p1Brake () {
    try {
        while (plSpeed != 0) {
            plSpeed -= .2;
        }
    } catch (Exception e) {
        plSpeed = 0;
    }
}

//finally, to start the program
public static void main(String[] args) {
    SwingUtilities.invokeLater( new Runnable() {
        public void run() {
            JFrame f = new JFrame("Racing");
            f.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
            f.add(new Racing());
            f.pack();
            f.setLocationByPlatform(true);
            f.setResizable( false );
            f.setVisible( true );
        }
    });
}
}
1 голос
/ 18 января 2012

Никогда не пытайтесь рисовать непосредственно на холсте, используйте фоновый поток, который всегда держит следующий кадр готовым, и меняйте его на старый.

    while (state == RUNNING)
    {
        long beforeTime = System.nanoTime();
        gEngine.update(); // update stuff like game score life etc..

        Canvas c = null;
        try
        {
            c = mSurfaceHolder.lockCanvas(null);
            synchronized (mSurfaceHolder)
            {                   
                drawable.setBounds(0, 0, 800, 600);
                drawable.draw(c); // flash new background if required for the new frame
                gEngine.draw(c);    // update game state
            }
        } finally
        {
            if (c != null)
            {
                mSurfaceHolder.unlockCanvasAndPost(c);
            }
        }

        this.sleepTime = delay
                - ((System.nanoTime() - beforeTime) / 1000000L);

        try
        {
            if (sleepTime > 0)
            {
                Thread.sleep(sleepTime);
            }
        } catch (InterruptedException ex)
        {
            Logger.getLogger(PaintThread.class.getName()).log(Level.SEVERE,
                    null, ex);
        }

    }
}
0 голосов
/ 28 января 2014

Изменение кода с апплета на JFrame совсем не сложно.Переименуйте расширение класса в JPanel:

public class Racing extends JPanel

, затем в методе, в котором вы создаете новый Racing, измените его, чтобы создать новый JFrame и любой другой метод в гонках, например setTitle(...), который сейчасвыдает ошибку перемещения в метод, который создает новый JFrame, как (whatever you named the JFrame reference).setTitle(...) Затем примените следующий код к остальной части JFrame:

JFrame.add(new Racing());
JFrame.setSize(*the size of Racing window*);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...