From c09502ad3a755bd74b951b90ceef895aa715bb5e Mon Sep 17 00:00:00 2001 From: Mario Date: Mon, 17 Aug 2026 12:41:21 +0200 Subject: [PATCH] =?UTF-8?q?Men=C3=BC=20Buttons=20angepasst,=20Screenshot?= =?UTF-8?q?=20Funktion=20optimiert?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/resources/Textures/menu/button.png | Bin 6943 -> 3225 bytes .../audio/static/screenshot_click.ogg | Bin 0 -> 5281 bytes .../main/java/de/blight/editor/EditorApp.java | 30 +++++ .../main/java/de/blight/game/BlightGame.java | 13 ++- .../java/de/blight/game/config/NinePatch.java | 103 +++++++++++++++--- .../src/main/map/chunks/voxel_17_0_08.blvc | Bin 2873 -> 2132 bytes .../src/main/map/chunks/voxel_17_0_09.blvc | Bin 2171 -> 2132 bytes .../src/main/map/chunks/voxel_17_m1_08.blvc | Bin 3421 -> 2409 bytes .../src/main/map/chunks/voxel_17_m1_09.blvc | Bin 2271 -> 2134 bytes 9 files changed, 131 insertions(+), 15 deletions(-) create mode 100644 blight-assets/src/main/resources/audio/static/screenshot_click.ogg diff --git a/blight-assets/src/main/resources/Textures/menu/button.png b/blight-assets/src/main/resources/Textures/menu/button.png index 7e70211a2b26e81125ab6c641bf538d3bafb03dc..0d734678f1500c878487118b98707271f4768d50 100644 GIT binary patch delta 2840 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 literal 6943 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 QdoIY_*v6>Bz$fm10HLoT9smFU diff --git a/blight-assets/src/main/resources/audio/static/screenshot_click.ogg b/blight-assets/src/main/resources/audio/static/screenshot_click.ogg new file mode 100644 index 0000000000000000000000000000000000000000..355ffddeb12c9b0f01441097cc28c53eb453d079 GIT binary patch literal 5281 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 literal 0 HcmV?d00001 diff --git a/blight-editor/src/main/java/de/blight/editor/EditorApp.java b/blight-editor/src/main/java/de/blight/editor/EditorApp.java index 937a4b1..6147594 100644 --- a/blight-editor/src/main/java/de/blight/editor/EditorApp.java +++ b/blight-editor/src/main/java/de/blight/editor/EditorApp.java @@ -1477,6 +1477,7 @@ public class EditorApp extends Application { saveItem.setAccelerator(javafx.scene.input.KeyCombination.keyCombination("Ctrl+S")); saveItem.setOnAction(e -> { input.saveRequested = true; setStatus("Speichern…"); }); MenuItem screenshotItem = new MenuItem("Screenshot"); + screenshotItem.setAccelerator(javafx.scene.input.KeyCombination.keyCombination("Ctrl+F12")); screenshotItem.setOnAction(e -> takeEditorScreenshot()); MenuItem settingsItem = new MenuItem("Einstellungen…"); settingsItem.setOnAction(e -> openSettings()); @@ -6442,6 +6443,7 @@ public class EditorApp extends Application { } private void takeEditorScreenshot() { + playScreenshotClick(); WritableImage image = primaryStage.getScene().snapshot(null); String timestamp = java.time.LocalDateTime.now() .format(java.time.format.DateTimeFormatter.ofPattern("yyyy-MM-dd_HH-mm-ss")); @@ -6456,6 +6458,34 @@ public class EditorApp extends Application { } } + private void playScreenshotClick() { + Thread t = new Thread(() -> { + try { + int sr = 44100; + int frames = (int) (sr * 0.08); + byte[] buf = new byte[frames * 2]; + java.util.Random rng = new java.util.Random(); + for (int i = 0; i < frames; i++) { + double env = Math.exp(-i / (sr * 0.012)); + double s = (rng.nextGaussian() * 0.55 + Math.sin(2 * Math.PI * 3200.0 * i / sr) * 0.45) * env * 0.85; + short val = (short) Math.max(-32767, Math.min(32767, s * 32767)); + buf[i * 2] = (byte) (val & 0xff); + buf[i * 2 + 1] = (byte) ((val >> 8) & 0xff); + } + javax.sound.sampled.AudioFormat fmt = new javax.sound.sampled.AudioFormat(sr, 16, 1, true, false); + javax.sound.sampled.DataLine.Info info = new javax.sound.sampled.DataLine.Info(javax.sound.sampled.SourceDataLine.class, fmt); + javax.sound.sampled.SourceDataLine line = (javax.sound.sampled.SourceDataLine) javax.sound.sampled.AudioSystem.getLine(info); + line.open(fmt); + line.start(); + line.write(buf, 0, buf.length); + line.drain(); + line.close(); + } catch (Exception ignored) {} + }, "screenshot-click"); + t.setDaemon(true); + t.start(); + } + private void handleTextureImport(javafx.stage.Window owner) { FileChooser fc = new FileChooser(); fc.setTitle("Texturen importieren (nicht-PNG wird automatisch konvertiert)"); diff --git a/blight-game/src/main/java/de/blight/game/BlightGame.java b/blight-game/src/main/java/de/blight/game/BlightGame.java index b6da3e9..b050767 100644 --- a/blight-game/src/main/java/de/blight/game/BlightGame.java +++ b/blight-game/src/main/java/de/blight/game/BlightGame.java @@ -50,6 +50,7 @@ public class BlightGame extends SimpleApplication { private AudioSettings audioSettings; private ScreenshotAppState screenshotState; private Path screenshotDir; + private com.jme3.audio.AudioNode screenshotClickSound; private WorldScene worldScene; private ConfigScreen configScreen; private GraphicsScreen graphicsScreen; @@ -380,8 +381,12 @@ public class BlightGame extends SimpleApplication { try { screenshotDir = BlightHome.resolve("screenshots"); Files.createDirectories(screenshotDir); - screenshotState = new ScreenshotAppState(screenshotDir + File.separator, "screenshot"); + screenshotState = new ScreenshotAppState("", "screenshot"); stateManager.attach(screenshotState); + screenshotClickSound = new com.jme3.audio.AudioNode(assetManager, "audio/static/screenshot_click.ogg", com.jme3.audio.AudioData.DataType.Buffer); + screenshotClickSound.setPositional(false); + screenshotClickSound.setLooping(false); + screenshotClickSound.setVolume(1f); log.info("Screenshots werden gespeichert in: {}", screenshotDir.toAbsolutePath()); } catch (IOException e) { log.warn("Screenshot-Verzeichnis konnte nicht angelegt werden", e); @@ -389,8 +394,12 @@ public class BlightGame extends SimpleApplication { inputManager.addMapping("Screenshot", new KeyTrigger(KeyInput.KEY_F12)); inputManager.addListener((ActionListener) (name, isPressed, tpf) -> { if (isPressed && screenshotState != null) { - log.info("[Screenshot] Speichere in: {}", screenshotDir.toAbsolutePath()); + String ts = java.time.LocalDateTime.now() + .format(java.time.format.DateTimeFormatter.ofPattern("yyyy-MM-dd_HH-mm-ss")); + screenshotState.setFileName(screenshotDir + java.io.File.separator + "blight_" + ts + "_"); + log.info("[Screenshot] Speichere: blight_{}.png", ts); screenshotState.takeScreenshot(); + if (screenshotClickSound != null) screenshotClickSound.playInstance(); } }, "Screenshot"); diff --git a/blight-game/src/main/java/de/blight/game/config/NinePatch.java b/blight-game/src/main/java/de/blight/game/config/NinePatch.java index 5beb6d9..a55ce17 100644 --- a/blight-game/src/main/java/de/blight/game/config/NinePatch.java +++ b/blight-game/src/main/java/de/blight/game/config/NinePatch.java @@ -16,6 +16,8 @@ import com.jme3.texture.image.ColorSpace; import javax.imageio.ImageIO; import java.awt.image.BufferedImage; +import java.awt.image.ConvolveOp; +import java.awt.image.Kernel; import java.io.IOException; import java.io.InputStream; import java.nio.ByteBuffer; @@ -127,6 +129,8 @@ public class NinePatch { // Guide-Pixel durch Rahmen-Nachbarfarbe ersetzen stripGuides(img, w, h, l - 1, w - r, t - 1, h - b); + img = gaussianBlur(img, 0.0f); + Texture2D tex = toJmeTexture(img, w, h); return new NinePatch(assets, tex, w, h, l, r, t, b); } @@ -219,6 +223,26 @@ public class NinePatch { return 0; // Fallback: transparent } + /** + * Weicher Gauss-Blur (3×3-Kernel) auf das Bild – glättet Übergänge an Patch-Grenzen. + * sigma=0 deaktiviert den Blur. + */ + private static BufferedImage gaussianBlur(BufferedImage img, float sigma) { + if (sigma <= 0f) { return img; } + float s2 = 2f * sigma * sigma; + float[] data = { + (float) Math.exp(-2 / s2), (float) Math.exp(-1 / s2), (float) Math.exp(-2 / s2), + (float) Math.exp(-1 / s2), 1f, (float) Math.exp(-1 / s2), + (float) Math.exp(-2 / s2), (float) Math.exp(-1 / s2), (float) Math.exp(-2 / s2) + }; + float sum = 0; for (float v : data) sum += v; + for (int i = 0; i < data.length; i++) data[i] /= sum; + ConvolveOp op = new ConvolveOp(new Kernel(3, 3, data), ConvolveOp.EDGE_NO_OP, null); + BufferedImage out = new BufferedImage(img.getWidth(), img.getHeight(), img.getType()); + op.filter(img, out); + return out; + } + /** * Konvertiert ein BufferedImage in eine JME3-Textur. * Zeilen werden von unten nach oben gelesen (entspricht JME3-Y-Flip beim PNG-Laden). @@ -266,7 +290,7 @@ public class NinePatch { */ public Node build(float x, float y, float w, float h, float z) { tex.setWrap(Texture.WrapMode.EdgeClamp); - tex.setMagFilter(Texture.MagFilter.Nearest); + tex.setMagFilter(Texture.MagFilter.Bilinear); Material mat = new Material(assets, "Common/MatDefs/Misc/Unshaded.j3md"); mat.setTexture("ColorMap", tex); @@ -282,22 +306,75 @@ public class NinePatch { float sx1 = x + l, sx2 = x + w - r; float sy1 = y + b, sy2 = y + h - t; + // Kachelgröße des Mittelbereichs in Bildschirmpixeln + float cw = (u2 - u1) * texW; + float ch = (v2 - v1) * texH; + Node n = new Node("ninepatch"); - // Reihe unten - n.attachChild(q(mat, x, y, l, b, 0, 0, u1, v1, z)); - n.attachChild(q(mat, sx1, y, sx2-sx1, b, u1, 0, u2, v1, z)); - n.attachChild(q(mat, sx2, y, r, b, u2, 0, 1, v1, z)); - // Reihe mitte - n.attachChild(q(mat, x, sy1, l, sy2-sy1, 0, v1, u1, v2, z)); - n.attachChild(q(mat, sx1, sy1, sx2-sx1, sy2-sy1, u1, v1, u2, v2, z)); - n.attachChild(q(mat, sx2, sy1, r, sy2-sy1, u2, v1, 1, v2, z)); - // Reihe oben - n.attachChild(q(mat, x, sy2, l, t, 0, v2, u1, 1, z)); - n.attachChild(q(mat, sx1, sy2, sx2-sx1, t, u1, v2, u2, 1, z)); - n.attachChild(q(mat, sx2, sy2, r, t, u2, v2, 1, 1, z)); + // Reihe unten – Ecken fix, untere Kante Mirror-X + n.attachChild(q(mat, x, y, l, b, 0, 0, u1, v1, z)); + tileHEdge(n, mat, sx1, y, sx2, b, u1, u2, 0, v1, cw, texW, z); + n.attachChild(q(mat, sx2, y, r, b, u2, 0, 1, v1, z)); + // Reihe mitte – Seiten Mirror-Y, Mitte Mirror-X+Y + tileVEdge(n, mat, x, sy1, l, sy2, 0, u1, v1, v2, ch, texH, z); + tileCenterQuads(n, mat, sx1, sy1, sx2, sy2, u1, v1, u2, v2, cw, ch, texW, texH, z); + tileVEdge(n, mat, sx2, sy1, r, sy2, u2, 1f, v1, v2, ch, texH, z); + // Reihe oben – Ecken fix, obere Kante Mirror-X + n.attachChild(q(mat, x, sy2, l, t, 0, v2, u1, 1f, z)); + tileHEdge(n, mat, sx1, sy2, sx2, t, u1, u2, v2, 1f, cw, texW, z); + n.attachChild(q(mat, sx2, sy2, r, t, u2, v2, 1f, 1f, z)); return n; } + /** Mitte: Mirror-Repeat in X und Y. */ + private static void tileCenterQuads(Node n, Material mat, + float sx1, float sy1, float sx2, float sy2, + float u1, float v1, float u2, float v2, + float cw, float ch, + float texW, float texH, float z) { + int iz = 0; + for (float py = sy1; py < sy2; py += ch, iz++) { + float th = Math.min(ch, sy2 - py); + float vA = (iz & 1) == 0 ? v1 : v2; + float vB = (iz & 1) == 0 ? v1+th/texH : v2-th/texH; + int ix = 0; + for (float px = sx1; px < sx2; px += cw, ix++) { + float tw = Math.min(cw, sx2 - px); + float uA = (ix & 1) == 0 ? u1 : u2; + float uB = (ix & 1) == 0 ? u1+tw/texW : u2-tw/texW; + n.attachChild(q(mat, px, py, tw, th, uA, vA, uB, vB, z)); + } + } + } + + /** Horizontaler Randstreifen (oben/unten): Mirror-Repeat nur in X. */ + private static void tileHEdge(Node n, Material mat, + float sx1, float py, float sx2, float ph, + float u1, float u2, float vMin, float vMax, + float cw, float texW, float z) { + int ix = 0; + for (float px = sx1; px < sx2; px += cw, ix++) { + float tw = Math.min(cw, sx2 - px); + float uA = (ix & 1) == 0 ? u1 : u2; + float uB = (ix & 1) == 0 ? u1+tw/texW : u2-tw/texW; + n.attachChild(q(mat, px, py, tw, ph, uA, vMin, uB, vMax, z)); + } + } + + /** Vertikaler Randstreifen (links/rechts): Mirror-Repeat nur in Y. */ + private static void tileVEdge(Node n, Material mat, + float px, float sy1, float pw, float sy2, + float uMin, float uMax, float v1, float v2, + float ch, float texH, float z) { + int iz = 0; + for (float py = sy1; py < sy2; py += ch, iz++) { + float th = Math.min(ch, sy2 - py); + float vA = (iz & 1) == 0 ? v1 : v2; + float vB = (iz & 1) == 0 ? v1+th/texH : v2-th/texH; + n.attachChild(q(mat, px, py, pw, th, uMin, vA, uMax, vB, z)); + } + } + private static Geometry q(Material mat, float x, float y, float w, float h, float uMin, float vMin, float uMax, float vMax, diff --git a/blight-map/src/main/map/chunks/voxel_17_0_08.blvc b/blight-map/src/main/map/chunks/voxel_17_0_08.blvc index 0972d31c67b3a26e4a00701fcfa2a1b28d3de01b..bc3378398b4d1e5ca737af276b48f494405a728a 100644 GIT binary patch delta 68 zcmdlfc11u-zMF#q4F118ypfkdfPv+}^~|*{tIhf^dh#sX>Ami}>7*&UpRP=0-u#f+ Xhkfz~=F8lFrZHciw0-XMg9;1)ep?*g literal 2873 zcmb2|=3oGW|8MW??GrYXaJZP`ep=hn`|N9rem)KtH4W#DT>I4Q+?||E?%)0C*&zA* z^7Qrd^{1b{{XJe@-@dkDHxtBwKX)b0UMc(?8(@%^%>ViM(jG&(zYjk19edo+9%#&* z7RRS<|K`YQ!<}Ck|Mk8R&i%73{eVQ~fgRiL{;}s~$&uLb+cto`$6~>}`|}(B$VDhT zn8hCR`lmLl$!FFzA`{|UDjkgD8yFbv*giG9wqjhz$QanLJ7Hl%MxA`Yw-@E#{?z&( zv@$=qZTW++39Ns*Jf1T{TxBznS0JaM;Q#W}23`S%ius>}OP_D&IzIRBv+s;Q58eL5 zafR{YpN-ef&zEPARyf1I;(a44)2H(fmrjd$#(1`dQJeLNc%s~eGvW#k4gHNa3*tXS z$TwB(Yp^>IyCJ~AWIz7~Mkm<~=X@WCJYoD=v)%z>DZ~Hmw~Nm|<9zY(WVTSjw>RaD zvJ$r%I;D%g_}_p1lVMLw{QVWP_gyyYW4ZGAb3;|#zJK+<{@5hwh#Az@$zQnN@}2YR z9~*_4_xIn^a{&6838;*fL*N2?L}l#x_spwgzfTvEZ~P}!Ab91K_JVzE(|>B6_#gDn zjs;?Soa<+nFCQLk<*qO&k2@84!0tEymCuY1W`3((tv}D6uWbJQ)B_pJZZ`E>8-9Lf z{W9O_J7=kbtv!FnGj5fBy4#2Mls=csf|gGsK5R!+7@Zw#>KmW_|LVIT$iX(= zp-$Wk7*-JpS6>^sEAX!X#qz1=Rdw|}HTI&S;_13`=z|JW>;_g?4(^C#m8@{EjsAC)uyz4hLdY1hZ=|Mo|{ zHZE9e{`9p!+&G30A!ZI9bM{Q$b&-wZ;#78+2O#u;ML^3oFg5`bAu6yqHGN^YwZW6q z|K(YIdQSDD$}%v>JURVf_RpW6>Jb(}loU)@-*lc?YMVT|jv_M$bfHoHXb6mkz-S1J bhQMeDjD`T&A+T&$4Rh^{SuN8KDlh;5ZCaw% diff --git a/blight-map/src/main/map/chunks/voxel_17_0_09.blvc b/blight-map/src/main/map/chunks/voxel_17_0_09.blvc index dab30129511d217227a3de881b9a4e98d3bd0b42..5d268c80dbb897fcdd3a414163893bfac77fbf00 100644 GIT binary patch delta 65 zcmew@a792$~bkdaFPgkaHYbu diff --git a/blight-map/src/main/map/chunks/voxel_17_m1_08.blvc b/blight-map/src/main/map/chunks/voxel_17_m1_08.blvc index 798d1b2713729cd4dcac877f5d5d638a9c49033d..b3323cb69e25ee0d8236503f919d8fd888764251 100644 GIT binary patch literal 2409 zcmb2|=3oGW|8MUY`Y}5SFdQs)J2hQF^_lfu>*k{#9E3|98=Ch}KbZGz3ONU^E0qLtr!nMniy3A@FDO)@e+Pr3V`t%KpXe*0YHG z|LHobFw?E3s(%el$Fl{@Y>rL$jyT_Crf}auZo)tPGv*su-w6Jn^tz$K4%vxcK55VX zb1Cb<(qP#M_N>fuO%?xInwqbkK7XHqsfOqK=kPzi20z6W-dHKv|3AN<;bG*%%Lexy ztm_>dY~+#6dGWr7Ek=q{z+l0Hgs-1I`#XwnuXXq*a_!ps`>_uHWWLDA9lG`$J@7Nw_{i_9EW?B6C6Ai!?m{7>cz<4@~_{2kBvZ!|Pi)X4>$XGgYe#(}j{ zc>`9>-~Z=csRQGm6Y@tMGr#)zw|!zm6^2>{2DKCV{r&tao_~M-|0mZc-YcJfBbx7aMNq2bm?ZZs*018>XsF*2fwI@JA}kK!OSc?h?D_dZ6>#OV*GA5>rf09F;P AKczVG3iIp=?V=X@LO zC=vME(6@cxo*wjDn%ALN9$bwJe!vQNxiN$hvYYJ5%eNEXe0TjuyrR0t*Bd2rLj-Ah1B-e{idTx`*cd|~n7$IF zMjbjw*kZ?`X@H%%M=-s`Ym=$48k_8cX|mk=9SHi5V(SuX$uJVkg|z)Q-32Qe|L8K9i-Nqu8LzU5k_M(2Dv?-Az@< zrVwAW^uw*+zv52-G-&95(jxYM6!Eq#&1%TgraH5r*$*t%bqquU>hS5L?Hb(?>+Yi#(k5%RU>IP%aUMb%R0ogLwnN z>P+H;=Ufqz_1ir59DvNDbEUPm@LZ|Qd&Y2A$43-A^{fvyZWn4j~QM&IxRlIis|Mzn# z!hha%>wFxyp$?J{B)uH1`Ux&=0KUYx)OfrGZ|E#t8DZ-rfmT-+DGtEx8yIU^ErsDn zQUxyHL|gH$1elMjwc*79sWf}7E2C)S^3RA7ozeQETo}growKHLhi2F8WScbI78L-mSsk1pYPshgQy2E&4Je;}e*T=pdIPKG67K+B?#^MsF&`m0{ zQI9?$8~qtff(HA-t+Z_0@cUazda;47)(7w{4mee1RbnU0GexhkC=_>`Apn4|K#qMg za|OAT#PPh0p4wjmY-58sio}^uC>q`Odo&x=0nt(~GfJw!@ss{gLhUhwgp7dIW)uZz z?I^Z*9}bW=Pe>0|M{1@zRXQ5ivejE6T9Y3mo&m6gL3Pvcl>j@kDyg8cyR&1Eo1Q%# zUmSm}LcHIQkR&yz@wL^fxp3x3 zwPoXpYnI`)MQVz^<*(F6NH%~_QP=06tP60k9#j}1reFmL0W1RvO^Yg8G%9qH3k zhk8d<+Ew*lN-6+B|3M>eFAxtNqS8LrLNhwNz`B;b$}V5hR~PF$4!0-mUfXJLCD?u~m$ zcX_5A^yc=s1?x>_d}cu1rJ5AImqc-`f4>1Ig((FLt}F~4UbL3Mv3O%RF)&03j)KU1 z<;;_OVFjH*lQ@plpd|hVsBCOFpIN-yT}qK@CxH}pCG-JVm{KIC&aBECGP_ux>HYi@QSIgu_IFy^z)uudWM75~n>EFg0 zhx_s;*f|tXWf%fZ|7QN#u+M%1zkmap)PiZ>**`JX)+@*>G@wa2=)UKF!u;!>gPj8d znq3W1_ki|%0b1C=z=Wo4>mHyzFMt*@FrqgPvMPc0TmV_f1Z{7?^