From 8fc090297d94ccf31b59047c039c9ba49948c2a8 Mon Sep 17 00:00:00 2001 From: DaniTheSkunk <> Date: Fri, 25 Nov 2022 19:08:33 +0000 Subject: [PATCH] totally didn't forget commits <_< --- .gitignore | 1 + .idea/.gitignore | 3 + .idea/libraries/skunkworks.xml | 9 ++ .idea/misc.xml | 6 ++ .idea/modules.xml | 8 ++ .idea/vcs.xml | 6 ++ 9slice-2.png | Bin 0 -> 228 bytes fonts/ega-8x14.png | Bin 0 -> 4214 bytes fonts/thin-6x12.png | Bin 0 -> 1046 bytes skunkstream.iml | 12 +++ .../danitheskunk/skunkstream/IElement.java | 7 ++ src/com/danitheskunk/skunkstream/Image.java | 34 +++++++ src/com/danitheskunk/skunkstream/Label.java | 30 ++++++ .../danitheskunk/skunkstream/NineSlice.java | 23 +++++ .../danitheskunk/skunkstream/Skunkstream.java | 87 ++++++++++++++++++ test.ini | 28 ++++++ test.png | Bin 0 -> 1615 bytes 17 files changed, 254 insertions(+) create mode 100644 .gitignore create mode 100644 .idea/.gitignore create mode 100644 .idea/libraries/skunkworks.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/vcs.xml create mode 100644 9slice-2.png create mode 100644 fonts/ega-8x14.png create mode 100644 fonts/thin-6x12.png create mode 100644 skunkstream.iml create mode 100644 src/com/danitheskunk/skunkstream/IElement.java create mode 100644 src/com/danitheskunk/skunkstream/Image.java create mode 100644 src/com/danitheskunk/skunkstream/Label.java create mode 100644 src/com/danitheskunk/skunkstream/NineSlice.java create mode 100644 src/com/danitheskunk/skunkstream/Skunkstream.java create mode 100644 test.ini create mode 100644 test.png diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6a3417b --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/out/ diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/.idea/libraries/skunkworks.xml b/.idea/libraries/skunkworks.xml new file mode 100644 index 0000000..1dd35c0 --- /dev/null +++ b/.idea/libraries/skunkworks.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..07115cd --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..69a4127 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..35eb1dd --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/9slice-2.png b/9slice-2.png new file mode 100644 index 0000000000000000000000000000000000000000..e26ebe0f734bc4a82225f0505bb9fb654e177b82 GIT binary patch literal 228 zcmeAS@N?(olHy`uVBq!ia0vp^AT}2V8<6ZZI=>f4F%}28J29*~C-V}>ndj-^7$Pw> zIpF|PnjPNH`GmhE&k;hf>Vwka^fkRWm!znClxbEF~m$swsFN5;Mha3zRb8MG= T{V;hp(4`EXu6{1-oD!M<6a!uL literal 0 HcmV?d00001 diff --git a/fonts/ega-8x14.png b/fonts/ega-8x14.png new file mode 100644 index 0000000000000000000000000000000000000000..5da0d32b1ce87d4ceb87a9ca50201bbdf04e4fff GIT binary patch literal 4214 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 M07*qoM6N<$f(^zqUH||9 literal 0 HcmV?d00001 diff --git a/fonts/thin-6x12.png b/fonts/thin-6x12.png new file mode 100644 index 0000000000000000000000000000000000000000..6521b923044009f809a8e0c774b77eebf1c79bf4 GIT binary patch literal 1046 zcmeAS@N?(olHy`uVBq!ia0vp^2|#>+gAGXjZb`caq!^2X+?^QKos)UVz`%UL)5S5Q zV$Rz;f%&f$c-kH=yY>J7={L(f&TM*Utf)Ej-t%W$t}wO-u;o~-7YFJ^0y6@@%yHe^M~C}r_HmjoKKy$|lUgP7Yr*fw%pa})ewFvaLurlP{O3m6vwxR; z-xce`>3>d^VZ-{zU#0S=cxf)x?SHhlsCupV>)6ZM!H=f?zIEuunqzwMiz~L;tV$1& zJDU3Wrf<2jSa00YogCw)?T;b*FQF_Pq%tv?`s=cC2F!+YGdh^)VP{0TwPZGFRoT# zVE7>W@RUN-+Z#oxUmqP^{k8wqrqzpo*+ti{m-||?Cfxsu{lbjq;?T+~dD~*{&iMMN zGw$~5TiNNqA8v|2WnX%C?#(x@_a~fD`@H=7LZesbO1`{dTUA$=7B2gA^4|F`_V}z_ z{hMKm-%QV2tKBv8?Zf5fEuWsh?6KRG!v{_;TM)YVQ=YbepnpBH(!CeK?y31(z6qTx z>-pZiMUJg+nZT0Lxb$x*tWT`mTS(ruYA7B z_U!A@!~aDMU!SS^>lsu(Ey!9WYQOf=z`t>OwhIQ|?!9*RR8>snkGFLPtJglW%sH@c z|1O)~cGa<8B17)4(D@a9w)oY0C6QBK3ZLGwN>00FZS5QPjbX~{o4I}G=Txmzn$Nm* z&rThy+b_@Vo@r@V{qM1_zSr?8{)6W}XYs}DefxW6)iy)x+DiUsv*o^ug!L}iyjYT9 z!R?3bv2H&%q<|bKe@vpvg*6t>9T*j+1&l_P7`4`>lwZc_PMD53+i^_Fg+S*RF4y^*wF3sgs;FcPg{!$KCy_UHbLWtzFap**(ZO zbH`)tV%dxL0yl=IKU<;ndqY^p?LWm^5+}c#`?%jNN?N{jPL*BW?acMt*XPE3v2Hx` zo_SBq)Eyo--o3f=)nxax`kRGc_^R$3AZ0Y-nIG!^FzsfW`ak2tos%G4p00i_>zopr E03P53g8%>k literal 0 HcmV?d00001 diff --git a/skunkstream.iml b/skunkstream.iml new file mode 100644 index 0000000..8c8be27 --- /dev/null +++ b/skunkstream.iml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/src/com/danitheskunk/skunkstream/IElement.java b/src/com/danitheskunk/skunkstream/IElement.java new file mode 100644 index 0000000..be6a1df --- /dev/null +++ b/src/com/danitheskunk/skunkstream/IElement.java @@ -0,0 +1,7 @@ +package com.danitheskunk.skunkstream; + +import com.danitheskunk.skunkworks.gfx.IRenderContext; + +public interface IElement { + void render(IRenderContext rc); +} diff --git a/src/com/danitheskunk/skunkstream/Image.java b/src/com/danitheskunk/skunkstream/Image.java new file mode 100644 index 0000000..4434293 --- /dev/null +++ b/src/com/danitheskunk/skunkstream/Image.java @@ -0,0 +1,34 @@ +package com.danitheskunk.skunkstream; + +import com.danitheskunk.skunkworks.Recti; +import com.danitheskunk.skunkworks.Vec2i; +import com.danitheskunk.skunkworks.gfx.Color; +import com.danitheskunk.skunkworks.gfx.IRenderContext; +import com.danitheskunk.skunkworks.gfx.ITexture; + +public class Image implements IElement { + private final Vec2i pos; + private final ITexture texture; + private final Vec2i size; + private final Color color; + + public Image(Vec2i pos, ITexture texture, Vec2i size, Color color) { + this.pos = pos; + this.texture = texture; + this.size = size; + this.color = color; + } + + @Override + public void render(IRenderContext rc) { + if(size == Vec2i.ZERO) { + rc.drawTexture(pos, texture, color); + } else { + rc.drawTextureRectangle(new Recti(pos, size), + texture, + color, + false + ); + } + } +} diff --git a/src/com/danitheskunk/skunkstream/Label.java b/src/com/danitheskunk/skunkstream/Label.java new file mode 100644 index 0000000..dd0008e --- /dev/null +++ b/src/com/danitheskunk/skunkstream/Label.java @@ -0,0 +1,30 @@ +package com.danitheskunk.skunkstream; + +import com.danitheskunk.skunkworks.Vec2i; +import com.danitheskunk.skunkworks.gfx.Color; +import com.danitheskunk.skunkworks.gfx.IRenderContext; +import com.danitheskunk.skunkworks.gfx.font.IFont; + +public class Label implements IElement { + private final Vec2i pos; + private final String text; + private final IFont font; + private final Color color; + + public Label(Vec2i pos, String text, IFont font, Color color) { + this.pos = pos; + this.text = text; + this.font = font; + this.color = color; + } + + @Override + public void render(IRenderContext rc) { + rc.drawString( + pos, + text, + font, + color + ); + } +} diff --git a/src/com/danitheskunk/skunkstream/NineSlice.java b/src/com/danitheskunk/skunkstream/NineSlice.java new file mode 100644 index 0000000..0cfbb21 --- /dev/null +++ b/src/com/danitheskunk/skunkstream/NineSlice.java @@ -0,0 +1,23 @@ +package com.danitheskunk.skunkstream; + +import com.danitheskunk.skunkworks.Recti; +import com.danitheskunk.skunkworks.Vec2i; +import com.danitheskunk.skunkworks.gfx.IRenderContext; + +public class NineSlice implements IElement { + private final Vec2i pos; + private final com.danitheskunk.skunkworks.gfx.NineSlice nineSlice; + private final Vec2i size; + + public NineSlice(Vec2i pos, + com.danitheskunk.skunkworks.gfx.NineSlice nineSlice, Vec2i size) { + this.pos = pos; + this.nineSlice = nineSlice; + this.size = size; + } + + @Override + public void render(IRenderContext rc) { + rc.drawNineSlice(nineSlice, new Recti(pos, size)); + } +} diff --git a/src/com/danitheskunk/skunkstream/Skunkstream.java b/src/com/danitheskunk/skunkstream/Skunkstream.java new file mode 100644 index 0000000..eac8723 --- /dev/null +++ b/src/com/danitheskunk/skunkstream/Skunkstream.java @@ -0,0 +1,87 @@ +package com.danitheskunk.skunkstream; + +import com.danitheskunk.skunkworks.BaseGame; +import com.danitheskunk.skunkworks.Data; +import com.danitheskunk.skunkworks.Vec2i; +import com.danitheskunk.skunkworks.gfx.IRenderContext; +import com.danitheskunk.skunkworks.gfx.ITexture; +import com.danitheskunk.skunkworks.gfx.font.IFont; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +public class Skunkstream extends BaseGame { + Data data; + List elements; + HashMap fonts; + HashMap textures; + HashMap nineSlices; + + public Skunkstream() { + super(new Vec2i(1920, 1080), "Skunkstream v0.0"); + data = engine.loadDataWatched("c:\\dev\\skunkstream\\test.ini"); + elements = new ArrayList<>(); + fonts = new HashMap<>(); + textures = new HashMap<>(); + nineSlices = new HashMap<>(); + fonts.put("", debugFont); + prepare(); + data.onReload(this::prepare); + } + + public static void main(String params[]) { + new Skunkstream().run(); + } + + void prepare() { + elements.clear(); + var cats = data.getCategories(); + for(var cat : cats) { + if(!cat.equals("")) { + var type = data.get(cat, "type"); + if(type.equals("label")) { + elements.add(new Label( + data.getVec2i(cat, "pos"), + data.get(cat, "text"), + fonts.get(data.get(cat, "font")), + data.getColor(cat, "color") + )); + } else if(type.equals("image")) { + var path = data.get(cat, "path"); + if(!textures.containsKey(path)) { + textures.put(path, window.loadTexture(path)); + } + elements.add(new Image( + data.getVec2i(cat, "pos"), + textures.get(path), + data.getVec2i(cat, "size"), + data.getColor(cat, "color") + )); + } else if(type.equals("9slice")) { + var path = data.get(cat, "path"); + if(!nineSlices.containsKey(path)) { + nineSlices.put(path, window.loadNineSlice(path)); + } + elements.add(new NineSlice( + data.getVec2i(cat, "pos"), + nineSlices.get(path), + data.getVec2i(cat, "size") + )); + } else if(type.equals("font")) { + if(!fonts.containsKey(cat)) { + var path = data.get(cat, "path"); + fonts.put(cat, window.loadFontTileset(path)); + } + } + } + } + } + + @Override + protected void render(IRenderContext rc) { + for(var element : elements) { + element.render(rc); + } + } +} diff --git a/test.ini b/test.ini new file mode 100644 index 0000000..109e533 --- /dev/null +++ b/test.ini @@ -0,0 +1,28 @@ +[thin_font] +type = font +path = fonts/thin-6x12.png + +[test_img] +type = image +path = test.png +pos = 50, 450 +size = 500, 100 +color = #ff0000 + +[test_label] +type = label +text = Test1234 +pos = 100x500 + +[test_label2] +type = label +text = nya! thin font test +pos = 100, 516 +color = #ff00ffff +font = thin_font + +[test_9slice] +type = 9slice +path = 9slice-2.png +pos = 200, 200 +size = 100, 50 \ No newline at end of file diff --git a/test.png b/test.png new file mode 100644 index 0000000000000000000000000000000000000000..750c07246dc35af578913cee3832b0bfc0ef175c GIT binary patch literal 1615 zcmY*aeN>WH97dx_O_7#sxxq>6Y#z&*jXo5PUtyAE*!)N{r=#+)iAGLAgTyiuW+v`* zR;ImvPSYWpPW)!1p|ny~4bq%|nu>^@Q?m)=UQqJvkNe(p@B6#IkLP)Q_x^a2fVbNG z>1GH7V&!+#ClH)Ph5`Ek{5~wtCWDh%LLmMyq*{Vhg9|9h`-C?HQp@>JN8AXmH(fk> zIspQKKQat6F{R=>1hR3&&&NABIdV$=G&3S(`^G_$gWt~K$5-tynURKF+KV@|ha%dF z>@tVYEd|E4UVfy=3a;)lwDmZ0_&8x(gmRE8?-^vp=Su@kB zLrBUPEsO9(J8?SpJSu!>d-aMP0+Gnx8j8hHJ|C|_a%YeP7|h(v+s!oFch!Y0(Y0}!Ffm&wDwtIO_rAz z!r-Z$%HA5JTA%O@>5a(DZ1F1^0>W z2z-Y{BgL8BC<&O8(;%+}c5oEpWZc8MM zhmd9!wluY#Gi4b9%n6ru`9wat0T+Bc>3yv&W86FY7Q1y_WD1!*Z_bcd2 z%2s7>>N{rGlv4^N@c0z8M$v|?awbi$S22P*8%t`M$bJ@x^^vuF^6PZ!gua@G%bK$M zGH5-5ZxXu}D9&re)nmLg^Nj^cO&>-y02G%onJ9B#BcMZ1up%jXL5hAS?V4^}!aN=@ zc+S-x=wDoU{?fkanh|)pVY6bapt83-Nhr|fx8nR$fMRA_b5yB(!p6k0lfs_BLkIKp z9Jz8p$ogK*xJBnzlP@oKf;8b-S2h^Q$ra%4(Me(beel{hl9M&Nq>z=Gp3BBqXzeEu*hHC5QB{`h=W8k>!X%)b@kUU>z6`+kWY7?Y<%%6Ht z+(SooP%|#cG#`;enFD#fR^?+R)l8zy;gu+`hL5+b2^wZntU++A+7$RZ#l$T+hnVmf zMEPEB_`8+~=#Du?c0v0l( ztpUMY_l2)siu|P+dmV1}*-oS0;I;7y${YI|f`Z?lFI61^hGTkCt zZ`GwlevmSX)fCPT3Od_**N@w1UTBvyZu6)aCgjsQu_ErF8L&!B zg5(6rt%?eiM3aHy9}cgAHAJV7D!ORwvYS&*Vug1Ms{$zc-~SPeC`|m)I~*WtfTBBF z*HFHZ#IB6v-Ksa}6i0IHHnnU|5<8MSgA7Wt1d2H(<5H{-pHFyR*C2V$*!#2Onb>6g z2iE6lEj6ook(S%PFOltG0=dm4z*+9N8&w*>JvVNXVruK}Bpk5GccWgr0B4b=o2o_C z$){#+174SaE;4VJY`44bxWEf?ikm`}Glhw;K{unYzbLdm1C)$PvEqSAmSGj=STYBb^Fo!7T2{c dRrNPoYj%!pXZ)DB3w#71en$vC)rY@L`wz6^&+z~N literal 0 HcmV?d00001