diff --git a/Camera.pde b/Camera.pde index 7d9ff0c..bdea927 100644 --- a/Camera.pde +++ b/Camera.pde @@ -2,6 +2,8 @@ class Camera { private float x; private float y; private Render render; + + private int w, h; Camera(int x, int y, World world) { this.x = x; @@ -27,14 +29,24 @@ class Camera { public float getY() { return y; } public void showArea() { + w = width / settings.chunkSize + 10; + h = height / settings.chunkSize + 10; + + w /= scale; + h /= scale; push(); - translate(-x * settings.chunkSize, -y * settings.chunkSize); - for (int i = 0; i < width / settings.chunkSize + 1; i++) { - for (int j = 0; j < height / settings.chunkSize + 5; j++) { - render.renderChunk(i + (int)x, j + (int)y); - render.renderShadow(i + (int)x, j + (int)y); + scale(scale); + translate(-x * settings.chunkSize, -y * settings.chunkSize); + for (int i = 0; i < w; i++) { + for (int j = 0; j < h; j++) { + render.renderChunk(i + (int)x, j + (int)y); + } + } + for (int i = 0; i < w; i++) { + for (int j = 0; j < h; j++) { + render.renderShadow(i + (int)x, j + (int)y); + } } - } pop(); } diff --git a/Controller.pde b/Controller.pde index 9de1ca7..b762435 100644 --- a/Controller.pde +++ b/Controller.pde @@ -1,4 +1,5 @@ Boolean up = false, down = false, left = false, right = false, shift = false; +float scale = 1; void keyPressed() { if (key == 'r') { @@ -35,3 +36,9 @@ void move() { cam.setY(cam.getY() + settings.cameraSpeed * (shift ? settings.cameraSprintCoefficient : 1)); // down } } + +void mouseWheel(MouseEvent e) { + scale -= e.getCount() * 0.1; + scale = scale <= 0 ? 0.1 : scale; + scale = scale >= 5 ? 5 : scale; +} diff --git a/DEBUG.pde b/DEBUG.pde index 4878fad..eab0c67 100644 --- a/DEBUG.pde +++ b/DEBUG.pde @@ -1,12 +1,12 @@ void MAIN_DEBUG() { if (settings.MAIN_DEBUG) { fill(0, 0, 200); - text(cam.getX(), 10, 10); - text(cam.getY(), 10, 20); - text(world.getXSize(), 10, 30); - - - ellipse(settings.chunkSize, settings.chunkSize, sin(millis() * 0.001) * 10, sin(millis() * 0.001) * 10); + text("Camera X: " + cam.getX(), 10, 10); + text("Camera Y: " + cam.getY(), 10, 20); + text("World X size:" + world.getXSize(), 10, 30); + text("Scale: " + scale, 10, 40); + text("FPS: " + (int)frameRate, 10, 50); + ellipse(2, 2, sin(millis() * 0.001) * 10, sin(millis() * 0.001) * 10); } } diff --git a/History/07.05.md b/History/07.05.md new file mode 100644 index 0000000..6e63463 --- /dev/null +++ b/History/07.05.md @@ -0,0 +1,6 @@ +Осталось доделать класс камеры, дальше только надеяться на рабочий прототип. + +07.05: Ура, готов рабочий прототип. Осталось только допелить управление. В будущем будет проблема с плавной камерой, но её наверное можно будет решить с помощью translate(). +Баг, связанный с ArrayList<>. Вызывается исключение. Лечение: нужно заполнять невидимую область null или перейти на HashMap. Правда, волнует вопрос с производительностью, что быстрее ArrayList или HashMap? + +Ура, всё работает. Бага больше нет. Камера двигается плавно. \ No newline at end of file diff --git a/History/13.05.md b/History/13.05.md new file mode 100644 index 0000000..5574272 --- /dev/null +++ b/History/13.05.md @@ -0,0 +1,5 @@ +13.05: На данный момент у меня появились тени в игре и масштаб. УРА! + +13.05 + +13.05 \ No newline at end of file diff --git a/History/images/13.05.png b/History/images/13.05.png new file mode 100644 index 0000000..8a8708b Binary files /dev/null and b/History/images/13.05.png differ diff --git a/History/images/13.05_2.png b/History/images/13.05_2.png new file mode 100644 index 0000000..ab351d2 Binary files /dev/null and b/History/images/13.05_2.png differ diff --git a/Render.pde b/Render.pde index a1bb7a4..296408a 100644 --- a/Render.pde +++ b/Render.pde @@ -1,4 +1,4 @@ -class Render { +class Render { //<>// //<>// //<>// //<>// //<>// private Textures textures; private World world; @@ -11,53 +11,88 @@ class Render { Chunk chunk = world.getChunk(x, y); beginShape(); - texture(textures.getTexture(chunk.getHight())); - vertex(x * settings.chunkSize, y * settings.chunkSize, 0, 0); - vertex((1 + x) * settings.chunkSize, y * settings.chunkSize, settings.chunkSize, 0); - vertex((1 + x) * settings.chunkSize, (1 + y) * settings.chunkSize, settings.chunkSize, settings.chunkSize); - vertex(x * settings.chunkSize, (1 + y) * settings.chunkSize, 0, settings.chunkSize); + texture(textures.getTexture(chunk.getHight())); + vertex(x * settings.chunkSize, y * settings.chunkSize, 0, 0); + vertex((1 + x) * settings.chunkSize, y * settings.chunkSize, settings.chunkSize, 0); + vertex((1 + x) * settings.chunkSize, (1 + y) * settings.chunkSize, settings.chunkSize, settings.chunkSize); + vertex(x * settings.chunkSize, (1 + y) * settings.chunkSize, 0, settings.chunkSize); endShape(); CHUNK_DEBUG(chunk); } - + public void renderShadow(int x, int y) { + if (!settings.renderShadows) return; Chunk[][] chunks = new Chunk[3][3]; - - for (int i = 0; i < 3; i++) { - for (int j = 0; j < 3; j++) { - chunks[i][j] = world.getChunk(j - 1 + x, i - 1 + y); + + for (int i = 0; i < chunks.length; i++) { + for (int j = 0; j < chunks[0].length; j++) { + chunks[i][j] = world.getChunk(j - 1 + x, i - 1 + y); } } - + for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { if (chunks[i][j] != null && chunks[i][j].getHight() < chunks[1][1].getHight()) { PImage shadow = null; - - if (i == 0 && j == 0){ shadow = textures.getShadow(4);} // | 00 01 02 | | 4 0 5 | - else if (i == 0 && j == 1){ shadow = textures.getShadow(0);} // | 10 -- 12 | | 3 - 1 | - else if (i == 0 && j == 2){ shadow = textures.getNoTexture();} // | 20 21 22 | | 7 2 6 | - else if (i == 1 && j == 0){ shadow = textures.getShadow(3);} - else if (i == 1 && j == 2){ shadow = textures.getNoTexture();} - else if (i == 2 && j == 0){ shadow = textures.getShadow(7);} - else if (i == 2 && j == 1){ shadow = textures.getNoTexture();} //<>// - else if (i == 2 && j == 2){ shadow = textures.getNoTexture();} - else { shadow = textures.getNoTexture();} - + boolean angle = false; + + // | 00 01 02 | | 4 0 5 | + // | 10 -- 12 | | 3 - 1 | + // | 20 21 22 | | 7 2 6 | + + if (i == 0 && j == 0) { + shadow = textures.getShadow(4); + angle = true; + } else if (i == 0 && j == 1) { + shadow = textures.getShadow(0); + } else if (i == 0 && j == 2) { + shadow = textures.getShadow(5); + angle = true; + } else if (i == 1 && j == 0) { + shadow = textures.getShadow(3); + } else if (i == 1 && j == 2) { + shadow = textures.getShadow(1); + } else if (i == 2 && j == 0) { + shadow = textures.getShadow(7); + angle = true; + } else if (i == 2 && j == 1) { + shadow = textures.getShadow(2); + } else if (i == 2 && j == 2) { + shadow = textures.getShadow(6); + angle = true; + } else { + shadow = textures.getNoTexture(); + } + + if (angle) { + if (j == 0 && i == 0 + && (chunks[i][j].getHight() < chunks[0][1].getHight() + || chunks[i][j].getHight() < chunks[1][0].getHight())) continue; + else if (j == 2 && i == 0 + && (chunks[i][j].getHight() < chunks[0][1].getHight() + || chunks[i][j].getHight() < chunks[1][2].getHight())) continue; + else if (j == 0 && i == 2 + && (chunks[i][j].getHight() < chunks[1][0].getHight() + || chunks[i][j].getHight() < chunks[2][1].getHight())) continue; + else if (j == 2 && i == 2 + && (chunks[i][j].getHight() < chunks[2][1].getHight() + || chunks[i][j].getHight() < chunks[1][2].getHight())) continue; + } + beginShape(); - if (mouseX > x * settings.chunkSize && mouseX < (x + 1) * settings.chunkSize - && mouseY > y * settings.chunkSize && mouseY < (y + 1) * settings.chunkSize - && settings.SHADOW_DEBUG) - { - fill(100, 50, 150); - } else { - texture(shadow); - } - vertex((j - 1 + x) * settings.chunkSize, (i - 1 + y) * settings.chunkSize, 0, 0); //<>// - vertex((j + x) * settings.chunkSize, (i - 1 + y) * settings.chunkSize, settings.chunkSize, 0); //<>// - vertex((j + x) * settings.chunkSize, (i + y) * settings.chunkSize, settings.chunkSize, settings.chunkSize); //<>// - vertex((j - 1 + x)* settings.chunkSize, (i + y) * settings.chunkSize, 0, settings.chunkSize); //<>// + if (mouseX > x * settings.chunkSize && mouseX < (x + 1) * settings.chunkSize + && mouseY > y * settings.chunkSize && mouseY < (y + 1) * settings.chunkSize + && settings.SHADOW_DEBUG) + { + fill(100, 50, 150); + } else { + texture(shadow); + } + vertex((j - 1 + x) * settings.chunkSize, (i - 1 + y) * settings.chunkSize, 0, 0); + vertex((j + x) * settings.chunkSize, (i - 1 + y) * settings.chunkSize, settings.chunkSize, 0); + vertex((j + x) * settings.chunkSize, (i + y) * settings.chunkSize, settings.chunkSize, settings.chunkSize); + vertex((j - 1 + x)* settings.chunkSize, (i + y) * settings.chunkSize, 0, settings.chunkSize); endShape(); } } diff --git a/Settings.pde b/Settings.pde index 10756d0..bfad856 100644 --- a/Settings.pde +++ b/Settings.pde @@ -2,9 +2,13 @@ class Settings { public final int chunkSize = 32; public final int maxHight = new Textures().lengthTextures(); + // Camera public final float cameraSpeed = 0.1; public final int cameraSprintCoefficient = 2; + // Render + public final boolean renderShadows = true; + // Seed range public final long seedRange = 100; diff --git a/minecraft2D.pde b/minecraft2D.pde index 24d3c42..1d8cc77 100644 --- a/minecraft2D.pde +++ b/minecraft2D.pde @@ -4,6 +4,7 @@ Settings settings; void settings() { size(800, 800, P2D); + PJOGL.setIcon("textures/icon.png"); noSmooth(); } @@ -11,6 +12,7 @@ void setup() { settings = new Settings(); world = new World((long)random(settings.seedRange), 0.1); cam = new Camera(0, 0, world); + surface.setTitle("Minecraft 2D"); noStroke(); } diff --git a/readme.md b/readme.md index 9f09994..aa89dba 100644 --- a/readme.md +++ b/readme.md @@ -5,15 +5,6 @@ В планах сделать - [x] Генерируемый в реальном времени мир. - [ ] Добавить возможность сохранять миры. -- [ ] Сделать систему логирования. +- [x] Сделать систему ~~логирования~~ дебаг. - [x] Возможность управления камерой стрелочками. - -Осталось доделать класс камеры, дальше только надеяться на рабочий прототип. - -Работа программы: (старое) -graph - -07.05: Ура, готов рабочий прототип. Осталось только допелить управление. В будущем будет проблема с плавной камерой, но её наверное можно будет решить с помощью translate(). -Баг, связанный с ArrayList<>. Вызывается исключение. Лечение: нужно заполнять невидимую область null или перейти на HashMap. Правда, волнует вопрос с производительностью, что быстрее ArrayList или HashMap? - -Ура, всё работает. Бага больше нет. Камера двигается плавно. +- [ ] Персонажа diff --git a/textures/icon.png b/textures/icon.png new file mode 100644 index 0000000..e22ac24 Binary files /dev/null and b/textures/icon.png differ