This commit is contained in:
Victor 2018-11-14 23:03:58 +02:00
parent e586e8230c
commit c02b178411
7 changed files with 187 additions and 22 deletions

View File

@ -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);
}
}

View File

@ -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;
}
}
}

View File

@ -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();
}
}
}

View File

@ -17,4 +17,7 @@ public class Parameters {
/* Эффекты времени суток */
public static boolean timeEffects = true;
/* Отрисовывать интерфейс */
public static int drawUI = 0;
}

View File

@ -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;
}
}

BIN
src/icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 208 B

BIN
src/letitsnow.mid Normal file

Binary file not shown.