Initial commit

This commit is contained in:
Urban Modig
2025-07-31 11:19:06 +02:00
parent 75f8a0b557
commit dff2bdc5a8
81 changed files with 942 additions and 23 deletions

52
.gitignore vendored
View File

@ -1,26 +1,32 @@
# ---> Java target/
# Compiled class file !.mvn/wrapper/maven-wrapper.jar
*.class !**/src/main/**/target/
!**/src/test/**/target/
# Log file ### IntelliJ IDEA ###
*.log .idea/modules.xml
.idea/jarRepositories.xml
.idea/compiler.xml
.idea/libraries/
*.iws
*.iml
*.ipr
# BlueJ files ### Eclipse ###
*.ctxt .apt_generated
.classpath
# Mobile Tools for Java (J2ME) .factorypath
.mtj.tmp/ .project
.settings
# Package Files # .springBeans
*.jar .sts4-cache
*.war
*.nar
*.ear
*.zip
*.tar.gz
*.rar
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid*
replay_pid*
### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
build/
!**/src/main/**/build/
!**/src/test/**/build/

10
.idea/.gitignore generated vendored Normal file
View File

@ -0,0 +1,10 @@
# Default ignored files
/shelf/
/workspace.xml
# Editor-based HTTP Client requests
/httpRequests/
# Environment-dependent path to Maven home directory
/mavenHomeManager.xml
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml

7
.idea/encodings.xml generated Normal file
View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Encoding">
<file url="file://$PROJECT_DIR$/src/main/java" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/src/main/resources" charset="UTF-8" />
</component>
</project>

14
.idea/misc.xml generated Normal file
View File

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ExternalStorageConfigurationManager" enabled="true" />
<component name="MavenProjectsManager">
<option name="originalFiles">
<list>
<option value="$PROJECT_DIR$/pom.xml" />
</list>
</option>
</component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_21" default="true" project-jdk-name="ms-21" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/out" />
</component>
</project>

17
pom.xml Normal file
View File

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>My2DGame</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>21</maven.compiler.source>
<maven.compiler.target>21</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
</project>

View File

@ -0,0 +1,21 @@
package entity;
import java.awt.*;
import java.awt.image.BufferedImage;
public class Entity {
public int worldX;
public int worldY;
public int speed;
public BufferedImage up1, up2, down1, down2, left1, left2, right1, right2;
public String direction;
public int spriteCount = 0;
public int spriteNum = 1;
public Rectangle solidArea;
public int solidAreaDefaultX;
public int solidAreaDefaultY;
public boolean collisionOn = false;
}

View File

