aboutsummaryrefslogtreecommitdiff
path: root/examples
diff options
context:
space:
mode:
authorchai <chaifix@163.com>2018-11-18 22:32:55 +0800
committerchai <chaifix@163.com>2018-11-18 22:32:55 +0800
commitfc7b4579e49aaeecc81919e247e03f68bd5abfd4 (patch)
tree6547b8c7d3632591358267d06006eddc53216105 /examples
parent3905924fc35f92e5092576c3f6e8fc5db7588cde (diff)
*粒子系统
Diffstat (limited to 'examples')
-rw-r--r--examples/particle_system/main.cpp89
1 files changed, 53 insertions, 36 deletions
diff --git a/examples/particle_system/main.cpp b/examples/particle_system/main.cpp
index f37027b..0d2b0f4 100644
--- a/examples/particle_system/main.cpp
+++ b/examples/particle_system/main.cpp
@@ -5,52 +5,64 @@
using namespace std;
using namespace JinEngine::AI;
using namespace JinEngine::Game;
+using namespace JinEngine::Math;
using namespace JinEngine::Input;
using namespace JinEngine::Graphics;
+using namespace JinEngine::Graphics::Shaders;
using namespace JinEngine::Graphics::Particles;
using namespace JinEngine::Filesystem;
using namespace JinEngine::Time;
ParticleSystem* p;
-StateMachine sm;
Timer timer;
Timer::Handler* hnd;
+Texture* tex;
+Shader* shader;
+const char* shader_code = R"(
+#VERTEX_SHADER
+Vertex vert(Vertex v)
+{
+ return v;
+}
+#END_VERTEX_SHADER
+#FRAGMENT_SHADER
+Color frag(Color col, Texture tex, Vertex v)
+{
+ Color c = texel(tex, v.uv);
+ return c * col;
+}
+#END_FRAGMENT_SHADER
+)";
void onLoad()
{
- sm.addState("Run");
- sm.addState("Idle");
- sm.addState("Sleep");
- sm.addState("Jump");
- sm.addParametert("run");
- sm.addParameterb("idle");
- /*sm.addTransitionb("Empty", "Idle", "run", StateMachine::BOOL_IS, true);
- sm.addTransitionb("Idle", "Run", "run", StateMachine::BOOL_IS, false);
- */
- sm.addTransition("Run", "Idle", StateMachine::Conditions().andf());
- sm.addTransitiont("Empty", "Idle", "run");
- sm.addTransitiont("Idle", "Run", "run");
- sm.setEnterListener([](const string& state, void* p) {
- cout << "Enter: " << state << endl;
- });
- sm.addEnterListener("Run", [](void* p) {
- cout << "A Run state enter callback" << endl;
- });
- sm.addTranslateListener("Idle", "Run", [](void* p) {
- cout << "From Idle to Run" << endl;
- });
- Window::get()->show();
- hnd = timer.every(500, [](void*) {
- cout << sm.getCurrentState() << endl;
- }, NULL);
- timer.after(2500, [](void*) {
- //sm.setParameterb("run", true);
- sm.setParametert("run");
- //timer.cancel(hnd);
- }, NULL);
- timer.after(5000, [](void*) {
- sm.setParametert("run");
- //sm.setParameterb("run", false);
- }, NULL);
+ tex = Texture::createTexture("smoke.png");
+ shader = Shader::createShader(shader_code);
+ ParticleSystemDef def;
+ def.maxParticleCount = 30;
+
+ def.emitterDef.emitRateDef.rate.rate = 0.5f;
+ def.emitterDef.forceDef.force.force = 20.f;
+ def.emitterDef.positionDef.position.position = Vector2<float>(200, 200);
+
+ def.emitterDef.directionDef.enableRandom = true;
+ def.emitterDef.directionDef.direction.random.floor = 0;
+ def.emitterDef.directionDef.direction.random.ceil = 3.14 * 2;
+
+ def.particleDef.colorOverTimeDef.enable = true;
+ def.particleDef.colorOverTimeDef.colorStart = Color(255, 255, 255, 255);
+ def.particleDef.colorOverTimeDef.colorEnd = Color(255, 255, 255, 0);
+
+ def.particleDef.angularSpeedDef.enableRandom = true;
+ def.particleDef.angularSpeedDef.angularSpeed.random.floor = 0.05;
+ def.particleDef.angularSpeedDef.angularSpeed.random.ceil = 1;
+
+ def.particleDef.sizeOverTimeDef.enable = true;
+ def.particleDef.sizeOverTimeDef.start = 1;
+ def.particleDef.sizeOverTimeDef.end = 3;
+
+ def.particleDef.lifeTimeDef.life.life = 5;
+ p = new ParticleSystem(def);
+ p->setGraphic(tex);
}
void onEvent(Event* e)
@@ -62,12 +74,16 @@ void onEvent(Event* e)
void onUpdate(int ms)
{
+ p->update(ms / 1000.f);
timer.update(ms);
- sm.update();
}
void onDraw()
{
+ shader->use();
+ p->render(50, 50);
+ //tex->render(10, 10);
+ shader->unuse();
}
int main(int argc, char* argv[])
@@ -93,6 +109,7 @@ int main(int argc, char* argv[])
wndSetting.resizable = false;
wndSetting.icon = ".";
wnd->init(&wndSetting);
+ wnd->show();
Application->run();