Медленная функция repaint() - Java
Формулировка задачи:
Здравствуйте! Я пытаюсь написать арканоид по урокам из youtube. При запуске компилятором приложения картинка обновляется очень медленно, так что платформа, отбивающая мячик, перемещается на любое расстояние за 2 минуты, а не плавно. Еще возникает ошибка Exception in thread. Как можно решить проблему?
//Main.java
package com.simplegame.arcanoid;
import java.awt.*;
import javax.swing.JFrame;
/**
* Created by Admin on 26.08.2017.
*/
public class Main {
public static void main(String[] args) {
JFrame obj = new JFrame();
game_mechanics mech = new game_mechanics();
obj.setBounds(10, 10, 710, 630);
obj.setTitle("Welcome to arcanoid!");
obj.setVisible(true);
obj.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
obj.add(mech);
}
}
//BrickGenerator
package com.simplegame.arcanoid;
import javax.swing.*;
import java.awt.*;
/**
* Created by Admin on 26.08.2017.
*/
public class BrickGenerator {
public int map[][];
public int brickWidth;
public int brickHeight;
public BrickGenerator(int row, int col){
map = new int[row][col];
for(int i = 0; i < map.length; i++){
for(int j = 0; j<map[0].length; j++){
map[i][j] = 1;
}
}
brickWidth = 540/col;
brickHeight = 150/row;
}
public void draw(Graphics2D g ){
for(int i = 0; i < map.length; i++){
for(int j = 0; j<map[0].length; j++){
if( map[i][j] > 0) {
g.setColor(Color.WHITE);
g.fillRect(j * brickWidth + 80, i* brickHeight + 50, brickWidth, brickHeight);
}
}
}
}
}
//game_mechanics.java
package com.simplegame.arcanoid;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
public class game_mechanics extends JPanel implements KeyListener, ActionListener {
private boolean play = false;
private int score = 0;
private int totalBricks = 21;
private Timer time;
private int delay = 8;
private int playerX = 310;
private int ballposX = 120;
private int ballposY = 350;
private int ballXdir = -1;
private int ballYdir = -2;
private BrickGenerator map;
public game_mechanics(){
BrickGenerator map = new BrickGenerator(3, 7);
addKeyListener(this);
setFocusable(true);
setFocusTraversalKeysEnabled(false);
Timer timer = new Timer(delay, this);
timer.start();
}
public void paint(Graphics g) {
// background
g.setColor(Color.black);
g.fillRect(1, 1, 692, 592);
//drawing map
map.draw((Graphics2D) g);
//borders
g.setColor(Color.yellow);
g.fillRect(0, 0, 3, 592);
g.fillRect(0, 0, 692, 3);
g.fillRect(691, 0, 3, 592);
//the paddle
g.setColor(Color.green);
g.fillRect(playerX, 550 , 100, 8);
//the ball
g.setColor(Color.yellow);
g.fillOval(ballposX , ballposY , 20, 20);
g.dispose();
}
@Override
public void actionPerformed(ActionEvent e) {
Timer timer = new Timer(delay, this);
timer.start();
if(play) {
if(new Rectangle(ballposX, ballposY, 20, 20).intersects(new Rectangle(playerX, 550, 100, 8))){
ballYdir = -ballYdir;
}
ballposX += ballXdir;
ballposY += ballYdir;
if(ballposX < 0) {
ballXdir = -ballXdir;
}
if(ballposY < 0) {
ballYdir = -ballYdir;
}
if(ballposX > 670) {
ballXdir = -ballXdir;
}
}
repaint();
}
@Override
public void keyTyped(KeyEvent e) { }
@Override
public void keyPressed(KeyEvent e) {
if(e.getKeyCode() == KeyEvent.VK_RIGHT){
if(playerX >=600) {
playerX = 600;
} else{
moveRight();
}
}
if(e.getKeyCode() == KeyEvent.VK_LEFT){
if(playerX < 10) {
playerX = 10;
} else{
moveLeft();
}
}
}
public void moveRight() {
play = true;
playerX += 20;
}
public void moveLeft() {
play = true;
playerX -= 20;
}
@Override
public void keyReleased(KeyEvent e) { }
}Решение задачи: «Медленная функция repaint()»
textual
Листинг программы
import java.awt.*;
import java.util.Random;
/**
* Created by Admin on 26.08.2017.
*/
public class BrickGenerator {
public int map[][];
public int brickWidth;
public int brickHeight;
private static Random rnd = new Random();
public BrickGenerator(int row, int col) {
map = new int[row][col];
for (int i = 0; i < map.length; i++) {
for (int j = 0; j < map[0].length; j++) {
map[i][j] = (i+j+1)%2;
}
}
brickWidth = 540 / col;
brickHeight = 150 / row;
}
public void draw(Graphics2D g) {
for (int i = 0; i < map.length; i++) {
for (int j = 0; j < map[0].length; j++) {
if (map[i][j] > 0) {
g.setColor(Color.WHITE);
g.fillRect(j * brickWidth + 80, i * brickHeight + 50, brickWidth, brickHeight);
}
}
}
}
}