@ -0,0 +1,144 @@
package entity;
import main.GamePanel;
import main.KeyHandler;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Objects;
public class Player extends Entity {
private final GamePanel gamePanel;
private final KeyHandler keyHandler;
public final int screenX;
public final int screenY;
int hasKey = 0;
public Player(GamePanel gamePanel, KeyHandler keyHandler) {
this.gamePanel = gamePanel;
this.keyHandler = keyHandler;
screenX = gamePanel.screenWidth / 2 - (gamePanel.tileSize/2);
screenY = gamePanel.screenHeight / 2 - (gamePanel.tileSize/2);
solidArea = new Rectangle(8,16,32,32);
solidAreaDefaultX = solidArea.x;
solidAreaDefaultY = solidArea.y;
setDefaultValues();
getPlayerImage();
}
public void setDefaultValues(){
worldX = gamePanel.tileSize * 22;
worldY = gamePanel.tileSize * 22;
speed = 1;
direction = "down";
}
public void getPlayerImage(){
try {
up1 = ImageIO.read(Objects.requireNonNull(getClass().getResourceAsStream("/player/boy_up_1.png")));
up2 = ImageIO.read(Objects.requireNonNull(getClass().getResourceAsStream("/player/boy_up_2.png")));
down1 = ImageIO.read(Objects.requireNonNull(getClass().getResourceAsStream("/player/boy_down_1.png")));
down2 = ImageIO.read(Objects.requireNonNull(getClass().getResourceAsStream("/player/boy_down_2.png")));
left1 = ImageIO.read(Objects.requireNonNull(getClass().getResourceAsStream("/player/boy_left_1.png")));
left2 = ImageIO.read(Objects.requireNonNull(getClass().getResourceAsStream("/player/boy_left_2.png")));
right1 = ImageIO.read(Objects.requireNonNull(getClass().getResourceAsStream("/player/boy_right_1.png")));
right2 = ImageIO.read(Objects.requireNonNull(getClass().getResourceAsStream("/player/boy_right_2.png")));
}catch (IOException e){
e.printStackTrace();
}
}
public void update(){
if(keyHandler.upPressed || keyHandler.downPressed
|| keyHandler.leftPressed || keyHandler.rightPressed) {
if (keyHandler.upPressed) {
direction = "up";
}
if (keyHandler.downPressed) {
direction = "down";
}
if (keyHandler.leftPressed) {
direction = "left";
}
if (keyHandler.rightPressed) {
direction = "right";
}
//Check tile collision
collisionOn = false;
gamePanel.collisionChecker.checkTile(gamePanel.player);
int objectIndex = gamePanel.collisionChecker.checkObject(this,true);
pickUpObject(objectIndex);
if(!collisionOn){
switch (direction){
case "up" -> worldY -= speed;
case "down" -> worldY += speed;
case "left" -> worldX -= speed;
case "right" -> worldX += speed;
}
}
spriteCount++;
if (spriteCount == 30) {
if (spriteNum == 1) {
spriteNum = 2;
} else if (spriteNum == 2) {
spriteNum = 1;
}
spriteCount = 0;
}
}
}
public void pickUpObject(int objectIndex){
if(objectIndex != 999){
String objectName = gamePanel.obj[objectIndex].name;
switch (objectName){
case "Key" -> {
gamePanel.playSE(1);
hasKey++;
gamePanel.obj[objectIndex] = null;
}
case "Door" -> {
if(hasKey > 0 ){
gamePanel.playSE(3);
gamePanel.obj[objectIndex] = null;
hasKey--;
}
}
case "Boots" -> {
gamePanel.playSE(2);
speed += 1;
gamePanel.obj[objectIndex] = null;
}
}
}
}
public void draw(Graphics2D g2d){
BufferedImage image = null;
switch(direction){
case "up" -> image = spriteNum == 1 ? up1 : up2;
case "down" -> image = spriteNum == 1 ? down1 : down2;
case "left" -> image = spriteNum == 1 ? left1 : left2;
case "right" -> image = spriteNum == 1 ? right1 : right2;
}
g2d.drawImage(image, screenX, screenY, gamePanel.tileSize, gamePanel.tileSize, null);
}
private void drawRectangel(Graphics2D g2d) {
int num = (worldX - 24) / gamePanel.tileSize;
int num2 = (worldY - 24) / gamePanel.tileSize;
g2d.drawRect(screenX - gamePanel.tileSize, screenY - gamePanel.tileSize, 48, 48);
g2d.drawString("" + num + "," + num2, screenX - gamePanel.tileSize + 10, screenY - gamePanel.tileSize + 20);
}
}

View File

@ -0,0 +1,24 @@
package main;
import object.Boots;
import object.Chest;
import object.Door;
import object.Key;
public class AssetSetter {
GamePanel gamePanel;
public AssetSetter(GamePanel gamePanel) {
this.gamePanel = gamePanel;
}
public void setObject() {
gamePanel.obj[0] = new Key(23 * gamePanel.tileSize, 7 * gamePanel.tileSize);
gamePanel.obj[1] = new Key(23 * gamePanel.tileSize, 40 * gamePanel.tileSize);
gamePanel.obj[2] = new Key(38 * gamePanel.tileSize, 9 * gamePanel.tileSize);
gamePanel.obj[3] = new Door(10 * gamePanel.tileSize, 11 * gamePanel.tileSize);
gamePanel.obj[4] = new Door(8 * gamePanel.tileSize, 28 * gamePanel.tileSize);
gamePanel.obj[5] = new Door(12 * gamePanel.tileSize, 22 * gamePanel.tileSize);
gamePanel.obj[6] = new Chest(10 * gamePanel.tileSize, 7 * gamePanel.tileSize);
gamePanel.obj[7] = new Boots(37 * gamePanel.tileSize, 42 * gamePanel.tileSize);
}
}

View File

