Juego hecho a pelo en Java - Pong

Ver el tema anterior Ver el tema siguiente Ir abajo

Juego hecho a pelo en Java - Pong

Mensaje por VictorH el Sáb Nov 28, 2015 12:31 pm

Está inacabado y hecho a base de parchear cosas según me iban saliendo problemas así que no juzgueis mucho xD

Aquí la clase principal, GameWindow que esta sí ha quedado bonita:

Código:
package game;

import java.awt.EventQueue;

import javax.swing.JFrame;


public class GameWindow extends JFrame {
      
    public GameWindow() {

        initComponents();
        
    }

    private void initComponents() {

        add(new GamePane());

        setSize(800, 600);

        setTitle("PONG");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
        
      
    }    

    public static void main(String[] args) {
        
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                
                GameWindow ex = new GameWindow();                
                ex.setVisible(true);
            }
        });
    }
}

Y aquí GamePane que es un desastre pero uno funcional xD

Código:
package game;

import javax.swing.JPanel;

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.geom.Rectangle2D;
import java.awt.geom.Ellipse2D;
import javax.swing.Timer;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Font;

public class GamePane extends JPanel implements ActionListener {

    private Rectangle2D borde, player1, player2;
    private Ellipse2D bola;
    private Timer timer;
    private final int DELAY = 5;
    int dy1, y1, dy2, y2, bx, by;
    double bolax, bolay;
    boolean dispara, invierteX, invierteY;
    double startx, starty;
    int score1, score2;

    public GamePane() {

        initGamePane();

    }

    private void initGamePane() {

        setSize(800, 600);

        invierteX = invierteY = dispara = false;
        dy1 = bx = by = 0;

        score1 = score2 = -1;

        y1 = y2 = this.getHeight() / 2 - 50;

        bola = new Ellipse2D.Double();
        borde = player1 = player2 = new Rectangle2D.Double();

        addKeyListener(new TAdapter());
        setFocusable(true);

        timer = new Timer(DELAY, this);
        timer.start();

    }

    @Override
    public void paintComponent(Graphics g) {

        super.paintComponent(g);

        drawStuff(g);

    }

    private void drawStuff(Graphics g) {

        Graphics2D g2d = (Graphics2D) g;

        Font f = new Font("Dialog", Font.BOLD, 50);

        g2d.setFont(f);
        g2d.setColor(Color.red);
        g2d.drawString((Integer.toString(score1) + " - " + Integer.toString(score2)), this.getWidth() / 2 - 60, 60);

        g2d.setColor(Color.DARK_GRAY);
        borde = new Rectangle2D.Double(10, 10, this.getWidth() - 20, this.getHeight() - 20);
        g2d.setStroke(new BasicStroke(10));
        g2d.draw(borde);

        player1 = new Rectangle2D.Double(30, y1, 5, 100);
        player2 = new Rectangle2D.Double(this.getWidth() - 30, y2, 5, 100);
        g2d.fill(player1);
        g2d.draw(player1);
        g2d.fill(player2);
        g2d.draw(player2);

        if (dispara == false) {
            bolax = (player1.getX() + 20) + bx;
            bolay = (player1.getY() + (player1.getHeight() / 2) - 5) + by;
        } else {
            bolax = startx + bx;
            bolay = starty + by;
        }

        bola = new Ellipse2D.Double(bolax, bolay, 10, 10);
        g2d.setColor(Color.GRAY);
        g2d.draw(bola);

    }

    @Override
    public void actionPerformed(ActionEvent e) {

        repaint();
        muevePlayer();
        mueveBola();
    }

    private void mueveBola() {

        Rectangle2D choca = bola.getBounds();

        if (bolay >= borde.getHeight() - 10) {
            invierteY = true;
        }

        if (bolax >= borde.getWidth() - 10) {
            invierteX = true;
            score1++;
        }

        if (bolay <= 20) {
            invierteY = false;
        }

        if (bolax <= 20) {
            invierteX = false;
            score2++;
        }

        if (choca.intersects(player1)) {
            invierteX = false;
            if (bolay < (player1.getY() + (player1.getHeight() / 2)) && invierteY == false) {
                invierteY = true;
            }
            if (bolay > (player1.getY() + (player1.getHeight() / 2)) && invierteY == true) {
                invierteY = false;
            }
        }

        if (choca.intersects(player2)) {
            invierteX = true;
            if (bolay < (player2.getY() + (player2.getHeight() / 2)) && invierteY == false) {
                invierteY = true;
            }
            if (bolay > (player2.getY() + (player2.getHeight() / 2)) && invierteY == true) {
                invierteY = false;
            }
        }

        if (dispara == true) {
            if (!invierteX) {
                bx += 1;
            } else {
                bx += -1;
            }
            if (!invierteY) {
                by += 1;
            } else {
                by += -1;
            }

        }

    }

