1
This commit is contained in:
commit
e75944fbe0
91
src/DrawParticles.java
Normal file
91
src/DrawParticles.java
Normal file
@ -0,0 +1,91 @@
|
|||||||
|
/*
|
||||||
|
* aNNiMON 2011
|
||||||
|
* For more info visit http://annimon.com/
|
||||||
|
*/
|
||||||
|
|
||||||
|
import java.util.Vector;
|
||||||
|
import javax.microedition.lcdui.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author aNNiMON
|
||||||
|
*/
|
||||||
|
public class DrawParticles extends Canvas implements Runnable {
|
||||||
|
|
||||||
|
private static final int MAX_SNOW = 15;
|
||||||
|
|
||||||
|
private int w, h;
|
||||||
|
private int speed, wind;
|
||||||
|
private Vector particles;
|
||||||
|
|
||||||
|
public DrawParticles() {
|
||||||
|
setFullScreenMode(true);
|
||||||
|
w = getWidth();
|
||||||
|
h = getHeight();
|
||||||
|
speed = 1;
|
||||||
|
wind = 0;
|
||||||
|
Snow.setSpeed(speed);
|
||||||
|
Snow.setWind(wind);
|
||||||
|
particles = new Vector();
|
||||||
|
for (int i = 0; i < 10; i++) {
|
||||||
|
particles.addElement(new Snow(w, h-10*i, MAX_SNOW*i+MAX_SNOW/3, i+1));
|
||||||
|
}
|
||||||
|
new Thread(this).start();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void paint(Graphics g) {
|
||||||
|
g.setColor(0);//xFF2895B9);
|
||||||
|
g.fillRect(0, 0, w, h);
|
||||||
|
// рисуем системы
|
||||||
|
for (int i = 0; i < particles.size(); i++) {
|
||||||
|
((ParticleSystem) particles.elementAt(i)).render(g, speed);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void run() {
|
||||||
|
while(true) {
|
||||||
|
repaint();
|
||||||
|
try {
|
||||||
|
Thread.sleep(20);
|
||||||
|
} catch (InterruptedException ex) {
|
||||||
|
ex.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void sizeChanged(int w, int h) {
|
||||||
|
this.w = getWidth();
|
||||||
|
this.h = getHeight();
|
||||||
|
super.sizeChanged(w, h);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void keyPressed(int key) {
|
||||||
|
int ga = getGameAction(key);
|
||||||
|
switch (ga) {
|
||||||
|
case UP:
|
||||||
|
speed++;
|
||||||
|
if (speed > 30) speed = 30;
|
||||||
|
Snow.setSpeed(speed);
|
||||||
|
break;
|
||||||
|
case DOWN:
|
||||||
|
speed--;
|
||||||
|
if (speed < 1) speed = 1;
|
||||||
|
Snow.setSpeed(speed);
|
||||||
|
break;
|
||||||
|
case RIGHT:
|
||||||
|
wind++;
|
||||||
|
if (wind > 10) wind = 10;
|
||||||
|
Snow.setWind(wind);
|
||||||
|
break;
|
||||||
|
case LEFT:
|
||||||
|
wind--;
|
||||||
|
if (wind < -10) wind = -10;
|
||||||
|
Snow.setWind(wind);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void keyRepeated(int key) {
|
||||||
|
keyPressed(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
33
src/Main.java
Normal file
33
src/Main.java
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
/*
|
||||||
|
* aNNiMON 2011
|
||||||
|
* For more info visit http://annimon.com/
|
||||||
|
*/
|
||||||
|
|
||||||
|
import javax.microedition.lcdui.*;
|
||||||
|
import javax.microedition.midlet.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author aNNiMON
|
||||||
|
*/
|
||||||
|
public class Main extends MIDlet {
|
||||||
|
|
||||||
|
public Display dsp;
|
||||||
|
public static Main midlet;
|
||||||
|
|
||||||
|
public Main() {
|
||||||
|
midlet = Main.this;
|
||||||
|
dsp = Display.getDisplay(Main.this);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void startApp() {
|
||||||
|
DrawParticles dp = new DrawParticles();
|
||||||
|
dsp.setCurrent(dp);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void pauseApp() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public void destroyApp(boolean ex) {
|
||||||
|
notifyDestroyed();
|
||||||
|
}
|
||||||
|
}
|
60
src/ParticleSystem.java
Normal file
60
src/ParticleSystem.java
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
|
||||||
|
import javax.microedition.lcdui.Graphics;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* aNNiMON 2011
|
||||||
|
* For more info visit http://annimon.com/
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Базовый класс системы частиц
|
||||||
|
* @author aNNiMON
|
||||||
|
*/
|
||||||
|
public abstract class ParticleSystem {
|
||||||
|
|
||||||
|
/* Массив частицы */
|
||||||
|
protected Point3D[] particles;
|
||||||
|
protected Rectangle window;
|
||||||
|
|
||||||
|
public ParticleSystem(int x, int y, int w, int h, int numOfParticles) {
|
||||||
|
window = new Rectangle(x, y, w, h);
|
||||||
|
particles = new Point3D[numOfParticles];
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Отрисовка системы частиц */
|
||||||
|
public void render(Graphics g, int speed) {
|
||||||
|
update(); // сначала обновляем частицы
|
||||||
|
g.clipRect(window.x, window.y, window.w, window.h);
|
||||||
|
draw(g); // затем только рисуем
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Добавление частицы */
|
||||||
|
protected Point3D addParticle() {
|
||||||
|
return resetParticle();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Сброс свойств частицы */
|
||||||
|
protected abstract Point3D resetParticle();
|
||||||
|
/* Обновление свойств частиц */
|
||||||
|
protected abstract void update();
|
||||||
|
/* Отрисовка частиц */
|
||||||
|
protected abstract void draw(Graphics g);
|
||||||
|
|
||||||
|
/* Точка в 3D */
|
||||||
|
protected class Point3D {
|
||||||
|
float x, y, z;
|
||||||
|
int color;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Прямоугольник */
|
||||||
|
protected class Rectangle {
|
||||||
|
int x, y, w, h;
|
||||||
|
|
||||||
|
public Rectangle(int x, int y, int w, int h) {
|
||||||
|
this.x = x;
|
||||||
|
this.y = y;
|
||||||
|
this.w = w;
|
||||||
|
this.h = h;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
99
src/Snow.java
Normal file
99
src/Snow.java
Normal file
@ -0,0 +1,99 @@
|
|||||||
|
|
||||||
|
import javax.microedition.lcdui.Graphics;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* aNNiMON 2011
|
||||||
|
* For more info visit http://annimon.com/
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author aNNiMON
|
||||||
|
*/
|
||||||
|
public class Snow extends ParticleSystem {
|
||||||
|
|
||||||
|
/* Скорость падения снега */
|
||||||
|
private static int speed;
|
||||||
|
/* Скорость и направление ветра */
|
||||||
|
private static int wind;
|
||||||
|
/* Начальный угол отрисовки снежинки */
|
||||||
|
private static float stAngle = 0;
|
||||||
|
|
||||||
|
/* Слой снежинок по Z */
|
||||||
|
private float zPosition;
|
||||||
|
|
||||||
|
public Snow(int w, int h, int numOfParticles, float zPos) {
|
||||||
|
super(0, 0, w, h, numOfParticles);
|
||||||
|
if (zPos > 10) zPos = 10;
|
||||||
|
zPosition = zPos+1;
|
||||||
|
for (int i = 0; i < particles.length; i++) {
|
||||||
|
particles[i] = addParticle();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Установка скорости падения снега */
|
||||||
|
public static void setSpeed(int value) {
|
||||||
|
speed = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Установка скорости и направления ветра */
|
||||||
|
public static void setWind(int value) {
|
||||||
|
wind = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Начальные свойства снежинки */
|
||||||
|
protected Point3D resetParticle() {
|
||||||
|
Point3D snow = new Point3D();
|
||||||
|
snow.x = Util.random(window.x, window.w);
|
||||||
|
// создаём снежинки за экраном
|
||||||
|
snow.y = Util.random(window.y, window.h);
|
||||||
|
snow.z = zPosition;
|
||||||
|
return snow;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void update() {
|
||||||
|
for (int i = 0; i < particles.length; i++) {
|
||||||
|
particles[i].x = applyWind(particles[i].x); // ветер
|
||||||
|
particles[i].x += Util.random(-1+Util.sign(wind), 1+Util.sign(wind)); // прочие параметры
|
||||||
|
particles[i].y = particles[i].y + (speed / particles[i].z) + 0.981f; // скорость + притяжение
|
||||||
|
if (particles[i].y > window.h) {
|
||||||
|
if (wind > 0) particles[i].x = Util.random(window.x-wind*10, window.w);
|
||||||
|
else if (wind < 0) particles[i].x = Util.random(window.x, window.w-wind*10);
|
||||||
|
else particles[i].x = Util.random(window.x, window.w);
|
||||||
|
particles[i].y = window.y - Util.random(0, 10);
|
||||||
|
} else if (particles[i].x > window.w) {
|
||||||
|
if (wind > 0) particles[i].x = -Util.random(0, 10);
|
||||||
|
} else if (particles[i].x < window.x) {
|
||||||
|
if (wind < 0) particles[i].x = window.w+Util.random(0, 10);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void draw(Graphics g) {
|
||||||
|
g.setColor(Util.colorFromBrightness(255 - (int)((zPosition-1) * 12.7f)));
|
||||||
|
for (int i = 0; i < particles.length; i++) {
|
||||||
|
int x = (int) particles[i].x;
|
||||||
|
int y = (int) particles[i].y;
|
||||||
|
if (zPosition > 6) g.drawLine(x, y, x, y);
|
||||||
|
else {
|
||||||
|
int radius = (int) (8 - zPosition);
|
||||||
|
drawSnow(g, x, y, radius);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private float applyWind(float x) {
|
||||||
|
return (x + wind/5f);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void drawSnow(Graphics g, int x, int y, int radius) {
|
||||||
|
if (wind != 0) {
|
||||||
|
stAngle = stAngle + Util.sign(wind) * 0.0004f*(speed+Math.abs(wind));
|
||||||
|
if (Math.abs(stAngle) > 90) stAngle = Util.sign(wind);
|
||||||
|
}
|
||||||
|
for (float i = stAngle/2; i <= 180; i += 45) {
|
||||||
|
int cos = (int) (Math.cos(i)*radius);
|
||||||
|
int sin = (int) (Math.sin(i)*radius);
|
||||||
|
g.drawLine(x-cos, y-sin, x+cos, y+sin);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
37
src/Util.java
Normal file
37
src/Util.java
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
|
||||||
|
import java.util.Random;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* aNNiMON 2011
|
||||||
|
* For more info visit http://annimon.com/
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author aNNiMON
|
||||||
|
*/
|
||||||
|
public class Util {
|
||||||
|
|
||||||
|
private static final Random rnd = new Random();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Получить цвет ARGB из яркости. Оттенки серого.
|
||||||
|
* @param value яркость
|
||||||
|
* @return ARGB цвет
|
||||||
|
*/
|
||||||
|
public static int colorFromBrightness(int value) {
|
||||||
|
return 0xFF000000 | (value << 16) | (value << 8) | (value);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Получить случайное float значение в промежутке (from; to) */
|
||||||
|
public static float random(int from, int to) {
|
||||||
|
return rnd.nextInt(to-from)+from+rnd.nextFloat();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Возвращает знак числа */
|
||||||
|
public static int sign(int number) {
|
||||||
|
if (number > 0) return 1;
|
||||||
|
else if (number < 0) return -1;
|
||||||
|
else return 0;
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user