@ -0,0 +1,122 @@
package main;
import entity.Entity;
public class CollisionChecker {
private final GamePanel gamePanel;
public CollisionChecker(GamePanel gamePanel) {
this.gamePanel = gamePanel;
}
public void checkTile(Entity entity) {
int entityLeftWorldX = entity.worldX + entity.solidArea.x;
int entityRightWorldX = entity.worldX + entity.solidArea.x + entity.solidArea.width;
int entityTopWorldY = entity.worldY + entity.solidArea.y;
int entityBottomWorldY = entity.worldY + entity.solidArea.y + entity.solidArea.height;
int entityLeftCol = entityLeftWorldX/gamePanel.tileSize;
int entityRightCol = entityRightWorldX/gamePanel.tileSize;
int entityTopRow = entityTopWorldY/gamePanel.tileSize;
int entityBottomRow = entityBottomWorldY/gamePanel.tileSize;
int tileNum1;
int tileNum2;
switch (entity.direction){
case "up" -> {
entityTopRow = (entityTopWorldY - entity.speed)/gamePanel.tileSize;
tileNum1 = gamePanel.tileManager.mapTileNum[entityTopRow][entityLeftCol];
tileNum2 = gamePanel.tileManager.mapTileNum[entityTopRow][entityRightCol];
if(gamePanel.tileManager.tiles[tileNum1].collission || gamePanel.tileManager.tiles[tileNum2].collission){
entity.collisionOn = true;
}
}
case "down" -> {
entityBottomRow = (entityBottomWorldY + entity.speed)/gamePanel.tileSize;
tileNum1 = gamePanel.tileManager.mapTileNum[entityBottomRow][entityLeftCol];
tileNum2 = gamePanel.tileManager.mapTileNum[entityBottomRow][entityRightCol];
if(gamePanel.tileManager.tiles[tileNum1].collission || gamePanel.tileManager.tiles[tileNum2].collission){
entity.collisionOn = true;
}
}
case "left" -> {
entityLeftCol = (entityLeftWorldX - entity.speed)/gamePanel.tileSize;
tileNum1 = gamePanel.tileManager.mapTileNum[entityTopRow][entityLeftCol];
tileNum2 = gamePanel.tileManager.mapTileNum[entityBottomRow][entityLeftCol];
if(gamePanel.tileManager.tiles[tileNum1].collission || gamePanel.tileManager.tiles[tileNum2].collission){
entity.collisionOn = true;
}
}
case "right" -> {
entityRightCol = (entityRightWorldX + entity.speed)/gamePanel.tileSize;
tileNum1 = gamePanel.tileManager.mapTileNum[entityTopRow][entityRightCol];
tileNum2 = gamePanel.tileManager.mapTileNum[entityBottomRow][entityRightCol];
if(gamePanel.tileManager.tiles[tileNum1].collission || gamePanel.tileManager.tiles[tileNum2].collission){
entity.collisionOn = true;
}
}
}
}
public int checkObject(Entity entity, boolean player) {
int index = 999;
for (int i = 0; i < gamePanel.obj.length; i++) {
if(gamePanel.obj[i] != null){
entity.solidArea.x = entity.worldX + entity.solidArea.x;
entity.solidArea.y = entity.worldY + entity.solidArea.y;
gamePanel.obj[i].solidArea.x = gamePanel.obj[i].worldX + gamePanel.obj[i].solidArea.x;
gamePanel.obj[i].solidArea.y = gamePanel.obj[i].worldY + gamePanel.obj[i].solidArea.y;
switch (entity.direction){
case "up" -> {
entity.solidArea.y -= entity.speed;
if(entity.solidArea.intersects(gamePanel.obj[i].solidArea)){
if(gamePanel.obj[i].collision){
entity.collisionOn = true;
}
if(player){
index = i;
}
}
}
case "down" -> {
entity.solidArea.y += entity.speed;
if(entity.solidArea.intersects(gamePanel.obj[i].solidArea)){
if(gamePanel.obj[i].collision){
entity.collisionOn = true;
}
if(player){
index = i;
} }
}
case "left" -> {
entity.solidArea.x -= entity.speed;
if(entity.solidArea.intersects(gamePanel.obj[i].solidArea)){
if(gamePanel.obj[i].collision){
entity.collisionOn = true;
}
if(player){
index = i;
} }
}
case "right" -> {
entity.solidArea.x += entity.speed;
if(entity.solidArea.intersects(gamePanel.obj[i].solidArea)){
if(gamePanel.obj[i].collision){
entity.collisionOn = true;
}
if(player){
index = i;
} }
}
}
entity.solidArea.x = entity.solidAreaDefaultX;
entity.solidArea.y = entity.solidAreaDefaultY;
gamePanel.obj[i].solidArea.x = gamePanel.obj[i].solidAreaDefaultX;
gamePanel.obj[i].solidArea.y = gamePanel.obj[i].solidAreaDefaultY;
}
}
return index;
}
}

