diff options
Diffstat (limited to 'examples')
-rw-r--r-- | examples/particle_system/main.cpp | 89 |
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(); |