void fronthandler(measure_t when, action_t action, Object *obj, void *data) { if (action == PASS_AFTER) { playSound(resourcetable[obj->resource()]); removeSprite(obj); } else if (action == PASS_BEFORE) { addSprite(obj); } } void rearhandler(measure_t when, action_t action, Object *obj, void *data) { if (action == PASS_BEFORE) { addSprite(obj); } else if (action == PASS_AFTER) { removeSprite(obj); } } Pointer front(player, 0.0f), rear(player, 1.0f); time_t time = getTicks(); front.addHandler(BMSNoteObject::group, &fronthandler, data); rear.addHandler(BMSNoteObject::group, &rearhandler, data); while (true) { time_t newtime = getTicks(); timediff_t delta = newtime - time; time = newtime; front.advance(delta); rear.advance(delta); for (Player::iterator it = front.begin(); it != rear.end(); ++it) { showSprite(*it); // or should use addSprite/removeSprite instead? } flushSprite(); }