    public void muevePlayer() {

        if (y1 <= 20 && dy1 == -1) {
            dy1 = 0;
        }

        if (y1 > (borde.getHeight() - player1.getHeight()) && dy1 == 1) {
            dy1 = 0;
        }
       
        if (y2 <= 20 && dy2 == -1) {
            dy2 = 0;
        }

        if (y2 > (borde.getHeight() - player2.getHeight()) && dy2 == 1) {
            dy2 = 0;
        }

        y1 += dy1;
        y2 += dy2;

    }

    public void keyPress(KeyEvent e) {

        int key = e.getKeyCode();

        if (key == KeyEvent.VK_UP) {
            dy1 = -1;
        }

        if (key == KeyEvent.VK_DOWN) {
            dy1 = 1;
        }

        if (key == KeyEvent.VK_SPACE) {

            if (dispara == false) {
                dispara = true;
                startx = bolax;
                starty = bolay;
            }
        }

        if (key == KeyEvent.VK_W) {
            dy2 = -1;
        }
       
        if (key == KeyEvent.VK_S) {
            dy2 = 1;
        }

    }

    public void keyRelease(KeyEvent e) {

        int key = e.getKeyCode();

        if (key == KeyEvent.VK_UP) {
            dy1 = 0;
        }

        if (key == KeyEvent.VK_DOWN) {
            dy1 = 0;
        }
       
        if (key == KeyEvent.VK_W) {
            dy2 = 0;
        }
       
        if (key == KeyEvent.VK_S) {
            dy2 = 0;
        }
    }

    private class TAdapter extends KeyAdapter {

        @Override
        public void keyReleased(KeyEvent e) {
            keyRelease(e);
        }

        @Override
        public void keyPressed(KeyEvent e) {
            keyPress(e);
        }
    }
}


Importante señalar que ambas son clases java, si funcionan como JFrame y JPanel es porque les he incrustado el código a pelo para que lo hagan, en caso de que queráis probarlo.

También no os preocupéis por las imágenes, aquí estoy usando formas geométricas dibujadas por código y ya (es un poco dolor de cabeza pero meh, por probar)
avatar
VictorH
Admin

Posts : 45
Join date : 01/10/2015

Ver perfil de usuario http://daw15.boardlog.com

Volver arriba Ir abajo

Re: Juego hecho a pelo en Java - Pong

Mensaje por keite el Dom Nov 29, 2015 5:20 am

Esta chulo, que algoritmo usas para crear la trayectoria de la bola?
avatar
keite

Posts : 18
Join date : 01/10/2015

Ver perfil de usuario

Volver arriba Ir abajo

Re: Juego hecho a pelo en Java - Pong

Mensaje por VictorH el Dom Nov 29, 2015 9:42 am

No contempla nada mas que desplazamiento de 45º así que es un simple x + y, donde ambos tienen como valor 1 o -1 según la dirección en que se desplace. Lo único que contempla es que según si se golpea la bola con el extremo superior o inferior de la barra exista un cambio de dirección en su y o no.

De todas formas al estar trabajando con una velocidad x e y como valores independientes y no directamente con un ángulo es fácil implementar un método que contemple un cambio en el ángulo de desplazamiento. Un ejemplo de ello sería establecer una simple regla de 3 por la cual dejando ese ángulo de 45º como valor máximo (un 1 en la x) se establezca una correspondencia 0.5 a 1 y 0.5 a -1 entre el punto medio de la barra y sus extremos superior e inferior respectivamente según dirección de contacto. De esa forma permitiría que la bola fuese desde unos 22º a 45º (habría que modificar también la y proporcionalmente para evitar perder velocidad)
avatar
VictorH
Admin

Posts : 45
Join date : 01/10/2015

Ver perfil de usuario http://daw15.boardlog.com

Volver arriba Ir abajo

Re: Juego hecho a pelo en Java - Pong

Mensaje por keite el Dom Nov 29, 2015 11:52 pm

a vale ya se
avatar
keite

Posts : 18
Join date : 01/10/2015

Ver perfil de usuario

Volver arriba Ir abajo

Re: Juego hecho a pelo en Java - Pong

Mensaje por Contenido patrocinado


Contenido patrocinado


Volver arriba Ir abajo

Ver el tema anterior Ver el tema siguiente Volver arriba

- Temas similares

 
Permisos de este foro:
No puedes responder a temas en este foro.