From c02b178411e3cef4f44e710e5435f7219d6bf26c Mon Sep 17 00:00:00 2001 From: Victor Date: Wed, 14 Nov 2018 23:03:58 +0200 Subject: [PATCH] 5 --- src/Background.java | 22 ++++++++-- src/DrawParticles.java | 61 ++++++++++++++++++++++++-- src/Main.java | 28 +++++++++++- src/Parameters.java | 3 ++ src/Util.java | 95 +++++++++++++++++++++++++++++++++++------ src/icon.png | Bin 0 -> 208 bytes src/letitsnow.mid | Bin 0 -> 9443 bytes 7 files changed, 187 insertions(+), 22 deletions(-) create mode 100644 src/icon.png create mode 100644 src/letitsnow.mid diff --git a/src/Background.java b/src/Background.java index 6e043b5..2ed414d 100644 --- a/src/Background.java +++ b/src/Background.java @@ -1,4 +1,5 @@ +import javax.microedition.lcdui.Font; import javax.microedition.lcdui.Graphics; import javax.microedition.lcdui.Image; @@ -43,6 +44,7 @@ public class Background { // Сколькигранная звезда? private static final int STAR_POINTS = 5; + private static final Font font = Font.getFont(Font.FACE_SYSTEM, Font.STYLE_BOLD, Font.SIZE_MEDIUM); /* массив пикселей для затемнения экрана */ private int[] night; @@ -54,13 +56,13 @@ public class Background { this.w = w; this.h = h; night = new int[w*(h/2)]; - setNight(8); + setNight(Util.getHour()); } /* Установить затемнение в зависимости от времени суток */ public final void setNight(int hour) { + if (this.hour == hour) return; this.hour = hour; - if (night[0] == colorsNight[hour]) return; for (int i = 0; i < night.length; i++) night[i] = colorsNight[hour]; } @@ -82,7 +84,7 @@ public class Background { /* * Звезда */ - public void preDraw(Graphics g) { + public void drawStar(Graphics g) { int color = 0xFF6666; if ((hour > 6) && (hour < 19)) color = 0x994444; g.setColor(color); @@ -101,6 +103,19 @@ public class Background { g.drawRGB(night, 0, w, 0, h/2, w, h/2, true); } + /* + * Отрисовка интерфейса + * lines массив строк для вывода + */ + public void drawUI(Graphics g, String[] lines) { + int fh = font.getHeight(); + g.setColor(0xFFFF00); + g.setFont(font); + for (int i = 0; i < lines.length; i++) { + g.drawString(lines[i], w/2, i*fh, Graphics.HCENTER | Graphics.TOP); + } + } + /* Рисуем елку высотой height */ private void drawTree(Graphics g, int x, int y, int height) { final int FLOOR = 8; // сколько ярусов у елки @@ -135,4 +150,5 @@ public class Background { } g.fillArc(cx-radius/2, cy-radius/2, radius, radius, 0, 360); } + } diff --git a/src/DrawParticles.java b/src/DrawParticles.java index 1c11495..8a73b7e 100644 --- a/src/DrawParticles.java +++ b/src/DrawParticles.java @@ -15,6 +15,7 @@ public class DrawParticles extends Canvas implements Runnable { private static final int MAX_SPEED = 50; private static final int MAX_SNOW = 50; + private boolean autoChangeTime; private int w, h; private int hour; // время в часах, для эффектов private int speed, wind; @@ -24,11 +25,13 @@ public class DrawParticles extends Canvas implements Runnable { private Image background; private Vector particles; + public DrawParticles() { setFullScreenMode(true); w = getWidth(); h = getHeight(); - hour = 8; + autoChangeTime = true; + hour = Util.getHour(); speed = MIN_SPEED; wind = (int) Util.random(0, 360);//250; Snow.setSpeed(speed); @@ -44,13 +47,48 @@ public class DrawParticles extends Canvas implements Runnable { public void paint(Graphics g) { g.drawImage(background, 0, 0, 20); - bg.preDraw(g); + bg.drawStar(g); // рисуем системы for (int i = 0; i < particles.size(); i++) { ((ParticleSystem) particles.elementAt(i)).render(g); } // эффекты времени суток if (Parameters.timeEffects) bg.postDraw(g); + // инфа + if (Parameters.drawUI == 1) { + String[] lines = new String[] { + "Сейчас: ", + Util.getTimeString(), + Util.getNewYearTimeString(0), + Util.getNewYearTimeString(1) + }; + bg.drawUI(g, lines); + } else if (Parameters.drawUI == 2) { + String[] lines = new String[] { + "Параметры", + "", + "Направление ветра: " + String.valueOf(wind), + "Скорость снегопада: " + String.valueOf(speed), + "Автосмена ветра: " + (Parameters.autoWind ? "вкл" : "выкл"), + "Затемнения: " + (Parameters.timeEffects ? "вкл" : "выкл"), + (Parameters.timeEffects && !autoChangeTime) ? ("Время: " + String.valueOf(hour)) : "" + }; + bg.drawUI(g, lines); + } else if (Parameters.drawUI == 3) { + String[] lines = new String[] { + "Автор:", + "Виктор aNNiMON Мельник", + "", + "Управление: ", + "Вверх/вниз:", "Скорость снегопада", + "Влево/вправо:", "Направление ветра", + "1,3 - затемнение", "# - сброс", + "7 - Автосмена ветра", + "9 - Затемнения", + "* - информация", + }; + bg.drawUI(g, lines); + } } public void run() { @@ -64,7 +102,10 @@ public class DrawParticles extends Canvas implements Runnable { timeToChangeWind = System.currentTimeMillis() + (long)(Util.random(5, 30)*1000); } } - if (Parameters.timeEffects) bg.setNight(hour); + if (Parameters.timeEffects) { + if (autoChangeTime) hour = Util.getHour(); + bg.setNight(hour); + } Snow.setWind(wind); repaint(); try { @@ -113,13 +154,25 @@ public class DrawParticles extends Canvas implements Runnable { break; default: if (key == KEY_NUM1) { + autoChangeTime = false; hour--; if (hour < 0) hour = 23; + } else if (key == KEY_POUND) { + autoChangeTime = true; + hour = Util.getHour(); } else if (key == KEY_NUM3) { + autoChangeTime = false; hour++; if (hour > 23) hour = 0; } - System.out.println(hour); + else if (key == KEY_STAR) { + Parameters.drawUI++; + if (Parameters.drawUI > 3) Parameters.drawUI = 0; + } else if (key == KEY_NUM7) { + Parameters.autoWind = !Parameters.autoWind; + } else if (key == KEY_NUM9) { + Parameters.timeEffects = !Parameters.timeEffects; + } } } diff --git a/src/Main.java b/src/Main.java index cf1455d..430ae80 100644 --- a/src/Main.java +++ b/src/Main.java @@ -3,15 +3,20 @@ * For more info visit http://annimon.com/ */ +import java.io.InputStream; import javax.microedition.lcdui.*; +import javax.microedition.media.Manager; +import javax.microedition.media.Player; +import javax.microedition.media.PlayerListener; import javax.microedition.midlet.*; /** * @author aNNiMON */ -public class Main extends MIDlet { +public class Main extends MIDlet implements PlayerListener { public Display dsp; + private Player plr; public static Main midlet; public Main() { @@ -21,6 +26,7 @@ public class Main extends MIDlet { public void startApp() { DrawParticles dp = new DrawParticles(); + playSound(); dsp.setCurrent(dp); } @@ -30,4 +36,24 @@ public class Main extends MIDlet { public void destroyApp(boolean ex) { notifyDestroyed(); } + + private void playSound() { + try { + InputStream is = getClass().getResourceAsStream("/letitsnow.mid"); + is.read(); is.read(); + plr = Manager.createPlayer(is, "audio/midi"); + plr.realize(); + plr.prefetch(); + plr.addPlayerListener(this); + plr.start(); + } catch (Exception ex) { + ex.printStackTrace(); + } + } + + public void playerUpdate (Player player, String event, Object data) { + if (event.equals(PlayerListener.END_OF_MEDIA)) { + playSound(); + } + } } diff --git a/src/Parameters.java b/src/Parameters.java index cb31fea..bedba9f 100644 --- a/src/Parameters.java +++ b/src/Parameters.java @@ -17,4 +17,7 @@ public class Parameters { /* Эффекты времени суток */ public static boolean timeEffects = true; + + /* Отрисовывать интерфейс */ + public static int drawUI = 0; } diff --git a/src/Util.java b/src/Util.java index 9102d72..3119a7e 100644 --- a/src/Util.java +++ b/src/Util.java @@ -1,4 +1,5 @@ +import java.util.Calendar; import java.util.Random; import javax.microedition.lcdui.Graphics; import javax.microedition.lcdui.Image; @@ -37,6 +38,86 @@ public class Util { else return 0; } + /** + * Получить время + * @return строка с временем вида: DD.MM.YYYY HH:MM + */ + public static String getTimeString() { + StringBuffer sb = new StringBuffer(); + Calendar cal = Calendar.getInstance(); + // День + int tmp = cal.get(Calendar.DAY_OF_MONTH); + if(tmp <= 9) sb.append('0'); + sb.append(tmp); + sb.append('.'); + // Месяц + tmp = cal.get(Calendar.MONTH)+1; + if(tmp <= 9) sb.append('0'); + sb.append(tmp); + sb.append('.'); + // Год + tmp = cal.get(Calendar.YEAR); + sb.append(tmp); + sb.append(' '); + // Проверяем, новый ли год + if (sb.toString().startsWith("01.01")) { + sb.delete(0, sb.length() - 1); + sb.append("С Новым Годом!!!! "); + } + // Час + tmp = cal.get(Calendar.HOUR_OF_DAY); + if(tmp <= 9) sb.append('0'); + sb.append(tmp); + sb.append(':'); + // Минута + tmp = cal.get(Calendar.MINUTE); + if(tmp <= 9) sb.append('0'); + sb.append(tmp); + sb.append(':'); + // Секунда + tmp = cal.get(Calendar.SECOND); + if(tmp <= 9) sb.append('0'); + sb.append(tmp); + cal = null; + return sb.toString(); + } + + /** + * Получить время до Нового года + * @param line номер строки + * @return массив строк с временем вида: DD/MM/YYYY HH:MM + */ + public static String getNewYearTimeString(int line) { + StringBuffer sb = new StringBuffer(); + Calendar cal = Calendar.getInstance(); + if (line == 0) { + sb.append("До Нового ").append(cal.get(Calendar.YEAR) + 1).append(" года: "); + return sb.toString(); + } + // Месяц + int tmp = 11 - cal.get(Calendar.MONTH); + if (tmp > 8) return "Еще куча времени!! =)"; + else if (tmp != 0) sb.append(tmp).append(" мес "); + // День + tmp = 31 - cal.get(Calendar.DAY_OF_MONTH); + if (tmp != 0) sb.append(tmp).append(" дн "); + // Час + tmp = 23 - cal.get(Calendar.HOUR_OF_DAY); + if (tmp != 0) sb.append(tmp).append(" ч "); + // Минута + tmp = 59 - cal.get(Calendar.MINUTE); + if (tmp != 0) sb.append(tmp).append(" м "); + // Секунда + tmp = 59 - cal.get(Calendar.SECOND); + if (tmp != 0) sb.append(tmp).append(" с "); + cal = null; + return sb.toString(); + } + + public static int getHour() { + int tmp = Calendar.getInstance().get(Calendar.HOUR_OF_DAY); + return tmp; + } /** * Отрисовка вертикального градиента * @param g контекст графики @@ -109,18 +190,4 @@ public class Util { return (ca << 24) | (cr << 16) | (cg << 8) | cb; } - - /** - * Получить цвет нужного канала в пикселе - * @param argb пиксель - * @param c символьный параметр - название канала (a, r, g, b) - * @return - */ - private static int acolor(int argb, char c) { - if(c=='r') return ((argb >> 16) & 0xff); - else if(c=='g') return ((argb >> 8) & 0xff); - else if(c=='b') return (argb & 0xff); - else if(c=='a') return ((argb >> 24) & 0xff); - else return argb; - } } diff --git a/src/icon.png b/src/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..ace5a158fda7adbbed86090c5f1cddfb17160c58 GIT binary patch literal 208 zcmeAS@N?(olHy`uVBq!ia0vp^fEalYaWA(=QLMp$$JzYws+~+ts|#8@ zub8axN&0qTW9IgAf*1cypRUqUf3aRkUfrjwT2^HH)?KaAPUr48IGn!5uH_l%C0-nS zxhd(&?WUb)%X&nYzNx-eyMAAeQB>EwqBeeyi>eRH9InO#tz+bP0l+XkK_eE2F literal 0 HcmV?d00001 diff --git a/src/letitsnow.mid b/src/letitsnow.mid new file mode 100644 index 0000000000000000000000000000000000000000..e0b8a1623df3ef418478ef89f7c08f15438084c5 GIT binary patch literal 9443 zcmeI2TTfL-6vvlJr3JHd(ljX=2}hzvqT+T(i(G`wgS& zS!;Ioi|q8{nFo*Nm*bhGPg@@>DcQXucCF)o$nKdVEOD&%&cf{cO7^O}s+W!0aoMPQ zA{+O|rGEU&_^U3J?-H@U!zw>4Vt)r!As!UT(d0z>Y5GNaX?ivFni!@+#xx`8G+_w2Bc#a~`mh8LoEd{NG$7V3 z%t8#ZL$)i_nL(YsDm02NWY};{g(V|7eLH3KE2Brp)vv66j2W?JhBaapvYxX`7h~wG zTZI@YhL@?dL~WM}eWxWp7bu*ShEzCIbfY0GJtP6%q)`v4=3x~K$$Eq}5qt=ZRgJE< zEN7&By&7FQG!JHiFT@-5BKIkA#hRB()x1c4u9r<}-ez4ao37@4T^^M=l_z!DUt8q@ zSLIw*BQZtoD(I4D%k3iVq^WixRhe{Eh&yRJMLK9Ybh9QM5|B%yK^1h%Bn4_vwHF-neZg&pyKMuSiw$dGY zM9?)LaAyuzeQu(Ho2e>=f-}^oF4f$rEmMd(C1_);O{7ybcd4M0qJrL>`g}Dr=a7o3 zXLYG1MzIQVtVF%*!I(Y8iirFe`R>fqjW)X_0DaV}f*1x{g{g@F2bd_Qf5CMPBzF3s@N&f^S+9 z%0ePtiS+VBN@yWnlQcxm(vQtdTT+Nxl7JkghskJ=l(R6Z^Ryp|SRzaUhFFdqS6V*` zMGr&I%;mJ?%U<#&W;!(>>F0^__9e2T;kih^&B%#)0>?!W2a7(N=uV`MCn^;W~?&eYABwaoW?AOkVez@H&-7CK~-{FUcDPSC~$#RxfC1092CsUsw+_7y}xQ z!g?qh4gH(e+uPy?$9jd^ML*W2vreoX8bjm9eTnq&L@~$nu&Z`x>l;mp6ghPSG?hmH zzJtr$Oaw4Ilusrbl96 z>%N{V#PDlQ*x+$d2Q=8AaXaiWk*fW;kAsWfC&Z{jt|S3rPb5cIL|P3A=_zW}Q5N9c zM1ORd!;IaP33_o+$F9K6nr>G^8i7x4ywKadu{xt}dvtP%$p$bJxPysY0R9D@^hR`Y zH2aWYjV=jz>4yd3c25U54y##IJKernG_EjRwfbpg5j;9_i0o?h`&RtZ~hJujp)}Axsk}VghNVz@;I|_x`_rvu5lM7a)Wyf zUZE0w(iu)U#{1Rh)fBB{1(9g=nk3@)PB;AN*To?dZ(%f|{L?Ur)$( z?V@bgeIVQS^|f5#clmZ&<)=mL?s;^nrG$eQ1GOR*6W9nJf zP~;(~=y07Dvkk{|iyqf%cU1n4|D9$CxoL^(TH;;4u-(;!A>@vbCS&Ns5c^N7Yi3wuM1`2g*~Qt^ z-hGb1%T!vTUavymX^GDT3TLG$6;2i1XbMYDNq{$L)KjW?S_M;lHpQCm>hSOw%cyu< zu`v|rU3Z*~nxGz4sE|>)hf410;1w)5&9P-W6}&ay`QWYTn^{?r-?Fk(`&4%7V%af~ z`$Aqe&gpLqe1M=mOPlVWVf+l^S=uaZ6Kzu&z3-o5{8ZVzr}z8~%r`LK_=)+Z(LmE6 zVtalR1Pqg+QnPjx9LyRlv<3^U#$w5NcKuVd28-)wX*Ip)_w;*X@zVTi4vg)3XeU|n zq)1wlqqTyha)lB;FTa^ZnnfJ-K5N-wISuXU*EHi-@_O`rzf-^S{g9+(dV0_A*V|iD zXcg4rz`XvSQQ5*xp7{OY&lgvh=U1+Nbglev GNPhySlNd+< literal 0 HcmV?d00001