bueno amigos como hemos venido diciendo andamos con codigo de juegos clasicos en este momento les traigo un clasico de los 80 desarrollado por Atari.inc fue creado en 1976 alrededor de este año ,para los desarrolladores de juegos el ping pong una pelotica que rebota destrozando ladrillos y tu tirandola con punteria, es un juego muy divertido que si le agregamos mas podemos variar de niveles.
la primera clase que vamos a desarrollar es comun donde agregaremos el ancho,tamaño ,alto etc etc
public interface comun {
public static final int WIDTH = 300;
public static final int HEIGTH = 400;
public static final int BOTTOM = 390;
public static final int PADDLE_RIGHT = 250;
public static final int BALL_RIGHT = 280;
}
luego de esto seguimos con la clase Sprite donde pomdremos el siguiente codigo:
import java.awt.Image;
import java.awt.Rectangle;
public class Sprite {
protected int x;
protected int y;
protected int width;
protected int heigth;
protected Image image;
public void setX(int x) {
this.x = x;
}
public int getX() {
return x;
}
public void setY(int y) {
this.y = y;
}
public int getY() {
return y;
}
public int getWidth() {
return width;
}
public int getHeight() {
return heigth;
}
Image getImage()
{
return image;
}
Rectangle getRect()
{
return new Rectangle(x, y,
image.getWidth(null), image.getHeight(null));
}
}
se encargara del movimiento de la pelotica y de otras imagenes.
la siguiente clase se llama balon esta obviamente se encarga del balon su movimiento y su recorrido
import javax.swing.ImageIcon;
public class balon extends Sprite implements comun {
private int xdir;
private int ydir;
protected String ball = "balon.png";
public balon() {
xdir = 1;
ydir = -1;
ImageIcon ii = new ImageIcon(this.getClass().getResource(ball));
image = ii.getImage();
width = image.getWidth(null);
heigth = image.getHeight(null);
resetState();
}
public void move()
{
x += xdir;
y += ydir;
if (x == 0) {
setXDir(1);
}
if (x == BALL_RIGHT) {
setXDir(-1);
}
if (y == 0) {
setYDir(1);
}
}
public void resetState()
{
x = 230;
y = 355;
}
public void setXDir(int x)
{
xdir = x;
}
public void setYDir(int y)
{
ydir = y;
}
public int getYDir()
{
return ydir;
}
}
seguimos con la clase ladrillo donde va ser los obstáculos a romper con la raqueta
import javax.swing.ImageIcon;
public class ladrillo extends Sprite {
String brickie = "ladrillo.png";
boolean destroyed;
public ladrillo(int x, int y) {
this.x = x;
this.y = y;
ImageIcon ii = new ImageIcon(this.getClass().getResource(brickie));
image = ii.getImage();
width = image.getWidth(null);
heigth = image.getHeight(null);
destroyed = false;
}
public boolean isDestroyed()
{
return destroyed;
}
public void setDestroyed(boolean destroyed)
{
this.destroyed = destroyed;
}
}
seguimos con la clase paleta donde esta la raqueta para hacer el rebote de la pelota hacia el ladrillo
import java.awt.event.KeyEvent;
import javax.swing.ImageIcon;
public class paleta extends Sprite implements comun {
String paddle = "paleta.png";
int dx;
public paleta() {
ImageIcon ii = new ImageIcon(this.getClass().getResource(paddle));
image = ii.getImage();
width = image.getWidth(null);
heigth = image.getHeight(null);
resetState();
}
public void move() {
x += dx;
if (x <= 2)
x = 2;
if (x >= comun.PADDLE_RIGHT)
x = comun.PADDLE_RIGHT;
}
public void keyPressed(KeyEvent e) {
int key = e.getKeyCode();
if (key == KeyEvent.VK_LEFT) {
dx = -2;
}
if (key == KeyEvent.VK_RIGHT) {
dx = 2;
}
}
public void keyReleased(KeyEvent e) {
int key = e.getKeyCode();
if (key == KeyEvent.VK_LEFT) {
dx = 0;
}
if (key == KeyEvent.VK_RIGHT) {
dx = 0;
}
}
public void resetState() {
x = 200;
y = 360;
}
}
luego seguimos con la clase tablero donde va cargar el jframe
import java.awt.Color;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Point;
import java.awt.Toolkit;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.Timer;
import java.util.TimerTask;
import javax.swing.JPanel;
public class tablero extends JPanel implements comun {
Image ii;
Timer timer;
String message = "Game Over";
balon ball;
paleta paddle;
ladrillo bricks[];
boolean ingame = true;
int timerId;
public tablero() {
addKeyListener(new TAdapter());
setFocusable(true);
bricks = new ladrillo[30];
setDoubleBuffered(true);
timer = new Timer();
timer.scheduleAtFixedRate(new ScheduleTask(), 1000, 10);
}
public void addNotify() {
super.addNotify();
gameInit();
}
public void gameInit() {
ball = new balon();
paddle = new paleta();
int k = 0;
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 6; j++) {
bricks[k] = new ladrillo(j * 40 + 30, i * 10 + 50);
k++;
}
}
}
public void paint(Graphics g) {
super.paint(g);
if (ingame) {
g.drawImage(ball.getImage(), ball.getX(), ball.getY(),
ball.getWidth(), ball.getHeight(), this);
g.drawImage(paddle.getImage(), paddle.getX(), paddle.getY(),
paddle.getWidth(), paddle.getHeight(), this);
for (int i = 0; i < 30; i++) {
if (!bricks[i].isDestroyed())
g.drawImage(bricks[i].getImage(), bricks[i].getX(),
bricks[i].getY(), bricks[i].getWidth(),
bricks[i].getHeight(), this);
}
} else {
Font font = new Font("Verdana", Font.BOLD, 18);
FontMetrics metr = this.getFontMetrics(font);
g.setColor(Color.BLACK);
g.setFont(font);
g.drawString(message,
(comun.WIDTH - metr.stringWidth(message)) / 2,
comun.WIDTH / 2);
}
Toolkit.getDefaultToolkit().sync();
g.dispose();
}
private class TAdapter extends KeyAdapter {
public void keyReleased(KeyEvent e) {
paddle.keyReleased(e);
}
public void keyPressed(KeyEvent e) {
paddle.keyPressed(e);
}
}
class ScheduleTask extends TimerTask {
public void run() {
ball.move();
paddle.move();
checkCollision();
repaint();
}
}
public void stopGame() {
ingame = false;
timer.cancel();
}
public void checkCollision() {
if (ball.getRect().getMaxY() > comun.BOTTOM) {
stopGame();
}
for (int i = 0, j = 0; i < 30; i++) {
if (bricks[i].isDestroyed()) {
j++;
}
if (j == 30) {
message = "Victory";
stopGame();
}
}
if ((ball.getRect()).intersects(paddle.getRect())) {
int paddleLPos = (int)paddle.getRect().getMinX();
int ballLPos = (int)ball.getRect().getMinX();
int first = paddleLPos + 8;
int second = paddleLPos + 16;
int third = paddleLPos + 24;
int fourth = paddleLPos + 32;
if (ballLPos < first) {
ball.setXDir(-1);
ball.setYDir(-1);
}
if (ballLPos >= first && ballLPos < second) {
ball.setXDir(-1);
ball.setYDir(-1 * ball.getYDir());
}
if (ballLPos >= second && ballLPos < third) {
ball.setXDir(0);
ball.setYDir(-1);
}
if (ballLPos >= third && ballLPos < fourth) {
ball.setXDir(1);
ball.setYDir(-1 * ball.getYDir());
}
if (ballLPos > fourth) {
ball.setXDir(1);
ball.setYDir(-1);
}
}
for (int i = 0; i < 30; i++) {
if ((ball.getRect()).intersects(bricks[i].getRect())) {
int ballLeft = (int)ball.getRect().getMinX();
int ballHeight = (int)ball.getRect().getHeight();
int ballWidth = (int)ball.getRect().getWidth();
int ballTop = (int)ball.getRect().getMinY();
Point pointRight =
new Point(ballLeft + ballWidth + 1, ballTop);
Point pointLeft = new Point(ballLeft - 1, ballTop);
Point pointTop = new Point(ballLeft, ballTop - 1);
Point pointBottom =
new Point(ballLeft, ballTop + ballHeight + 1);
if (!bricks[i].isDestroyed()) {
if (bricks[i].getRect().contains(pointRight)) {
ball.setXDir(-1);
}
else if (bricks[i].getRect().contains(pointLeft)) {
ball.setXDir(1);
}
if (bricks[i].getRect().contains(pointTop)) {
ball.setYDir(1);
}
else if (bricks[i].getRect().contains(pointBottom)) {
ball.setYDir(-1);
}
bricks[i].setDestroyed(true);
}
}
}
}
}
bueno por ultimo la clase principal llamada raketa donde va empezar el juego
import javax.swing.JFrame;
public class raketa extends JFrame {
public raketa()
{
add(new tablero());
setTitle("tennis de mesa");
setDefaultCloseOperation(EXIT_ON_CLOSE);
setSize(comun.WIDTH, comun.HEIGTH);
setLocationRelativeTo(null);
setIgnoreRepaint(true);
setResizable(false);
setVisible(true);
}
public static void main(String[] args) {
new raketa();
}
}
por ultimo los sprites o imagenes:
0 Comments