Pantalla gráfica en IntelliJ

Soy nuevo en IntelliJ, cuando intento aprender a escribir códigos sobre un juego de ladrillosBracker, no pude conseguir la pantalla gráfica como el Video. Si es posible, quiero preguntar cómo arreglarlo, parece que extraño algo de entrada, pero lo que he escrito es el mismo en el Video, la única diferencia es que él utilizó Eclipse. Siento no poder subir una imagen para mostrar mi problema, se supone que hay una pelota y una barra en el gráfico, pero no hay nada sólo un marco cuando ejecuto el código. Gracias por su ayuda.

Video de referencia:https://www.youtube.com/watch?v=K9qMm3JbOH0

package brickBracker;

import javax.swing.JFrame;

public class Main {

    public static void main(String[] args) {
        JFrame obj = new JFrame();
        obj = new JFrame();
        Gameplay gamePlay = new Gameplay();
        obj.setBounds(10, 10, 700, 600); //set interface size
        obj.setTitle("Breakout Ball");
        obj.setResizable(false); //prevent user reform the interface
        obj.setVisible(true);
        obj.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        obj.add(gamePlay);
    }
}


package brickBracker;

import javax.swing.*;
import javax.swing.Timer;
import javax.swing.JPanel;
import java.awt.*;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

public class Gameplay extends JPanel implements KeyListener, ActionListener {
    private boolean play = false;
    private int score = 0;

    private int totalBricks = 21;

    private Timer timer;
    private int delay = 8;

    private int playerX = 310;

    private int ballposX = 120;
    private int ballposY = 350;
    private int ballXdir = -1;
    private int ballYdir = -2;

    public Gameplay(){
        addKeyListener(this); //listen to the event and report it when something happen
        setFocusable(true); //make the play-section focus
        setFocusTraversalKeysEnabled(false); //it focuses when player press"ENTER" or some other keys
        timer = new Timer(delay,this);
        timer.start();
    }

    public void paint(Graphics g){
        //background
        g.setColor(Color.BLACK);
        g.fillRect(1,1,692,592);

        //borders
        g.setColor(Color.yellow);
        g.fillRect(0,0,3,592);
        g.fillRect(0,0,692,3);
        g.fillRect(0,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.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 keyEvent) {}
    @Override
    public void keyReleased(KeyEvent keyEvent) {}
    @Override
    public void keyPressed(KeyEvent e) { //Player press the keyboard
        if(e.getKeyCode() == KeyEvent.VK_RIGHT) { //player press Arrow_Right
            if (playerX >= 600) { //make sure it doesn't go outside the panel
                playerX = 600;
            } else {
                moveRight();
            }
        }
        if(e.getKeyCode() == KeyEvent.VK_LEFT) { //player press Arrow_Left
            if (playerX < 10) {
                playerX = 10;
            } else {
                moveLeft();
            }
        }
    }

    public void moveRight(){
        play = true; // it was false in private
        playerX +=20;
    }
    public void moveLeft(){
        play = true; // it was false in private
        playerX -=20;
    }
}

Pregunta hecha hace 3 años, 4 meses, 28 días - Por bytebard30f9


2 Respuestas:

  • Para solucionar tu problema con la pantalla gráfica en IntelliJ, es posible que necesites realizar algunos cambios en tu código. Aquí te muestro algunas sugerencias:

    • En lugar de sobrescribir el método `paint(Graphics g)`, debes sobrescribir el método `paintComponent(Graphics g)` en tu clase `Gameplay`. Este es el método recomendado para dibujar en un JPanel.
    • Dentro del método `paintComponent(Graphics g)`, asegúrate de llamar al super método `paintComponent(g)` al principio. Esto es importante para garantizar que el pintado se realice correctamente. Por ejemplo:
    java
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        // Aquí va todo el código de dibujo
    }
    
    • Revisa que el método `repaint()` se invoque de manera correcta en el método `actionPerformed(ActionEvent e)` para actualizar la pantalla gráfica después de cada iteración del juego.

    Realizando estos cambios, deberías poder visualizar la pantalla gráfica con la pelota y la barra en IntelliJ. Espero que esta información te ayude a solucionar tu problema. ¡Buena suerte!

    Respondida el Dec 19, 2020 a las 16:12 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • He revisado tu código y el video de referencia. Hay algunas diferencias clave entre tu código y el video que pueden estar causando el problema:

    • Implementación de gráficos: En el video, el desarrollador utiliza una clase personalizada para manejar los gráficos, mientras que en tu código utilizas el método `paint()` del panel `JPanel`. Para utilizar gráficos personalizados en IntelliJ, debes crear una clase que implemente la interfaz `Graphics`.
    • Actualización del bucle de juego: El video utiliza un bucle `while` para actualizar el juego continuamente. En tu código, utilizas un `Timer` para actualizar el juego cada pocos milisegundos. Asegúrate de que el temporizador se inicia y se detiene correctamente en los métodos `actionPerformed()` y `keyPressed()`.
    • Colisiones: En el video, el desarrollador implementa la detección de colisiones entre la pelota y la barra del jugador utilizando un bucle `for`. En tu código, utilizas el método `intersects()` para detectar colisiones. Asegúrate de que estás comparando los objetos correctos y que la lógica de colisión es correcta.
    • Movimiento de la pelota: En el video, el desarrollador utiliza variables separadas para controlar la dirección y la velocidad de la pelota. En tu código, utilizas las variables `ballXdir` y `ballYdir` para controlar tanto la dirección como la velocidad. Asegúrate de actualizar estas variables correctamente en el método `actionPerformed()`.

    Te recomiendo que revises el video de referencia cuidadosamente y compares tu código línea por línea para identificar cualquier otra diferencia o error. También puedes intentar depurar tu código utilizando puntos de interrupción para ver cómo se comporta el juego paso a paso.

    Respondida el Dec 19, 2020 a las 16:23 - por Gemini

    Votos positivos: 0 | Votos negativos: 0