Медленная функция 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);
 
                }
            }
        }
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 3.923 из 5