View File

@ -0,0 +1,126 @@
package main;
import entity.Player;
import object.SuperObject;
import tile.TileManager;
import javax.swing.*;
import java.awt.*;
import java.util.Arrays;
import java.util.Objects;
public class GamePanel extends JPanel implements Runnable {
private final static int FPS_SET = 120;
private final static int UPS_SET = 200;
private final static double timePerFrame = 1000000000.0 / FPS_SET;
private final static double timePerUpdate = 1000000000.0 / UPS_SET;
//SCREEN SETTINGS
int originalTileSize = 16;
int scale = 3;
public int tileSize = originalTileSize * scale;
public int maxScreenCol = 16;
public int maxScreenRow = 12;
public int screenWidth = maxScreenCol * tileSize;
public int screenHeight = maxScreenRow * tileSize;
//WORLD
public final int maxWorldCol = 50;
public final int maxWorldRow = 50;
// SYSTEM
TileManager tileManager = new TileManager(this);
KeyHandler keyHandler = new KeyHandler();
Sound sound = new Sound();
public CollisionChecker collisionChecker = new CollisionChecker(this);
public AssetSetter assetSetter = new AssetSetter(this);
Thread gameThread;
//ENTITY AND OBJECT
public Player player = new Player(this, keyHandler);
public SuperObject[] obj = new SuperObject[10];
public GamePanel() {
this.setPreferredSize(new Dimension(screenWidth, screenHeight));
this.setBackground(Color.BLACK);
this.setDoubleBuffered(true);
this.addKeyListener(keyHandler);
this.setFocusable(true);
}
public void setupGame(){
assetSetter.setObject();
playMusic(0);
}
public void startGameThread() {
this.gameThread = new Thread(this);
gameThread.start();
}
public void update(){
player.update();
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
tileManager.draw(g2d);
Arrays.stream(obj)
.filter(Objects::nonNull)
.forEach(o -> o.draw(g2d, this));
player.draw(g2d);
g2d.dispose();
}
public void playMusic(int i) {
sound.setFile(i);
sound.play();
sound.loop();
}
public void stopMusic() {
sound.stop();
}
public void playSE(int i) {
sound.setFile(i);
sound.play();
}
@Override
public void run() {
long previousTime = System.nanoTime();
int frames = 0;
int updates = 0;
long lastCheck = System.currentTimeMillis();
double deltaU = 0;
double deltaF = 0;
while (gameThread !=null && gameThread.isAlive()) {
long currentTime = System.nanoTime();
deltaU += (currentTime - previousTime) / timePerUpdate;
deltaF += (currentTime - previousTime) / timePerFrame;
previousTime = currentTime;
if (deltaU >= 1) {
update();
updates++;
deltaU--;
}
if (deltaF >= 1) {
repaint();
frames++;
deltaF--;
}
if (System.currentTimeMillis() - lastCheck >= 1000) {
lastCheck = System.currentTimeMillis();
System.out.println("FPS: " + frames + " | UPS: " + updates);
frames = 0;
updates = 0;
}
}
}
}

View File

@ -0,0 +1,48 @@
package main;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
public class KeyHandler implements KeyListener {
public boolean upPressed;
public boolean leftPressed;
public boolean downPressed;
public boolean rightPressed;
@Override
public void keyTyped(KeyEvent e) {}
@Override
public void keyPressed(KeyEvent e) {
int keyCode = e.getKeyCode();
if (keyCode == KeyEvent.VK_W) {
upPressed = true;
}
if (keyCode == KeyEvent.VK_S) {
downPressed = true;
}
if (keyCode == KeyEvent.VK_A) {
leftPressed = true;
}
if (keyCode == KeyEvent.VK_D) {
rightPressed = true;
}
}
@Override
public void keyReleased(KeyEvent e) {
int keyCode = e.getKeyCode();
if (keyCode == KeyEvent.VK_W) {
upPressed = false;
}
if (keyCode == KeyEvent.VK_S) {
downPressed = false;
}
if (keyCode == KeyEvent.VK_A) {
leftPressed = false;
}
if (keyCode == KeyEvent.VK_D) {
rightPressed = false;
}
}
}

