int DemoShooting::run(clan::DisplayWindow &window) { clan::SlotContainer cc; window.set_title("LinearParticle Example - Shooting "); cc.connect(window.sig_window_close(), clan::bind_member(this, &DemoShooting::on_window_close)); clan::Canvas canvas(window); cc.connect(window.get_ic().get_keyboard().sig_key_up(), clan::bind_member(this, &DemoShooting::on_key_up)); // initialize LinearParticle L_ParticleSystem::init(); // create surface to be used for particle and set the alignment clan::Sprite surface(canvas,"Resources/star.png"); surface.set_alignment(clan::origin_center); motion_ctrl.set_1d_acceleration(-0.0003); L_Particle particle(&surface,3000); particle.set_color(L_Color(255,110,60,255)); particle.coloring2(L_Color(255,110,60,255),L_Color(0,200,100,255),0.6); particle.rotating2(L_2PI); particle.set_motion_controller(&motion_ctrl); L_Vector shooting_vector; shooting_vector.set2( 0.4, L_DEGREE_TO_RADIAN(-90) ); effect = new L_ShootingEffect(460,360,shooting_vector,16,4); effect->add(&particle); effect->set_width_interval(100); effect->set_angle_interval(L_DEGREE_TO_RADIAN(45)); effect->set_life_distortion(600); effect->set_size_distortion(0.4f); effect->initialize(); char str[32]; quit = false; show_menu = true; clan::Font font(canvas, "Arial", 16 ); FramerateCounter frameratecounter; clan::ubyte64 last_time = clan::System::get_time(); while(!quit) { canvas.clear(); clan::ubyte64 current_time = clan::System::get_time(); int time_run = current_time - last_time; last_time = current_time; /* the maximum time step is set to 50milisecs to avoid artifacts and errors caused by low frame rate to be less noticeable. */ while( time_run > 50 ) { run_a_step(50); time_run -= 50; } if( time_run > 0 ) run_a_step(time_run); L_DrawParticle(canvas, effect); if( show_menu ) { frameratecounter.show_fps(canvas, font); sprintf(str,"#Particle : %d", effect->get_particle_num()); font.draw_text(canvas,10,30,str); font.draw_text(canvas,10,425,"F1 : hide/show menu"); font.draw_text(canvas,10,440,"Space : trigger random sleep"); } window.flip(0); // Set to "1" to lock to screen refresh rate frameratecounter.frame_shown(); clan::KeepAlive::process(0); } delete effect; // deinitialize LinearParticle L_ParticleSystem::deinit(); return 0; }
int DemoSimple::run(CL_DisplayWindow &window) { quit = false; // Set the window window.set_title("LinearParticle Example - Simple "); // Connect the Window close event CL_Slot slot_quit = window.sig_window_close().connect(this, &DemoSimple::on_window_close); // Connect a keyboard handler to on_key_up() CL_Slot slot_input_up = (window.get_ic().get_keyboard()).sig_key_up().connect(this, &DemoSimple::on_input_up); // Get the graphic context CL_GraphicContext gc = window.get_gc(); // initialize LinearParticle L_ParticleSystem::init(); // create surface to be used for particle and set the alignment CL_Sprite surface(gc,"Resources/light16p.png"); surface.set_alignment(origin_center); // create a sample of particle with life of 5000 L_Particle particle(&surface,5000); // create dropping effect with period of 16 L_DroppingEffect dropper(0,0,16); // add the particle to dropper effect dropper.add(&particle); // initialize particle effect dropper.initialize(); float x_pos = 320; float y_pos = 240; float x_vel = 3.0f; float y_vel = 3.0f; CL_Font font(gc, "tahoma", 16 ); FramerateCounter frameratecounter; // Run until someone presses escape while (!quit) { gc.clear(); x_pos += x_vel; y_pos += y_vel; if( x_pos > 640 || x_pos < 0 ) x_vel = -x_vel; if( y_pos > 480 || y_pos < 0 ) y_vel = -y_vel; dropper.set_position(x_pos, y_pos); dropper.trigger(); /* pass frame time to L_ParticleEffect::run(int) for time based system, a constant number would be a reference time unit for frame based system. */ dropper.run(16); // draw dropping effect L_DrawParticle(gc,dropper); frameratecounter.show_fps(gc, font); window.flip(0); // Set to "1" to lock to screen refresh rate frameratecounter.frame_shown(); CL_KeepAlive::process(0); } // deinitialize LinearParticle L_ParticleSystem::deinit(); return 0; }
int DemoMSmall::run(clan::DisplayWindow &window) { clan::SlotContainer cc; window.set_title("LinearParticle Example - MSmall "); cc.connect(window.sig_window_close(), clan::bind_member(this, &DemoMSmall::on_window_close)); clan::Canvas canvas(window); cc.connect(window.get_ic().get_keyboard().sig_key_up(), clan::bind_member(this, &DemoMSmall::on_key_up)); // initialize LinearParticle L_ParticleSystem::init(); // create surface to be used for particle and set the alignment clan::Sprite surface(canvas, "Resources/small.png"); surface.set_alignment(clan::origin_center); motion_ctrl.set_speed_limit(0.1); // set max speed of particle motion_ctrl.set_1d_acceleration(-0.0003); // set deceleration // create sample of particle L_Particle particle(&surface,2000); particle.set_color(L_Color(255,110,60,255)); particle.coloring2(L_Color(255,110,60,255),L_Color(0,200,100,255),0.6); particle.set_motion_controller(&motion_ctrl); // assign motion cotroller // create explosion effect effect = new L_ExplosionEffect(320,240,16,10,12,0.1); effect->add(&particle); // apply random life distortion for each emitted particle effect->set_life_distortion(700); effect->initialize(); char str[32]; quit = false; show_menu = true; clan::Font font(canvas, "Arial", 16 ); FramerateCounter frameratecounter; clan::ubyte64 last_time = clan::System::get_time(); clan::InputDevice &keyboard = window.get_ic().get_keyboard(); while(!quit) { canvas.clear(); static L_REAL x_pos = 320; static L_REAL y_pos = 240; L_REAL x_vel = 0; L_REAL y_vel = 0; if( keyboard.get_keycode(clan::keycode_up) ) y_vel = -0.2; else if( keyboard.get_keycode(clan::keycode_down)) y_vel = 0.2; if( keyboard.get_keycode(clan::keycode_left)) x_vel = -0.2; else if( keyboard.get_keycode(clan::keycode_right)) x_vel = 0.2; L_Vector vel; vel.set( x_vel, y_vel ); clan::ubyte64 current_time = clan::System::get_time(); int time_run = current_time - last_time; last_time = current_time; x_pos += x_vel*time_run; y_pos += y_vel*time_run; effect->trigger(); effect->set_velocity(vel); effect->run(time_run); effect->set_position(x_pos, y_pos); L_DrawParticle(canvas, effect); if( show_menu ) { frameratecounter.show_fps(canvas, font); sprintf(str,"#Particle : %d", effect->get_particle_num()); font.draw_text(canvas,10,30,str); font.draw_text(canvas,10,410,"F1 : hide/show menu"); font.draw_text(canvas,10,425,"Space : trigger random sleep"); font.draw_text(canvas,10,440,"Arrow keys : move the effect"); } window.flip(0); // Set to "1" to lock to screen refresh rate frameratecounter.frame_shown(); clan::KeepAlive::process(0); } delete effect; // deinitialize LinearParticle L_ParticleSystem::deinit(); return 0; }