From 8d81cf496cef04c53ff44bbe8b41b959e1f3e531 Mon Sep 17 00:00:00 2001 From: Ivan Zinchenko Date: Wed, 12 May 2021 16:26:05 +0500 Subject: [PATCH] =?UTF-8?q?=D0=9F=D0=BE=D0=BF=D1=8B=D1=82=D0=BA=D0=B0=20?= =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D1=82=D1=8C=20=D1=82=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Camera.pde | 6 ++++ Controller.pde | 18 ++++++------ DEBUG.pde | 7 +++-- Render.pde | 45 +++++++++++++++++++++++++++++- Settings.pde | 6 +++- Textures.pde | 13 +++++++++ World.pde | 7 +++-- minecraft2D.pde | 3 +- textures/shadows/shadowAngleD.png | Bin 0 -> 2601 bytes textures/shadows/shadowAngleL.png | Bin 0 -> 2605 bytes textures/shadows/shadowAngleR.png | Bin 0 -> 2604 bytes textures/shadows/shadowAngleU.png | Bin 0 -> 2382 bytes textures/shadows/shadowD.png | Bin 0 -> 2579 bytes textures/shadows/shadowL.png | Bin 0 -> 2567 bytes textures/shadows/shadowR.png | Bin 0 -> 2571 bytes textures/shadows/shadowU.png | Bin 0 -> 2365 bytes 16 files changed, 88 insertions(+), 17 deletions(-) create mode 100644 textures/shadows/shadowAngleD.png create mode 100644 textures/shadows/shadowAngleL.png create mode 100644 textures/shadows/shadowAngleR.png create mode 100644 textures/shadows/shadowAngleU.png create mode 100644 textures/shadows/shadowD.png create mode 100644 textures/shadows/shadowL.png create mode 100644 textures/shadows/shadowR.png create mode 100644 textures/shadows/shadowU.png diff --git a/Camera.pde b/Camera.pde index 51aa70e..7d9ff0c 100644 --- a/Camera.pde +++ b/Camera.pde @@ -32,8 +32,14 @@ class Camera { 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); } } pop(); } + + public void showChunk(int x, int y) { + render.renderChunk(x, y); + render.renderShadow(x, y); + } } diff --git a/Controller.pde b/Controller.pde index 7c8f8ad..9de1ca7 100644 --- a/Controller.pde +++ b/Controller.pde @@ -2,22 +2,22 @@ Boolean up = false, down = false, left = false, right = false, shift = false; void keyPressed() { if (key == 'r') { - world = new World((long)random(settings.randomRange), 0.1); + world = new World((long)random(settings.seedRange), 0.1); cam = new Camera(0, 0, world); } - if (key == 'w' || key == 'W') up = true; - if (key == 'a' || key == 'A') left = true; - if (key == 's' || key == 'S') down = true; - if (key == 'd' || key == 'D') right = true; + if (key == 'w' || key == 'W' || key == 'ц' || key == 'Ц') up = true; + if (key == 'a' || key == 'A' || key == 'ф' || key == 'Ф') left = true; + if (key == 's' || key == 'S' || key == 'ы' || key == 'Ы') down = true; + if (key == 'd' || key == 'D' || key == 'в' || key == 'В') right = true; if (keyCode == SHIFT) shift = true; } void keyReleased() { - if (key == 'w' || key == 'W') up = false; - if (key == 'a' || key == 'A') left = false; - if (key == 's' || key == 'S') down = false; - if (key == 'd' || key == 'D') right = false; + if (key == 'w' || key == 'W' || key == 'ц' || key == 'Ц') up = false; + if (key == 'a' || key == 'A' || key == 'ф' || key == 'Ф') left = false; + if (key == 's' || key == 'S' || key == 'ы' || key == 'Ы') down = false; + if (key == 'd' || key == 'D' || key == 'в' || key == 'В') right = false; if (keyCode == SHIFT) shift = false; } diff --git a/DEBUG.pde b/DEBUG.pde index efc9352..4878fad 100644 --- a/DEBUG.pde +++ b/DEBUG.pde @@ -10,10 +10,11 @@ void MAIN_DEBUG() { } } -void CHUNK_DEBUG(int x, int y) { +void CHUNK_DEBUG(Chunk chunk) { if (settings.CHUNK_DEBUG) { fill(200, 0, 30); - text(x, x * settings.chunkSize, y * settings.chunkSize + 10); - text(y, x * settings.chunkSize, y * settings.chunkSize + 20); + text(chunk.getX(), chunk.getX() * settings.chunkSize, chunk.getY() * settings.chunkSize + 10); + text(chunk.getY(), chunk.getX() * settings.chunkSize, chunk.getY() * settings.chunkSize + 20); + text(chunk.getHight(), chunk.getX() * settings.chunkSize, chunk.getY() * settings.chunkSize + 30); } } diff --git a/Render.pde b/Render.pde index 1371de4..a1bb7a4 100644 --- a/Render.pde +++ b/Render.pde @@ -18,6 +18,49 @@ class Render { vertex(x * settings.chunkSize, (1 + y) * settings.chunkSize, 0, settings.chunkSize); endShape(); - CHUNK_DEBUG(x, y); + CHUNK_DEBUG(chunk); + } + + public void renderShadow(int x, int y) { + 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 < 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();} + + 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); //<>// + endShape(); + } + } + } } } diff --git a/Settings.pde b/Settings.pde index 6fb9133..10756d0 100644 --- a/Settings.pde +++ b/Settings.pde @@ -1,11 +1,15 @@ class Settings { public final int chunkSize = 32; public final int maxHight = new Textures().lengthTextures(); + public final float cameraSpeed = 0.1; public final int cameraSprintCoefficient = 2; - public final long randomRange = 100; + + // Seed range + public final long seedRange = 100; // DEBUG public final boolean MAIN_DEBUG = false; public final boolean CHUNK_DEBUG = false; + public final boolean SHADOW_DEBUG = false; } diff --git a/Textures.pde b/Textures.pde index ec6fd3e..7587e14 100644 --- a/Textures.pde +++ b/Textures.pde @@ -1,5 +1,6 @@ class Textures { private PImage[] textures; + private PImage[] shadows; private PImage noTexture; Textures() { @@ -11,11 +12,23 @@ class Textures { loadImage("textures/snow.png") }; + this.shadows = new PImage[] { + loadImage("textures/shadows/shadowU.png"), + loadImage("textures/shadows/shadowR.png"), + loadImage("textures/shadows/shadowD.png"), + loadImage("textures/shadows/shadowL.png"), + loadImage("textures/shadows/shadowAngleU.png"), + loadImage("textures/shadows/shadowAngleR.png"), + loadImage("textures/shadows/shadowAngleD.png"), + loadImage("textures/shadows/shadowAngleL.png") + }; + noTexture = loadImage("textures/noTexture.png"); } public PImage getTexture(int i) { return textures[i]; } public PImage getNoTexture() { return noTexture; } + public PImage getShadow(int i) { return shadows[i]; } public int lengthTextures() { return textures.length; }; } diff --git a/World.pde b/World.pde index 783978b..ade734b 100644 --- a/World.pde +++ b/World.pde @@ -18,15 +18,18 @@ class World { chunks.get(x).add(i, null); } } - chunks.get(x).add(y, chunk); //<>// + chunks.get(x).add(y, chunk); } } public Chunk getChunk(int x, int y) { + if (x < 0 || y < 0) { + return null; + } try { chunks.get(x).get(y); } - catch(IndexOutOfBoundsException e) { //<>// + catch(IndexOutOfBoundsException e) { Chunk newChunk = gen.generateChunk(x, y); setChunk(newChunk, x, y); } diff --git a/minecraft2D.pde b/minecraft2D.pde index b3d5900..24d3c42 100644 --- a/minecraft2D.pde +++ b/minecraft2D.pde @@ -4,11 +4,12 @@ Settings settings; void settings() { size(800, 800, P2D); + noSmooth(); } void setup() { settings = new Settings(); - world = new World((long)random(settings.randomRange), 0.1); + world = new World((long)random(settings.seedRange), 0.1); cam = new Camera(0, 0, world); noStroke(); } diff --git a/textures/shadows/shadowAngleD.png b/textures/shadows/shadowAngleD.png new file mode 100644 index 0000000000000000000000000000000000000000..d30a5c7e45d3e47016369129e9698168815166f0 GIT binary patch literal 2601 zcmcImYitx%6rR!or93P`1bKvUK!M2Y+?k!(dB6hgw$Mekw6H*n2)#3NrybedS!Sl~ zQo$DGsRRT=gcyRvNK#RL2?&h=q96!Cd4)hEAb(6W&?xXjQSi?0wmbwRByM(Q@7y`} zJKs6yJNNGDit@?53kDSs1kpQORx%y`lHQfy4d0!nrW*v2BbuR5MUif)h@3vTm>k8* zvNW0?My=ntZvT|8EBde8Ke+VJwpsaCE+aO8ToZov9kOaiXv62>&_?yy#LnhF z3)d!w&i!#omyweX7X8*^aqgkkw?oT%b$$2JjV+htAt!P^R?lr&QMuxJ)sBYK>v#Tq z?EC;@Q8+_3Faa);Nn4Ms1lD)?dlsn%|6 z-tmvNzFzoDOKbTBp>W#7)(>tCt|+kY5L3RpxwvqC%Xud_Y>j-Nmpwmc>d@B~w9MJi z=S+2b^w_7U`qZ_TibkyKzIp8l|K4FMS5N78_GIONBkj30?68zW=NGZSwg(?XW4Tw~5I;IX(B3?w+&!_vgm-X(kRF zp7!_k8554+O!i2YRXYSRoDDv*JGJ<=2;rC$Tj_jGK^3 zLTv$ZNfp(ai6GV9wx1$RJxI+KA|R3sp*pjy$wo7p%A;D-0!`Mb3FFCeDFp+>kqgOG zJeF{jRFF#JDtPQoGZdLNaTf%sOhKz66=cY=5gG6SS_6P1McKy&cwUmmkR0Fu14M=e zG{-3*pa_04`=PKmTQ`*HC6ltg@KcbgbKRuEFpZ6kzDB>#vTGSE7MTGY!*MjWpq)ht z7pCZhGrR+#1UZ^*CSB7?kRBpbt$H^|VWyc7;>k|fgp*AZP8gGdNrv?SFQg8`NaXRR z@pz}TOk%$sbI4(?R zC|nYxFe#sD>WaY0f({KH3rOQ=p5;YaVv#`uUJ^OK3|U~HG%viq#M0`$OnB=vvehjO zV{~Ry0h}NiqA1b<9>_F{c!P$#%+Uc&WMwr# zbHEU3pz|^ffx*!dM&JVy9 zVcBtrb!Nt4Eni&Q7x`WM|6)AA@eBm4s3Wlbwl8IK}I|cSRT@%cY^@~ z&;dh|3@8F9`Eg1AN9tK@tqvw?5#C@K>gj`dGPOSI*-%_xj{P<(eq z-q9#UxP?7wI@y{Q!`ja3j(>Px@{%Trf@;v3z!@~}=QUb}0v>Uy$^*eL1YI4MW)U<0 z3rj|ZBuJb{BQ*eNKg&xrgt#}6$|2n0vR_8hlVTxGge=w#WipJ14dP1FaQ7m literal 0 HcmV?d00001 diff --git a/textures/shadows/shadowAngleL.png b/textures/shadows/shadowAngleL.png new file mode 100644 index 0000000000000000000000000000000000000000..98d5aee75672f01c6accd862977e59ffe06142db GIT binary patch literal 2605 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 literal 0 HcmV?d00001 diff --git a/textures/shadows/shadowR.png b/textures/shadows/shadowR.png new file mode 100644 index 0000000000000000000000000000000000000000..91d5f20d5d34c896f8cffbc7f668907d67d0d5c0 GIT binary patch literal 2571 zcmcIm32YQq7@ks&q&CHv2=4!L~LeZZb1(-u&Sd1Xz6ctycdd@dsh zu6Y0h{bbMx~_7^Znm(w?-Zxc3Uy6~GhfO)-F>#>A?ATE z-`KMzYhr6h$v1pf>5`7uZcZ=D)NfJ6TJ7gn9UI@|l$*3rARoU$Lx-LSEE(z!F`*(Z9_LriYinR9T({`U^uXu0Ki_(C6y z?kUJvve1)VGQ-hUeWnh_G(jqos<=562i6LtY%Uj$S15zzC zaS>LlQ4i7E)lJ~4>>*b20Xh)#!5X!&S%=G;OM+5!tt80A;zf8~qZAaA;?xGVfmCVind4^d;9F*ijuG&I;6>^4oWrjS?!ie@R6C6NVbG(}C& zNJfoWDFi<>BwdY}susm9L?CK)riVaG6Cp%m{jgCZnI@Dlsu9E}#ztEqr3?ds;Y}lv zervSR1Q5H#t zVQ9Ncl0_twROtT;^<-M58W639XoIDQ`wwPhY9FEw_x9iY)M4;oC~IF$D2%#Se0M~i zY7{SOVN04uvZhNxb$@ji4c?cWOL94RQ6VLsRY=axNu&UHG-5>&HLRlWvX~cV5mx^T z3w5%KcdBfkq*#!30)|C<4s^<_wO;^IkXSp?nqA}+ z#R+7GV*pm1VIo{=_`Jj|2b^3esQ45*4y|GTIgDQVPjVPV>eA6U{qYaGa?lz7T#?@! ztZe)Bj5o6t&uaUw<)a1lx9vf{|CPvO|640cHeFuto!a(iS^DhIXh$eb2?Y+NyQIz8 zyID*spLt_c=urE4tn>V*RObTxI1G(FJ?*FV6IAHj&+St#e~^K$IM0y`|V6m)3kZQJUW)&bR(+6y=xr_bm;*@DH6rRzCm$ literal 0 HcmV?d00001 diff --git a/textures/shadows/shadowU.png b/textures/shadows/shadowU.png new file mode 100644 index 0000000000000000000000000000000000000000..9def8611989a15d829e0e5903cc156cc074cc7a8 GIT binary patch literal 2365 zcmcIlYitx%7@blmrShncSfJDnQ^O-NJCB{&on2V^*sXoYmQq$|K|}A%+-b+|&MY(2 zcH3aO(aJ*!1Qf*>L_##FD8?T`n#L4R9*QD@*g!OZA;D;*Xh9Pi(L3GUQVrDpag&|7 zGxOc^o$q|--n*%~s%%Qu%q$GUrc{&%YS10G|Ct%+YPPrEz_2v8>i1U{%en~hnz9mn z9^>%{^D%7RwjEo0D?h1zXhUyq>CrtaGJm)fox7|$eD3h(iq$XTwfp?r->>lR5FgO? zcihU}qUAmH-LvE7mK`qsb<(=@qg~JYJ10+g>EexD7d^91rR^2_cCBBwexP<=%h_%F zubw=gqwE|PuiE)`%f4nTd+yp#r(f*PjQ0h5u5rf(JJ|epD$@(dUoXo!(Vt$=tw|)2b z4M1&oS!U4!Urt?dY>%Vk$>|GU{#iU8oiVi^w1?y#cl2P|eFsYqta{TT~c} z0;vgFxCk3m%}4b2^b)u#`-qi%kPb%uuu&~K-}e^Nr|Re-0g8NE{+p~1vpEyG)229 zh9+6oOS`ZPdG)>cQW)1ey;6f%p4qFIV%Nfbev zZJGsQq-GYR5CYJY3^i)0x`x|`K-8NpAAy)AN{B>U4hL|TNF|?(A1j^36{1%%_>MGi#F<(ZZ_)o;5PjE9}Hz_IAOHe z2oK34OB4*l2*Nf|EHlI}>h&8CSh^9?^>C_D)v1g)%Q|R$-bz)I^;UDf%_unm27m>9 z1nL??(mct~A;#mSY1FvKXdVp`p+V#W8CYO!!Mdy}ZDR=y2E7%UX#q`w6#*ZCNI6th z_KJcCL`kGcp5r|vpgBm2qAZdO!_ZDal10(Y4Dmwq1G>~~D`C%1*jCmhgfXn97q}%S z1KbJ;JhDV`G{=)3x8f!hm&6M^FVmt+NTDq?RJ3wHcqFRLN=Aq*U}UGn(>u5P#n;eBze8`+$AlYleM@Y6ApiCrRt9Ma(Z1p5y zTN@z)9mOPxFjH5oR$##52Go&Mb@wzObuaQJXc?XQ*bMSNQcub%H3F>xq79ZJ>|!W; zD@rtl`ggzX_#)-4V&rss0Ay?^vQQKxkJAH%v0_2i4Hymum#pkWPtmsnK;AiX5@or$k04h&>!Wy3oV$;RiL;5Ca`;1qXiL zfR4rXia>Fw_Jv>iKFo^KlRGc>@&xhIU|}RLJbUAoV4mZNV}nA;o~~DpocPRtc0zU$ zmNq_dxil?)C0iYTDBi}^cU^wubo#)pbhduNoSc~#I@1>Zk$2_C>ls3K?)7+Pxf>)W3Or%$2XQ