View File

@ -0,0 +1,23 @@
package main;
import javax.swing.*;
public class Main {
public static void main(String[] args) {
JFrame window = new JFrame();
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.setResizable(false);
window.setTitle("2d");
GamePanel gamePanel = new GamePanel();
window.add(gamePanel);
window.pack();
window.setLocationRelativeTo(null);
window.setVisible(true);
gamePanel.setupGame();
gamePanel.startGameThread();
}
}

View File

@ -0,0 +1,36 @@
package main;
import javax.sound.sampled.*;
import java.io.IOException;
import java.net.URL;
public class Sound {
Clip clip;
URL[] soundUrl = new URL[30];
public Sound() {
soundUrl[0] = Sound.class.getResource("/sound/BlueBoyAdventure.wav");
soundUrl[1] = Sound.class.getResource("/sound/coin.wav");
soundUrl[2] = Sound.class.getResource("/sound/powerup.wav");
soundUrl[3] = Sound.class.getResource("/sound/unlock.wav");
soundUrl[4] = Sound.class.getResource("/sound/fanfare.wav");
}
public void setFile(int i){
try {
AudioInputStream ais = AudioSystem.getAudioInputStream(soundUrl[i]);
clip = AudioSystem.getClip();
clip.open(ais);
} catch (UnsupportedAudioFileException | IOException | LineUnavailableException e) {
e.printStackTrace();
}
}
public void play() {
clip.start();
}
public void loop() {
clip.loop(Clip.LOOP_CONTINUOUSLY);
}
public void stop() {
clip.stop();
}
}

View File

@ -0,0 +1,18 @@
package object;
import javax.imageio.ImageIO;
import java.io.IOException;
public class Boots extends SuperObject{
public Boots(int x, int y) {
name = "Boots";
worldX = x;
worldY = y;
try{
image = ImageIO.read(getClass().getResourceAsStream("/objects/boots.png"));
}catch(IOException e){
e.printStackTrace();
}
}
}

View File

@ -0,0 +1,18 @@
package object;
import javax.imageio.ImageIO;
import java.io.IOException;
public class Chest extends SuperObject{
public Chest(int x, int y) {
name = "Chest";
worldX = x;
worldY = y;
try{
image = ImageIO.read(getClass().getResourceAsStream("/objects/chest.png"));
}catch(IOException e){
e.printStackTrace();
}
}
}

View File

@ -0,0 +1,19 @@
package object;
import javax.imageio.ImageIO;
import java.io.IOException;
public class Door extends SuperObject{
public Door(int x, int y) {
name = "Door";
worldX = x;
worldY = y;
try{
image = ImageIO.read(getClass().getResourceAsStream("/objects/door.png"));
}catch(IOException e){
e.printStackTrace();
}
collision = true;
}
}

View File

@ -0,0 +1,18 @@
package object;
import javax.imageio.ImageIO;
import java.io.IOException;
public class Key extends SuperObject{
public Key(int x, int y) {
name = "Key";
worldX = x;
worldY = y;
try{
image = ImageIO.read(getClass().getResourceAsStream("/objects/key.png"));
}catch(IOException e){
e.printStackTrace();
}
}
}

View File

@ -0,0 +1,29 @@
package object;
import main.GamePanel;
import java.awt.*;
import java.awt.image.BufferedImage;
public class SuperObject {
public String name;
public BufferedImage image;
public boolean collision = false;
public int worldX;
public int worldY;
public Rectangle solidArea = new Rectangle(0,0,48,48);
public int solidAreaDefaultX = 0;
public int solidAreaDefaultY = 0;
public void draw(Graphics2D g2d, GamePanel gamePanel) {
// Only drawImage for tiles within camera
if (worldX + gamePanel.tileSize> gamePanel.player.worldX - gamePanel.player.screenX &&
worldX -gamePanel.tileSize < gamePanel.player.worldX + gamePanel.player.screenX &&
worldY + gamePanel.tileSize > gamePanel.player.worldY - gamePanel.player.screenY &&
worldY - gamePanel.tileSize < gamePanel.player.worldY + gamePanel.player.screenY) {
int screenX = worldX - gamePanel.player.worldX + gamePanel.player.screenX;
int screenY = worldY - gamePanel.player.worldY + gamePanel.player.screenY;
g2d.drawImage(image, screenX, screenY, gamePanel.tileSize, gamePanel.tileSize, null);
}
}
}

