ImageIcon playerIcon = new ImageIcon("/home/sagar_xbitlabs/NetBeansProjects/java_projects/images/mario.png");
Image playerImage = playerIcon.getImage();
g.drawImage(playerImage, pets.get(0).x * 40, pets.get(0).y * 40, 40, 40, null);
Instead of drawing a simple blue rectangle for the player, this code loads an image of Mario ("/home/sagar_xbitlabs/NetBeansProjects/java_projects/images/mario.png") and draws it on the screen. The ImageIcon class is used to represent the image.
In this code, the paths to the player and pet images are specified using absolute paths:
"/home/sagar_xbitlabs/NetBeansProjects/java_projects/images/mario.png"
It's generally a better practice to use relative paths within the project or load images from the classpath.
Apart from these differences, the core logic remains the same: player and pet movement, collision detection, energy management, and game over conditions are handled similarly to the previous example. The use of images for player representation is the main distinction.
/*
* Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
*/
package xx.newpetcollector;
/**
*
* @author sagar_xbitlabs
*/
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;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class NewPetCollector extends JFrame implements KeyListener {
private String playerName;
private int playerEnergy;
private List<Point> pets;
public NewPetCollector(String playerName) {
super("Pet Collector Game");
this.playerName = playerName;
this.playerEnergy = 100;
this.pets = new ArrayList<>();
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(400, 300);
setLocationRelativeTo(null);
addKeyListener(this);
setFocusable(true);
// Start a timer for pet movement
Timer timer = new Timer(2000, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
movePets();
repaint();
}
});
timer.start();
}
@Override
public void keyTyped(KeyEvent e) {}
@Override
public void keyPressed(KeyEvent e) {
movePlayer(e.getKeyCode());
}
@Override
public void keyReleased(KeyEvent e) {}
private void drawGame(Graphics g) {
// Draw pets
g.setColor(Color.GREEN);
for (Point pet : pets) {
g.fillRect(pet.x * 40, pet.y * 40, 40, 40);
}
// Draw player
ImageIcon playerIcon = new ImageIcon("/home/sagar_xbitlabs/NetBeansProjects/java_projects/images/mario.png");
Image playerImage = playerIcon.getImage();
g.drawImage(playerImage, pets.get(0).x * 40, pets.get(0).y * 40, 40, 40, null);
// Draw player energy
g.setColor(Color.BLACK);
g.drawString("Energy: " + playerEnergy, 10, 20);
}
private void movePlayer(int keyCode) {
// Update player position based on arrow keys
switch (keyCode) {
case KeyEvent.VK_LEFT:
pets.get(0).x = Math.max(0, pets.get(0).x - 1);
break;
case KeyEvent.VK_RIGHT:
pets.get(0).x = Math.min(6, pets.get(0).x + 1);
break;
case KeyEvent.VK_UP:
pets.get(0).y = Math.max(0, pets.get(0).y - 1);
break;
case KeyEvent.VK_DOWN:
pets.get(0).y = Math.min(4, pets.get(0).y + 1);
break;
}
// Check if player intersects with pets
for (int i = 1; i < pets.size(); i++) {
// Check if player collects a pet
if (pets.get(i).equals(pets.get(0))) {
pets.remove(i);
playerEnergy += 10; // Increase energy when collecting a pet
break; // Exit the loop after collecting one pet
}
}
// Update the game panel
repaint();
// Check game over conditions
if (pets.size() == 1) {
showEndGameMessage("Congratulations, " + playerName + "!\nYou collected all pets and completed the game!");
} else if (playerEnergy <= 0) {
showEndGameMessage("Game Over, " + playerName + "!\nYou ran out of energy.");
}
}
private void movePets() {
// Random movement for pets (except the first one which follows the player)
Random random = new Random();
for (int i = 1; i < pets.size(); i++) {
int movementX = random.nextInt(3) - 1; // Random movement between -1 and 1 for X-axis
int movementY = random.nextInt(3) - 1; // Random movement between -1 and 1 for Y-axis
pets.get(i).x = Math.max(0, Math.min(6, pets.get(i).x + movementX));
pets.get(i).y = Math.max(0, Math.min(4, pets.get(i).y + movementY));
}
}
private void showEndGameMessage(String message) {
JOptionPane.showMessageDialog(this, message, "Game Over", JOptionPane.INFORMATION_MESSAGE);
System.exit(0);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
String playerName = JOptionPane.showInputDialog(null, "Enter your name", "Player Name", JOptionPane.PLAIN_MESSAGE);
if (playerName != null && !playerName.trim().isEmpty()) {
NewPetCollector game = new NewPetCollector(playerName);
game.setVisible(true);
game.initPets();
}
});
}
private void initPets() {
Random random = new Random();
pets.add(new Point(random.nextInt(7), random.nextInt(5))); // Player
for (int i = 0; i < 4; i++) {
pets.add(new Point(random.nextInt(7), random.nextInt(5))); // Random pets
}
repaint();
}
@Override
public void paint(Graphics g) {
super.paint(g);
drawGame(g);
}
}