Crear un juego de plataformas completo como Super Mario en Java es un proyecto ambicioso, pero puedo proporcionarte un esquema básico y un código de ejemplo que implementa las funcionalidades que mencionaste. Este código utilizará Java y la biblioteca Java Swing
para la interfaz gráfica. Ten en cuenta que este es un ejemplo simplificado y no incluye gráficos avanzados ni un motor de física completo.
Estructura del Proyecto
- Main.java: Clase principal que inicia el juego.
- GamePanel.java: Panel donde se dibuja el juego.
- Player.java: Clase que representa al jugador.
- Enemy.java: Clase que representa a los enemigos.
- Coin.java: Clase que representa las monedas.
Código de Ejemplo
Main.java
import javax.swing.*;
public class Main {
public static void main(String[] args) {
JFrame frame = new JFrame("Juego de Plataforma");
GamePanel gamePanel = new GamePanel();
frame.add(gamePanel);
frame.setSize(800, 600);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
gamePanel.startGame();
}
}
GamePanel.java
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
public class GamePanel extends JPanel implements ActionListener {
private Player player;
private ArrayList<Enemy> enemies;
private ArrayList<Coin> coins;
private Timer timer;
private int score;
private int lives;
public GamePanel() {
player = new Player(100, 400);
enemies = new ArrayList<>();
coins = new ArrayList<>();
score = 0;
lives = 5;
// Crear enemigos y monedas
for (int i = 0; i < 5; i++) {
enemies.add(new Enemy(200 + i * 100, 400));
coins.add(new Coin(150 + i * 100, 350));
}
setFocusable(true);
addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent e) {
player.keyPressed(e);
}
});
timer = new Timer(20, this);
}
public void startGame() {
timer.start();
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
player.draw(g);
for (Enemy enemy : enemies) {
enemy.draw(g);
}
for (Coin coin : coins) {
coin.draw(g);
}
g.drawString("Puntuación: " + score, 10, 10);
g.drawString("Vidas: " + lives, 10, 30);
}
@Override
public void actionPerformed(ActionEvent e) {
player.move();
for (Enemy enemy : enemies) {
enemy.move();
if (player.getBounds().intersects(enemy.getBounds())) {
lives--;
if (lives <= 0) {
timer.stop();
JOptionPane.showMessageDialog(this, "Game Over");
}
}
}
for (int i = 0; i < coins.size(); i++) {
if (player.getBounds().intersects(coins.get(i).getBounds())) {
score += 10;
coins.remove(i);
if (score % 100 == 0) {
lives++;
}
break;
}
}
repaint();
}
}
Player.java
import java.awt.*;
import java.awt.event.KeyEvent;
import javax.swing.*;
public class Player {
private int x, y, width, height, dy;
private boolean jumping;
public Player(int x, int y) {
this.x = x;
this.y = y;
this.width = 30;
this.height = 30;
this.dy = 0;
this.jumping = false;
}
public void draw(Graphics g) {
g.setColor(Color.BLUE);
g.fillRect(x, y, width, height);
}
public void move() {
y += dy;
if (jumping) {
dy += 1; // Gravedad
if (y >= 400) { // Suelo
y = 400;
jumping = false;
dy = 0;
}
}
}
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_LEFT) {
x -= 5;
}
if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
x += 5;
}
if (e.getKeyCode() == KeyEvent.VK_SPACE && !jumping) {
jumping = true;
dy = -15; // Fuerza del salto
}
}
public Rectangle getBounds() {
return new Rectangle(x, y, width, height);
}
}
Enemy.java
import java.awt.*;
public class Enemy {
private int x, y, width, height;
public Enemy(int x, int y) {
this.x = x;
this.y = y;
this.width = 30;
this.height = 30;
}
public void draw(Graphics g) {
g.setColor(Color.RED);
g.fillRect(x, y, width, height);
}
public void move() {
// Lógica de movimiento del enemigo (puedes hacer que se muevan de lado a lado)
}
public Rectangle getBounds() {
return new Rectangle(x, y, width, height);
}
}
Coin.java
import java.awt.*;
public class Coin {
private int x, y, width, height;
public Coin(int x, int y) {
this.x = x;
this.y = y;
this.width = 20;
this.height = 20;
}
public void draw(Graphics g) {
g.setColor(Color.YELLOW);
g.fillOval(x, y, width, height);
}
public Rectangle getBounds() {
return new Rectangle(x, y, width, height);
}
}
Notas Finales
- Gráficos: Este código utiliza formas simples para representar al jugador, enemigos y monedas. Para un juego más atractivo, deberías usar imágenes.
- Física: La física del salto y la gravedad es muy básica. Puedes mejorarla para que sea más realista.
- Enemigos: La lógica de movimiento de los enemigos no está implementada. Puedes hacer que se muevan de lado a lado o que sigan al jugador.
- Colisiones: La detección de colisiones es simple. Puedes expandirla para incluir más interacciones.
- Sonido y Música: Considera agregar efectos de sonido y música de fondo para mejorar la experiencia del juego.
Este es un punto de partida básico. Puedes expandirlo y mejorarlo según tus necesidades y creatividad. ¡Diviértete programando!