View File

@ -0,0 +1,8 @@
package tile;
import java.awt.image.BufferedImage;
public class Tile {
public BufferedImage image;
public boolean collission = false;
}

View File

@ -0,0 +1,99 @@
package tile;
import main.GamePanel;
import javax.imageio.ImageIO;
import java.awt.*;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Arrays;
public class TileManager {
GamePanel gp;
public Tile[] tiles = new Tile[10];
public int[][] mapTileNum;
public TileManager(GamePanel gp) {
this.gp = gp;
getTileImage();
this.mapTileNum = loadMap("/maps/world01.txt");
}
public int[][] loadMap(String path) {
int[][] map = new int[gp.maxWorldRow][gp.maxWorldCol];
try {
InputStream stream = GamePanel.class.getResourceAsStream(path);
BufferedReader reader = new BufferedReader(new InputStreamReader(stream));
int row = 0;
String line;
while ((line = reader.readLine()) != null && row < gp.maxWorldRow) {
map[row++] = Arrays.stream(line.split(" "))
.mapToInt(Integer::parseInt)
.toArray();
}
reader.close();
} catch (Exception e) {
e.printStackTrace();
}
return map;
}
public void getTileImage() {
try {
tiles[0] = new Tile();
tiles[0].image = ImageIO.read(GamePanel.class.getResourceAsStream("/tiles/grass.png"));
tiles[1] = new Tile();
tiles[1].image = ImageIO.read(GamePanel.class.getResourceAsStream("/tiles/wall.png"));
tiles[1].collission = true;
tiles[2] = new Tile();
tiles[2].image = ImageIO.read(GamePanel.class.getResourceAsStream("/tiles/water.png"));
tiles[2].collission = true;
tiles[3] = new Tile();
tiles[3].image = ImageIO.read(GamePanel.class.getResourceAsStream("/tiles/earth.png"));
tiles[4] = new Tile();
tiles[4].image = ImageIO.read(GamePanel.class.getResourceAsStream("/tiles/tree.png"));
tiles[4].collission = true;
tiles[5] = new Tile();
tiles[5].image = ImageIO.read(GamePanel.class.getResourceAsStream("/tiles/sand.png"));
} catch (IOException e) {
e.printStackTrace();
}
}
public void draw(Graphics2D g2d) {
int worldCol = 0;
int worldRow = 0;
while (worldCol < gp.maxWorldCol && worldRow < gp.maxWorldRow) {
int tileNum = mapTileNum[worldRow][worldCol];
int worldX = worldCol * gp.tileSize;
int worldY = worldRow * gp.tileSize;
// Only drawImage for tiles within camera
if (worldX + gp.tileSize> gp.player.worldX - gp.player.screenX &&
worldX -gp.tileSize < gp.player.worldX + gp.player.screenX &&
worldY + gp.tileSize > gp.player.worldY - gp.player.screenY &&
worldY - gp.tileSize < gp.player.worldY + gp.player.screenY) {
int screenX = worldX - gp.player.worldX + gp.player.screenX;
int screenY = worldY - gp.player.worldY + gp.player.screenY;
g2d.drawImage(tiles[tileNum].image, screenX, screenY, gp.tileSize, gp.tileSize, null);
}
worldCol++;
if (worldCol == gp.maxWorldCol) {
worldCol = 0;
worldRow++;
}
}
}
}

View File

@ -0,0 +1,12 @@
1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
1 0 0 0 0 0 2 2 0 0 0 0 0 0 0 1
1 0 0 0 0 2 2 2 2 0 0 0 0 0 0 1
1 0 0 0 0 2 2 2 2 0 0 0 0 0 0 1
1 0 0 0 0 2 2 2 2 2 0 0 0 0 0 1
1 0 0 0 0 2 2 2 2 0 0 0 0 0 0 1
1 0 0 0 0 0 0 0 2 0 0 0 0 0 0 1
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1

View File

