Skip to content

Commit e3d8a76

Browse files
committed
Initial Commit
1 parent 866a82c commit e3d8a76

24 files changed

Lines changed: 434 additions & 0 deletions

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
/.idea/
2+
/out/
3+
/Game_2D.iml
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package main.java.com.khomsi.game.entity;
2+
3+
import java.awt.image.BufferedImage;
4+
5+
//parent class for player, monster ect
6+
public class Entity {
7+
//Set default position
8+
public int x, y;
9+
public int speed;
10+
//we store our images in this variables
11+
public BufferedImage up, up1, up2, down, down1, down2, left, left1, left2, right, right1, right2;
12+
public String direction;
13+
14+
public int spriteCounter = 0;
15+
public int standCounter = 0;
16+
public int spriteNum = 1;
17+
}
Lines changed: 142 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,142 @@
1+
package main.java.com.khomsi.game.entity;
2+
3+
import main.java.com.khomsi.game.main.GamePanel;
4+
import main.java.com.khomsi.game.main.KeyHandler;
5+
6+
import javax.imageio.ImageIO;
7+
import java.awt.*;
8+
import java.awt.image.BufferedImage;
9+
import java.io.IOException;
10+
import java.util.Objects;
11+
12+
public class Player extends Entity {
13+
GamePanel gamePanel;
14+
KeyHandler keyHandler;
15+
16+
public Player(GamePanel gamePanel, KeyHandler keyHandler) {
17+
this.gamePanel = gamePanel;
18+
this.keyHandler = keyHandler;
19+
setDefaultValues();
20+
getPlayerImage();
21+
}
22+
23+
public void setDefaultValues() {
24+
x = 100;
25+
y = 100;
26+
speed = 3;
27+
direction = "down";
28+
}
29+
30+
public void getPlayerImage() {
31+
try {
32+
up = ImageIO.read(Objects.requireNonNull(
33+
getClass().getResourceAsStream("/player/boy_up.png")));
34+
35+
up1 = ImageIO.read(Objects.requireNonNull(
36+
getClass().getResourceAsStream("/player/boy_up_1.png")));
37+
38+
up2 = ImageIO.read(Objects.requireNonNull(
39+
getClass().getResourceAsStream("/player/boy_up_2.png")));
40+
41+
down = ImageIO.read(Objects.requireNonNull(
42+
getClass().getResourceAsStream("/player/boy_down.png")));
43+
44+
down1 = ImageIO.read(Objects.requireNonNull(
45+
getClass().getResourceAsStream("/player/boy_down_1.png")));
46+
47+
down2 = ImageIO.read(Objects.requireNonNull(
48+
getClass().getResourceAsStream("/player/boy_down_2.png")));
49+
50+
left = ImageIO.read(Objects.requireNonNull(
51+
getClass().getResourceAsStream("/player/boy_left.png")));
52+
53+
left1 = ImageIO.read(Objects.requireNonNull(
54+
getClass().getResourceAsStream("/player/boy_left_1.png")));
55+
56+
left2 = ImageIO.read(Objects.requireNonNull(
57+
getClass().getResourceAsStream("/player/boy_left_2.png")));
58+
59+
right = ImageIO.read(Objects.requireNonNull(
60+
getClass().getResourceAsStream("/player/boy_right.png")));
61+
62+
right1 = ImageIO.read(Objects.requireNonNull(
63+
getClass().getResourceAsStream("/player/boy_right_1.png")));
64+
65+
right2 = ImageIO.read(Objects.requireNonNull(
66+
getClass().getResourceAsStream("/player/boy_right_2.png")));
67+
68+
} catch (IOException e) {
69+
System.err.println("Error on getting player images!");
70+
e.printStackTrace();
71+
}
72+
}
73+
74+
//This method updates player's coordinates
75+
public void update() {
76+
//to avoid moving the character without pressing buttons
77+
if (keyHandler.upPressed || keyHandler.downPressed ||
78+
keyHandler.leftPressed || keyHandler.rightPressed) {
79+
80+
//use else if to avoid diagonal movement, if it's not needed, use just if
81+
if (keyHandler.upPressed) {
82+
direction = "up";
83+
y -= speed;
84+
} else if (keyHandler.downPressed) {
85+
direction = "down";
86+
y += speed;
87+
} else if (keyHandler.leftPressed) {
88+
direction = "left";
89+
x -= speed;
90+
} else if (keyHandler.rightPressed) {
91+
direction = "right";
92+
x += speed;
93+
}
94+
95+
//changing sprites, depends on nums
96+
spriteCounter++;
97+
if (spriteCounter <= 13 - speed) {
98+
spriteNum = 1;
99+
}
100+
if (spriteCounter > 13 && spriteCounter <= 24) {
101+
spriteNum = 2;
102+
}
103+
if (spriteCounter > 24) {
104+
spriteCounter = 0;
105+
}
106+
} else {
107+
standCounter++;
108+
if (standCounter == 24) {
109+
spriteNum = 3; // Idle sprite
110+
standCounter = 0;
111+
}
112+
}
113+
}
114+
115+
public void draw(Graphics2D graphics2D) {
116+
117+
BufferedImage image = null;
118+
switch (direction) {
119+
case "up" -> {
120+
if (spriteNum == 1) image = up1;
121+
if (spriteNum == 2) image = up2;
122+
if (spriteNum == 3) image = up;
123+
}
124+
case "down" -> {
125+
if (spriteNum == 1) image = down1;
126+
if (spriteNum == 2) image = down2;
127+
if (spriteNum == 3) image = down;
128+
}
129+
case "left" -> {
130+
if (spriteNum == 1) image = left1;
131+
if (spriteNum == 2) image = left2;
132+
if (spriteNum == 3) image = left;
133+
}
134+
case "right" -> {
135+
if (spriteNum == 1) image = right1;
136+
if (spriteNum == 2) image = right2;
137+
if (spriteNum == 3) image = right;
138+
}
139+
}
140+
graphics2D.drawImage(image, x, y, GamePanel.TILE_SIZE, GamePanel.TILE_SIZE, null);
141+
}
142+
}
Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
package main.java.com.khomsi.game.main;
2+
3+
import main.java.com.khomsi.game.entity.Player;
4+
import main.java.com.khomsi.game.tiles.TileManager;
5+
6+
import javax.swing.*;
7+
import java.awt.*;
8+
9+
public class GamePanel extends JPanel implements Runnable {
10+
//Screen settings
11+
12+
static final int ORIGINAL_TILE_SIZE = 16; //16x16 tiles
13+
14+
//we need to scale the size of hero, because on big screens it'll be too small
15+
static final int SCALE = 3;
16+
public static final int TILE_SIZE = ORIGINAL_TILE_SIZE * SCALE; //48x48 tiles
17+
public static final int MAX_SCREEN_COL = 16; //16 tiles horizontal
18+
public static final int MAX_SCREEN_ROW = 12; //12 tiles vertical
19+
public static final int SCREEN_WIDTH = TILE_SIZE * MAX_SCREEN_COL; //768 pixels
20+
public static final int SCREEN_HEIGHT = TILE_SIZE * MAX_SCREEN_ROW; //576 pixels
21+
22+
KeyHandler keyHandler = new KeyHandler();
23+
//use threads to start, stop,repeat actions.
24+
Thread gameThread;
25+
Player player = new Player(this, keyHandler);
26+
TileManager tileManager = new TileManager(this);
27+
28+
int FPS = 60;
29+
30+
public GamePanel() {
31+
//set size of this class
32+
this.setPreferredSize(new Dimension(SCREEN_WIDTH, SCREEN_HEIGHT));
33+
this.setBackground(Color.WHITE);
34+
//if true, all drawing from this comp will be done in an offscreen painting buffer.
35+
//if turn on, it can improve the performance of rendering
36+
this.setDoubleBuffered(true);
37+
this.addKeyListener(keyHandler);
38+
//focus to receive key input
39+
this.setFocusable(true);
40+
}
41+
42+
public void startGameThread() {
43+
//pass gamePanel to thread
44+
gameThread = new Thread(this);
45+
//automatically calls run method
46+
gameThread.start();
47+
}
48+
49+
@Override
50+
public void run() {
51+
double drawInterval = 1_000_000_000 / FPS;
52+
double delta = 0;
53+
long lastTime = System.nanoTime();
54+
long currentTime;
55+
long timer = 0;
56+
int drawCount = 0;
57+
58+
while (gameThread != null) {
59+
currentTime = System.nanoTime();
60+
61+
delta += (currentTime - lastTime) / drawInterval;
62+
timer += (currentTime - lastTime);
63+
lastTime = currentTime;
64+
65+
if (delta >= 1) {
66+
//update info as character position
67+
update();
68+
//draw the screen info with updated info
69+
repaint();
70+
delta--;
71+
drawCount++;
72+
}
73+
if (timer >= 1_000_000_000) {
74+
System.out.println("FPS: " + drawCount);
75+
drawCount = 0;
76+
timer = 0;
77+
}
78+
}
79+
}
80+
81+
public void update() {
82+
player.update();
83+
}
84+
85+
//method to draw the components on screen
86+
@Override
87+
public void paintComponent(Graphics graphics) {
88+
89+
super.paintComponent(graphics);
90+
91+
//extends graphic class and provide more control on geometry, color managment ect.
92+
Graphics2D graphics2D = (Graphics2D) graphics;
93+
tileManager.draw(graphics2D);
94+
95+
player.draw(graphics2D);
96+
//save some memory
97+
graphics2D.dispose();
98+
}
99+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package main.java.com.khomsi.game.main;
2+
3+
import java.awt.event.KeyEvent;
4+
import java.awt.event.KeyListener;
5+
6+
public class KeyHandler implements KeyListener {
7+
public boolean upPressed, downPressed, leftPressed, rightPressed;
8+
9+
@Override
10+
public void keyTyped(KeyEvent e) {
11+
//none
12+
}
13+
14+
@Override
15+
public void keyPressed(KeyEvent e) {
16+
//returns int, associated with the key in this event
17+
//for example, 17-ctrl, 8-backspace, 10-enter
18+
int code = e.getKeyCode();
19+
20+
if (code == KeyEvent.VK_W) upPressed = true;
21+
if (code == KeyEvent.VK_S) downPressed = true;
22+
if (code == KeyEvent.VK_A) leftPressed = true;
23+
if (code == KeyEvent.VK_D) rightPressed = true;
24+
}
25+
26+
@Override
27+
public void keyReleased(KeyEvent e) {
28+
int code = e.getKeyCode();
29+
30+
if (code == KeyEvent.VK_W) upPressed = false;
31+
if (code == KeyEvent.VK_S) downPressed = false;
32+
if (code == KeyEvent.VK_A) leftPressed = false;
33+
if (code == KeyEvent.VK_D) rightPressed = false;
34+
}
35+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package main.java.com.khomsi.game.main;
2+
3+
import javax.swing.*;
4+
5+
public class Main {
6+
public static void main(String[] args) {
7+
JFrame window = new JFrame();
8+
9+
//let window close properly, when use press close (x) button
10+
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
11+
//can't resize window
12+
window.setResizable(false);
13+
window.setTitle("My 2D Adventure Game");
14+
GamePanel gamePanel = new GamePanel();
15+
window.add(gamePanel);
16+
window.pack();
17+
18+
//the window will be displayed in the center of the screen
19+
window.setLocationRelativeTo(null);
20+
//we can see the window
21+
window.setVisible(true);
22+
gamePanel.startGameThread();
23+
}
24+
}

0 commit comments

Comments
 (0)