@ -0,0 +1,50 @@
4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 0 2 2 2 2 2 0 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 2 2 2 2 2 2 2 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 2 2 2 2 2 2 2 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 2 2 2 2 2 2 2 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
4 4 4 4 4 4 4 4 1 1 1 1 1 4 4 4 4 4 4 4 4 2 2 2 2 2 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
4 4 4 4 4 4 4 4 1 3 3 3 1 4 4 4 4 4 4 4 0 0 0 5 0 0 0 4 4 4 4 4 4 0 5 5 5 5 5 5 5 4 4 4 4 4 4 4 4 4
4 4 4 4 4 4 4 4 1 3 3 3 1 4 4 4 4 4 4 4 4 0 0 0 0 0 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 4 4 4 4 4 4 4 4
4 4 4 4 4 4 4 4 1 3 3 3 1 4 4 4 4 4 4 4 4 4 0 0 0 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 4 4 4 4 4 4 4 4
4 4 4 4 4 4 4 4 1 3 3 3 1 4 4 4 4 4 4 4 4 4 4 5 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 4 4 4 4 4 4 4 4
4 4 4 4 4 4 4 4 1 1 0 1 1 4 4 4 4 4 4 4 4 4 4 5 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 4 4 4 4 4 4 4 4
4 4 4 4 4 4 4 4 4 4 0 4 4 4 4 4 4 4 4 4 4 4 4 5 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 4 4 4 4 4 4 4 4 4
4 4 4 4 4 4 4 4 4 4 0 4 4 4 4 4 4 4 4 4 4 4 4 5 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 4 4 4 4 4 4 4 4 4 4 4
4 4 4 4 4 4 4 4 4 4 0 4 4 4 4 4 4 4 4 4 4 4 4 5 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 4 4 4 4 4 4 4 4 4 4 4
4 4 4 4 4 4 4 4 4 4 0 4 4 4 4 4 4 4 4 4 4 4 4 5 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 4 4 4 4 4 4 4 4 4 4 4
4 4 4 4 4 4 4 4 0 0 0 4 4 4 4 4 4 4 4 4 4 4 4 5 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 4 4 4 4 4 4 4 4 4 4 4
4 4 4 4 4 4 4 4 0 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 4 4 4 4 4 4 4 4 4 4 4
4 4 4 4 4 4 4 4 0 4 4 4 4 4 4 4 4 4 4 4 4 4 0 5 0 4 4 4 4 4 4 4 4 4 4 4 5 5 5 4 4 4 4 4 4 4 4 4 4 4
4 4 4 4 4 4 4 4 0 4 4 4 4 4 4 4 4 4 4 4 4 0 0 5 0 0 4 4 4 4 4 4 4 4 4 4 5 4 4 4 4 4 4 4 4 4 4 4 4 4
4 4 4 4 4 4 4 4 0 4 4 4 4 4 4 4 4 4 4 4 0 0 0 5 0 0 0 4 4 4 4 4 4 4 4 5 5 4 4 4 4 4 4 4 4 4 4 4 4 4
4 4 4 4 4 4 4 4 0 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 4 4 4 4 4 4 4 4 4 4 4 4 4
4 4 4 4 4 4 4 4 0 4 4 4 0 4 4 4 4 4 4 4 0 0 0 5 0 0 0 4 4 4 4 4 4 4 4 4 5 4 4 4 4 4 4 4 4 4 4 4 4 4
4 4 4 4 4 4 4 4 0 4 4 4 0 4 4 4 4 4 4 4 4 0 0 5 0 0 4 4 4 4 4 4 4 4 4 4 5 4 4 4 4 4 4 4 4 4 4 4 4 4
4 4 4 4 4 4 4 4 0 4 4 4 0 4 4 4 4 4 4 4 4 4 0 5 0 4 4 4 4 4 4 4 4 4 4 4 5 4 4 4 4 4 4 4 4 4 4 4 4 4
4 4 4 4 4 4 4 4 0 4 4 4 0 0 0 4 4 4 4 4 4 4 4 5 4 4 4 4 4 4 4 4 4 4 4 4 5 4 4 4 4 4 4 4 4 4 4 4 4 4
4 4 4 4 4 4 4 4 0 4 4 4 4 4 0 4 4 4 4 4 4 4 4 5 4 4 4 4 4 4 4 4 4 4 4 4 5 4 4 4 4 4 4 4 4 4 4 4 4 4
4 4 4 4 4 4 4 4 0 4 4 4 4 4 0 4 4 4 4 4 4 4 4 5 4 4 4 0 4 4 4 4 4 4 4 0 5 4 4 4 4 4 4 4 4 4 4 4 4 4
4 4 4 4 4 4 4 4 0 4 4 4 4 4 0 4 4 4 4 4 4 4 4 5 4 4 4 4 4 4 0 4 4 4 4 4 5 4 4 4 4 4 4 4 4 4 4 4 4 4
4 4 4 4 4 4 4 4 0 0 0 0 0 0 0 4 4 4 4 4 4 4 4 5 4 4 4 4 4 4 0 4 4 4 4 4 5 4 4 4 4 4 4 4 4 4 4 4 4 4
4 4 4 4 4 4 4 4 0 0 0 0 0 0 0 4 4 4 4 4 4 4 4 5 4 4 4 4 4 4 4 4 4 4 4 4 0 4 4 4 4 4 4 4 4 4 4 4 4 4
4 4 4 4 4 4 4 4 0 0 0 0 0 0 0 4 4 4 4 4 4 4 4 5 4 4 4 4 4 4 4 4 4 4 4 0 0 0 4 4 4 4 4 4 4 4 4 4 4 4
4 4 4 4 4 4 4 4 0 0 0 0 0 0 0 4 4 4 4 4 4 4 4 5 4 4 4 4 4 4 4 4 4 4 4 0 0 0 4 4 4 4 4 4 4 4 4 4 4 4
4 4 4 4 4 4 4 4 0 0 0 0 0 0 0 4 4 4 4 4 4 4 4 5 4 4 4 4 4 4 4 4 4 4 4 0 0 0 4 4 4 4 4 4 4 4 4 4 4 4
4 4 4 4 4 4 4 4 0 0 0 0 0 0 0 4 4 4 4 4 4 4 4 5 4 4 4 4 4 4 4 4 4 4 4 0 0 0 4 4 4 4 4 4 4 4 4 4 4 4
4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 4 4 4 4 4 4 4 4 4 4 4 0 0 0 4 4 4 4 4 4 4 4 4 4 4 4
4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 0 0 0 0 0 0 0 0 4 4 4 4 4 4 4 0 0 0 0 0 4 4 4 4 4 4 4 4 4 4 4
4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 0 0 0 0 0 0 0 0 0 0 4 4 0 4 4 0 0 0 0 0 0 4 4 4 4 4 4 4 4 4 4 4
4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 0 0 0 0 0 0 0 0 0 0 4 4 4 4 0 0 0 0 0 0 0 4 4 4 4 4 4 4 4 4 4 4
4 4 4 4 4 4 4 4 4 4 4 4 4 0 4 4 4 4 0 0 0 0 0 0 0 0 0 0 0 4 4 4 0 0 0 0 0 4 0 4 4 4 4 4 4 4 4 4 4 4
4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 0 0 0 4 4 4 4 4 4 4 4 4 4 4
4 4 4 4 4 4 4 4 4 4 4 4 4 0 4 4 4 4 4 0 0 0 0 0 0 0 0 4 4 4 4 0 0 0 0 0 0 0 0 4 4 4 4 4 4 4 4 4 4 4
4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 0 0 0 0 0 0 4 4 4 4 4 0 0 4 0 0 4 0 0 4 4 4 4 4 4 4 4 4 4 4
4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 0 0 0 0 0 0 4 4 4 4 4 4 4 4 4 4 4 4
4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4

View File

@ -0,0 +1,50 @@
4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0
4 4 4 4 4 4 4 4 4 4 4 4 4 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
4 4 4 4 4 4 4 4 4 4 4 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 1 1 1 1 1 1 1 1 1 0 0 1 0 0 0 0 0 0 0
4 4 4 4 4 4 4 4 4 4 4 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0
4 4 4 4 4 4 4 4 4 4 4 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0
4 4 4 4 4 4 4 4 4 4 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0
4 4 4 4 4 4 4 4 4 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0
4 4 4 4 4 4 4 4 4 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0
4 4 4 4 4 4 4 4 4 0 0 0 4 4 4 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 1 1 1 1 1 1 1 1 1 0 0 1 0 0 0 0 0 0 0
4 4 4 4 4 4 4 0 0 0 0 4 4 4 4 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
4 4 4 4 4 4 0 4 0 0 0 4 4 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 5 5 2 2 2 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 5 5 5 2 2 2 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 5 5 5 5 2 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 5 5 5 5 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 5 5 5 5 5 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 5 5 5 5 5 5 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 5 5 5 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 613 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 680 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 733 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 638 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 711 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 591 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 614 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 616 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 619 B