void handle_tap(AccelAxisType axis, int32_t direction) { static BatteryChargeState chargeState; int i, s; if (batteryStatus && splashEnded && !animRunning) { if (animation_is_scheduled(anim)) { animation_unschedule(anim); } animRunning = true; chargeState = battery_state_service_peek(); s = chargeState.charge_percent; for (i=0; i<NUMSLOTS; i++) { slot[i].prevDigit = slot[i].curDigit; } slot[4].curDigit = 'B' - '0'; slot[5].curDigit = 'A' - '0'; slot[6].curDigit = 'T' - '0'; slot[7].curDigit = SPACE_D; slot[8].curDigit = (s==100)?1:SPACE_D; slot[9].curDigit = (s<100)?s/10:0; slot[10].curDigit = (s<100)?s/100:0; slot[11].curDigit = PERCENT; createAnim(); animation_schedule(anim); if (timer==NULL) timer= app_timer_register(BATTERYDELAY, handle_timer, NULL); } }
/** * @fn void AnimationManager::addAnim(std::shared_ptr<Animation> animation, const char filename[], std::vector< sf::Rect<int> > rects, const char name[]) * * @brief Adds an animation. * * @param animation The animation. * @param filename Filename of the file. * @param rects The rectangles. * @param name The name. */ void AnimationManager::addAnim(std::shared_ptr<Animation> animation, const char filename[], std::vector< sf::Rect<int> > rects, const char name[]) { //Convertion const char to string std::string stringFilename( filename, strlen(filename)); std::string stringName( name, strlen(name)); std::shared_ptr<Anim> anim = createAnim(stringFilename, rects, stringName); animation->addAnim(name, anim); }
void handle_init() { int i; srand(time(NULL)); initColors(); readConfig(); swapDigitShapes(); app_message_init(); initSplash(); window = window_create(); if (invertStatus) { window_set_background_color(window, GColorWhite); } else { window_set_background_color(window, GColorBlack); } window_stack_push(window, true); rootLayer = window_get_root_layer(window); mainLayer = layer_create(layer_get_bounds(rootLayer)); layer_add_child(rootLayer, mainLayer); layer_set_update_proc(mainLayer, updateMainLayer); for (i=0; i<NUMSLOTS; i++) { initSlot(i, mainLayer); } initDigitCorners(); animImpl.setup = NULL; animImpl.update = animateDigits; #ifdef PBL_PLATFORM_APLITE animImpl.teardown = destroyAnim; #else animImpl.teardown = NULL; #endif createAnim(); timer = app_timer_register(STARTDELAY, handle_timer, NULL); tick_timer_service_subscribe(MINUTE_UNIT, handle_tick); accel_tap_service_subscribe(handle_tap); lastBluetoothStatus = bluetooth_connection_service_peek(); bluetooth_connection_service_subscribe(handle_bluetooth); }
CTextRich *TuiManager::createTextRich(float tag, const char *text, int maxLen, float x, float y, float w, float h, float rotation, int isUseFrame){ CTextRich *pTextRich = CTextRich::create(); pTextRich->setMaxLineLength(maxLen); char* buf = new char[string(text).size() + 1]; memcpy(buf, text, string(text).size() + 1); xml_document<> doc; doc.parse<0>(buf); for (xml_node<char> *item = doc.first_node("e"); item != NULL; item = item->next_sibling()){ if (strcmp(item->first_attribute("type")->value(), kTuiControlLabel) == 0){ //label const char *text = item->first_attribute("text")->value(); float textSize = 22; const char *fontName = ""; int r = 255, g = 255, b = 255; if (item->first_attribute("size")) textSize = atof(item->first_attribute("size")->value()); if (item->first_attribute("font")) fontName = item->first_attribute("font")->value(); if (item->first_attribute("r")) r = atoi(item->first_attribute("r")->value()); if (item->first_attribute("g")) g = atoi(item->first_attribute("g")->value()); if (item->first_attribute("b")) b = atoi(item->first_attribute("b")->value()); pTextRich->insertElement(TuiUtil::replace_all(text, "\\n", "\n").c_str(), fontName, textSize, Color3B(r, g, b)); }else if (strcmp(item->first_attribute("type")->value(), kTuiControlImage) == 0){//image const char *imgSrc = item->first_attribute("src")->value(); int len = atoi(item->first_attribute("len")->value()); if (isUseFrame){ pTextRich->insertElement(CImageView::createWithSpriteFrameName(imgSrc), len); }else{ pTextRich->insertElement(CImageView::create(imgSrc), len); } }else if (strcmp(item->first_attribute("type")->value(), kTuiControlAnim) == 0){//anim const char *name = item->first_attribute("name")->value(); const char *plist = item->first_attribute("src")->value(); int len = atoi(item->first_attribute("len")->value()); Sprite *pAnim = createAnim(0, name, plist, 0, 0, 0); pTextRich->insertElement(pAnim, len); } } delete[] buf; pTextRich->reloadData(); pTextRich->setAnchorPoint(Vec2(0, 1)); pTextRich->setRotation(rotation); pTextRich->setPosition(Vec2(x, -y)); pTextRich->setTag(tag); return pTextRich; }
bool CGIFImage:: read(CFile *file, CGenImage *image) { CGIFAnim *image_anim = createAnim(file, image); if (image_anim->begin() != image_anim->end()) { CGIFFrame *frame = *(image_anim->begin()); CGenImage *ptr = frame->getImage(); image->assign(*ptr); } delete image_anim; return true; }
bool CImageGIF:: read(CFile *file, CImagePtr &image) { CImageAnim *image_anim = createAnim(file); if (image_anim->begin() != image_anim->end()) { CImageFrame *frame = *(image_anim->begin()); CImagePtr ptr = frame->getImage(); image->replace(ptr); } delete image_anim; return true; }
void handle_bluetooth(bool connected) { int i; if (lastBluetoothStatus == connected) { return; } else { lastBluetoothStatus = connected; if (bluetoothStatus && splashEnded && !animRunning) { if (animation_is_scheduled(anim)) { animation_unschedule(anim); } animRunning = true; for (i=0; i<NUMSLOTS; i++) { slot[i].prevDigit = slot[i].curDigit; } slot[0].curDigit = 'B' - '0'; slot[1].curDigit = 'T' - '0'; if (connected) { slot[2].curDigit = 'O' - '0'; slot[3].curDigit = 'K' - '0'; slot[4].curDigit = SPACE_D; slot[5].curDigit = SPACE_D; slot[6].curDigit = SPACE_D; slot[7].curDigit = SPACE_D; slot[8].curDigit = SPACE_D; slot[9].curDigit = SPACE_D; slot[10].curDigit = SPACE_D; slot[11].curDigit = SPACE_D; vibes_double_pulse(); } else { static const uint32_t segments[] = {80, 30, 80, 30, 80}; VibePattern pat = { .durations = segments, .num_segments = ARRAY_LENGTH(segments), }; slot[2].curDigit = SPACE_L; slot[3].curDigit = SPACE_R; slot[4].curDigit = SPACE_D; slot[5].curDigit = 'F' - '0'; slot[6].curDigit = 'A' - '0'; slot[7].curDigit = 'I' - '0'; slot[8].curDigit = 'L' - '0'; slot[9].curDigit = 'E' - '0'; slot[10].curDigit = 'D' - '0'; slot[11].curDigit = SPACE_D; vibes_enqueue_custom_pattern(pat); } createAnim(); animation_schedule(anim); if (timer==NULL) timer=app_timer_register(BATTERYDELAY, handle_timer, NULL); } } }
void handle_tick(struct tm *now, TimeUnits units_changed) { int h, m; int D, M; int i; int wd = 0; int Y = 0; // //APP_LOG(APP_LOG_LEVEL_DEBUG, "handle_tick: start"); // if (splashEnded && !animation_is_scheduled(anim)) { // //APP_LOG(APP_LOG_LEVEL_DEBUG, "handle_tick: setting digits"); // h = now->tm_hour; m = now->tm_min; D = now->tm_mday; M = now->tm_mon+1; if (showWeekday) { wd = now->tm_wday; } else { Y = now->tm_year%100; } if (!clock_is_24h_style()) { h = h%12; if (h == 0) { h = 12; } } for (i=0; i<NUMSLOTS; i++) { slot[i].prevDigit = slot[i].curDigit; } // Hour slots slot[0].curDigit = h/10; slot[1].curDigit = h%10; slot[2].curDigit = m/10; slot[3].curDigit = m%10; slot[6].curDigit = SPACE_D; slot[9].curDigit = SPACE_D; // Date slots if (showWeekday && USDate) { slot[4].curDigit = weekDay[curLang][wd][0] - '0'; slot[5].curDigit = weekDay[curLang][wd][1] - '0'; slot[7].curDigit = M/10; slot[8].curDigit = M%10; slot[10].curDigit = D/10; slot[11].curDigit = D%10; } else if (showWeekday && !USDate) { slot[4].curDigit = weekDay[curLang][wd][0] - '0'; slot[5].curDigit = weekDay[curLang][wd][1] - '0'; slot[7].curDigit = D/10; slot[8].curDigit = D%10; slot[10].curDigit = M/10; slot[11].curDigit = M%10; } else if (!showWeekday && USDate) { slot[4].curDigit = M/10; slot[5].curDigit = M%10; slot[7].curDigit = D/10; slot[8].curDigit = D%10; slot[10].curDigit = Y/10; slot[11].curDigit = Y%10; } else { slot[4].curDigit = D/10; slot[5].curDigit = D%10; slot[7].curDigit = M/10; slot[8].curDigit = M%10; slot[10].curDigit = Y/10; slot[11].curDigit = Y%10; } // //APP_LOG(APP_LOG_LEVEL_DEBUG, "handle_tick: rescheduling anim"); // createAnim(); animation_schedule(anim); } // //APP_LOG(APP_LOG_LEVEL_DEBUG, "handle_tick: end"); // }
void TuiManager::parseControl(Node* container,xml_node<char> *item) { int tag = atof(item->first_attribute("tag")->value()); int x = atof(item->first_attribute("x")->value()); int y = atof(item->first_attribute("y")->value()); int w = atoi(item->first_attribute("width")->value()); int h = atoi(item->first_attribute("height")->value()); int rotation = atof(item->first_attribute("rotation")->value()); if(strcmp(item->first_attribute("type")->value(), kTuiContainerPanel) == 0){//panel CWidgetWindow* pPanel = createPanel(tag,x,y,w,h,rotation); container->addChild(pPanel); //recursive for( xml_node<char> *iitem = item->first_node( kTuiNodeControl );iitem != NULL; iitem = iitem->next_sibling()){ parseControl(pPanel,iitem); } }else if (strcmp(item->first_attribute("type")->value(), kTuiControlCell) == 0){//cell //recursive for (xml_node<char> *iitem = item->first_node(kTuiNodeControl); iitem != NULL; iitem = iitem->next_sibling()){ parseControl(container, iitem); } }else if(strcmp(item->first_attribute("type")->value(),kTuiControlImage) == 0){//image const char* file = item->first_attribute("image")->value(); float scaleX = atof(item->first_attribute("scaleX")->value()); float scaleY = atof(item->first_attribute("scaleY")->value()); CImageView *pImg = createImage(tag, file, scaleX, scaleY, x, y, rotation); container->addChild(pImg); }else if(strcmp(item->first_attribute("type")->value(),kTuiControlImage9) == 0){//image9 const char* file = item->first_attribute("image")->value(); float w = atof(item->first_attribute("width")->value()); float h = atof(item->first_attribute("height")->value()); float up = atof(item->first_attribute("up")->value()); float down = atof(item->first_attribute("down")->value()); float left = atof(item->first_attribute("left")->value()); float right = atof(item->first_attribute("right")->value()); CImageViewScale9 *pImg = createImage9(tag,file,x,y,w,h,up,down,left,right,rotation); container->addChild(pImg); }else if(strcmp(item->first_attribute("type")->value(),kTuiControlButton) == 0){//button const char* normal = item->first_attribute("normal")->value(); const char* select = item->first_attribute("select")->value(); const char* disable = item->first_attribute("disable")->value(); float w = atof(item->first_attribute("width")->value()); float h = atof(item->first_attribute("height")->value()); CButton *pBtn = createBtn(tag,normal,select,disable,x,y,w,h,rotation); container->addChild(pBtn); }else if(strcmp(item->first_attribute("type")->value(),kTuiControlToggleView) == 0){//toggleView const char* normal = item->first_attribute("normal")->value(); const char* select = item->first_attribute("select")->value(); const char* disable = item->first_attribute("disable")->value(); float exclusion = atof(item->first_attribute("exclusion")->value()); CToggleView* toggle = createToggleView(tag,exclusion,normal,select,disable,x,y,rotation); container->addChild(toggle); }else if(strcmp(item->first_attribute("type")->value(),kTuiControlSlider) == 0){//slider const char* bg = item->first_attribute("bg")->value(); const char* progress = item->first_attribute("progress")->value(); const char* thumb = item->first_attribute("thumb")->value(); CSlider *pSlider = createSlider(tag,bg,progress,thumb,x,y,rotation); container->addChild(pSlider); }else if(strcmp(item->first_attribute("type")->value(),kTuiControlProgress) == 0){//progress const char* bg = item->first_attribute("bg")->value(); const char* progress = item->first_attribute("progress")->value(); CProgressBar *pProgress = createProgress(tag,bg,progress,x,y,rotation); container->addChild(pProgress); }else if(strcmp(item->first_attribute("type")->value(),kTuiControlLabel) == 0){//label float size = atof(item->first_attribute("textSize")->value()); int alignment = atoi(item->first_attribute("alignment")->value()); const char* text = item->first_attribute("text")->value(); const char* font = item->first_attribute("textFont")->value(); float w = atof(item->first_attribute("width")->value()); float h = atof(item->first_attribute("height")->value()); int r = atoi(item->first_attribute("red")->value()); int g = atoi(item->first_attribute("green")->value()); int b = atoi(item->first_attribute("blue")->value()); int r2 = atoi(item->first_attribute("strokeRed")->value()); int g2 = atoi(item->first_attribute("strokeGreen")->value()); int b2 = atoi(item->first_attribute("strokeBlue")->value()); int strokeSize = atoi(item->first_attribute("strokeSize")->value()); int shadowDistance = atoi(item->first_attribute("shadowDistance")->value()); int shadowBlur = atoi(item->first_attribute("shadowBlur")->value()); CLabel *pLabel = createLabel(tag, text, font, alignment, size, r, g, b, x, y, w, h, r2,g2,b2,strokeSize,shadowDistance,shadowBlur,rotation); container->addChild(pLabel); }else if(strcmp(item->first_attribute("type")->value(),kTuiControlLabelAtlas) == 0){//labelAtlas const char* imgPath = item->first_attribute("image")->value(); float w = atof(item->first_attribute("width")->value()); float h = atof(item->first_attribute("height")->value()); CLabelAtlas *pLabAtlas = createLabelAtlas(tag,imgPath,x,y,w,h,rotation); container->addChild(pLabAtlas); }else if(strcmp(item->first_attribute("type")->value(),kTuiControlArmature) == 0){//armature const char* xml = item->first_attribute("xml")->value(); const char* png = item->first_attribute("png")->value(); const char* plist = item->first_attribute("plist")->value(); const char* name = item->first_attribute("name")->value(); Armature *pArmature = createArmature(tag,name,png,plist,xml,x,y,rotation); container->addChild(pArmature); }else if(strcmp(item->first_attribute("type")->value(),kTuiControlAnim) == 0){//animation const char* png = item->first_attribute("png")->value(); const char* plist = item->first_attribute("plist")->value(); const char* name = item->first_attribute("name")->value(); Sprite *pSprite = createAnim(tag,name,png,plist,x,y,rotation); container->addChild(pSprite); }else if(strcmp(item->first_attribute("type")->value(),kTuiControlControl) == 0){//controlView const char* baseboard = item->first_attribute("baseboard")->value(); const char* joystick = item->first_attribute("joystick")->value(); CControlView *pControl = createControl(tag,baseboard,joystick,x,y,rotation); container->addChild(pControl); }else if (strcmp(item->first_attribute("type")->value(), kTuiContainerScroll) == 0){//scrollView float w = atof(item->first_attribute("width")->value()); float h = atof(item->first_attribute("height")->value()); int direction = atof(item->first_attribute("direction")->value()); int innerWidth = atoi(item->first_attribute("innerWidth")->value()); int innerHeight = atoi(item->first_attribute("innerHeight")->value()); CScrollView *pView = createScrollView(tag, direction, innerWidth, innerHeight, x, y, w, h, rotation); container->addChild(pView); //recursive for (xml_node<char> *iitem = item->first_node(kTuiNodeControl); iitem != NULL; iitem = iitem->next_sibling()){ parseControl(pView->getContainer(), iitem); } }else if (strcmp(item->first_attribute("type")->value(), kTuiContainerLayout) == 0){//layout float w = atof(item->first_attribute("width")->value()); float h = atof(item->first_attribute("height")->value()); CLayout *pLayout = createLayout(tag, x, y, w, h, rotation); container->addChild(pLayout); //recursive for (xml_node<char> *iitem = item->first_node(kTuiNodeControl); iitem != NULL; iitem = iitem->next_sibling()){ parseControl(pLayout, iitem); } Vector<Node*> vet = pLayout->getChildren(); for (Node *pChild : vet){//Offset coordinates Because CLayout zero point in the lower left corner pChild->setPosition(pChild->getPosition() + Point(w / 2, h / 2)); } }else if(strcmp(item->first_attribute("type")->value(),kTuiControlListView) == 0){//listView float w = atof(item->first_attribute("width")->value()); float h = atof(item->first_attribute("height")->value()); const char* img = item->first_attribute("image")->value(); float num = atof(item->first_attribute("num")->value()); CListView* pList = createListView(tag,img,x,y,w,h,rotation); container->addChild(pList); for(int i=0; i<num;i++){//add item xml_node<char> *iitem = item->first_node( kTuiNodeControl ); w = atof(iitem->first_attribute("width")->value()); h = atof(iitem->first_attribute("height")->value()); CLayout *pLayout = createLayout(i,0,0,w,h,rotation); for( xml_node<char> *iiitem = iitem->first_node( kTuiNodeControl );iiitem!=NULL; iiitem = iiitem->next_sibling()){ parseControl(pLayout,iiitem); } Vector<Node*> vet = pLayout->getChildren(); for(Node *pChild : vet){//Offset coordinates Because CLayout zero point in the lower left corner if(pChild->getTag() > 0) pChild->setPosition(pChild->getPosition()+Point(w/2,h/2)); } pList->insertNodeAtLast(pLayout); } pList->reloadData(); }else if(strcmp(item->first_attribute("type")->value(),kTuiControlPageView) == 0){//pageView float w = atof(item->first_attribute("width")->value()); float h = atof(item->first_attribute("height")->value()); float num = atoi(item->first_attribute("num")->value()); int dir = atoi(item->first_attribute("direction")->value()); const char* img = item->first_attribute("image")->value(); CPageView *pPageView = createPageView(tag, img, dir, num, x, y, w, h, rotation); container->addChild(pPageView); }else if(strcmp(item->first_attribute("type")->value(),kTuiControlCheckBox) == 0){//checkBox const char* normal1 = item->first_attribute("normal1")->value(); const char* normal2 = item->first_attribute("normal2")->value(); const char* select1 = item->first_attribute("select1")->value(); const char* select2 = item->first_attribute("select2")->value(); const char* disable1 = item->first_attribute("disable1")->value(); const char* disable2 = item->first_attribute("disable2")->value(); CCheckBox *pCheckBox = createCheckBox(tag,normal1,normal2,select1,select2,disable1,disable2,x,y,rotation); container->addChild(pCheckBox); }else if(strcmp(item->first_attribute("type")->value(),kTuiControlArmatureBtn) == 0){//ArmatureBtn const char* png = item->first_attribute("png")->value(); const char* plist = item->first_attribute("plist")->value(); const char* name = item->first_attribute("name")->value(); const char* xml = item->first_attribute("xml")->value(); ArmatureBtn *pArmBtn = createArmatureBtn(tag,name,png,plist,xml,x,y,rotation); container->addChild(pArmBtn); }else if(strcmp(item->first_attribute("type")->value(),kTuiControlNumbericStepper) == 0){//NumbericStepper const char* lnormal = item->first_attribute("lnormal")->value(); const char* rnormal = item->first_attribute("rnormal")->value(); const char* lselect = item->first_attribute("lselect")->value(); const char* rselect = item->first_attribute("rselect")->value(); const char* ldisable = item->first_attribute("ldisable")->value(); const char* rdisable = item->first_attribute("rdisable")->value(); const char* stepBg = item->first_attribute("stepBg")->value(); NumericStepper *pNumStep = createNumStep(tag,lnormal,lselect,ldisable,rnormal,rselect,rdisable,stepBg,x,y,rotation); container->addChild(pNumStep); }else if(strcmp(item->first_attribute("type")->value(),kTuiControlPaticle) == 0){//Paticle const char* plist = item->first_attribute("plist")->value(); ParticleSystem *pPartical = createParticle(tag,plist,x,y); container->addChild(pPartical); }else if (strcmp(item->first_attribute("type")->value(), kTuiControlTable) == 0){//TableView float w = atof(item->first_attribute("width")->value()); float h = atof(item->first_attribute("height")->value()); float num = atoi(item->first_attribute("num")->value()); int dir = atoi(item->first_attribute("direction")->value()); int cellWidth = atoi(item->first_attribute("cellWidth")->value()); int cellHeight = atoi(item->first_attribute("cellHeight")->value()); const char* img = item->first_attribute("image")->value(); CTableView *pView = createTableView(tag, img, dir, num, cellWidth, cellHeight, x, y, w, h, rotation); container->addChild(pView); }else if (strcmp(item->first_attribute("type")->value(), kTuiControlGridView) == 0){//GridView float w = atof(item->first_attribute("width")->value()); float h = atof(item->first_attribute("height")->value()); int cellWidth = atoi(item->first_attribute("cellWidth")->value()); int cellHeight = atoi(item->first_attribute("cellHeight")->value()); int column = atoi(item->first_attribute("column")->value()); int num = atoi(item->first_attribute("num")->value()); const char* img = item->first_attribute("image")->value(); CGridView *pView = createGridView(tag, img, column, num, cellWidth, cellHeight, x, y, w, h, rotation); container->addChild(pView); }else if (strcmp(item->first_attribute("type")->value(), kTuiControlGridPageView) == 0){//GridPageView float w = atof(item->first_attribute("width")->value()); float h = atof(item->first_attribute("height")->value()); int cellWidth = atoi(item->first_attribute("cellWidth")->value()); int cellHeight = atoi(item->first_attribute("cellHeight")->value()); int column = atoi(item->first_attribute("column")->value()); int row = atoi(item->first_attribute("row")->value()); int num = atoi(item->first_attribute("num")->value()); int dir = atoi(item->first_attribute("direction")->value()); const char* img = item->first_attribute("image")->value(); CGridPageView *pView = createGridPageView(tag, img, dir, column, row, num, cellWidth, cellHeight, x, y, w, h, rotation); container->addChild(pView); }else if(strcmp(item->first_attribute("type")->value(),kTuiControlEditBox) == 0){//EditBox float w = atof(item->first_attribute("width")->value()); float h = atof(item->first_attribute("height")->value()); const char* img = item->first_attribute("image")->value(); int inputMode = atoi(item->first_attribute("inputMode")->value()); int inputFlag = atoi(item->first_attribute("inputFlag")->value()); EditBox *pEdit = createEditBox(tag, img, inputMode, inputFlag, x, y, w, h, rotation); container->addChild(pEdit); }else if (strcmp(item->first_attribute("type")->value(), kTuiControlMovieView) == 0){//MovieView const char* png = item->first_attribute("png")->value(); const char* plist = item->first_attribute("plist")->value(); const char* json = item->first_attribute("json")->value(); MovieView *pMovieView = createMovieView(tag, json, plist, png, x, y, rotation); container->addChild(pMovieView); }else if (strcmp(item->first_attribute("type")->value(), kTuiContainerCircleMenu) == 0){//CircleMenu float w = atof(item->first_attribute("width")->value()); float h = atof(item->first_attribute("height")->value()); CircleMenu *pMenu = createCircleMenu(tag, x, y, w, h, rotation); container->addChild(pMenu); //recursive for (xml_node<char> *iitem = item->first_node(kTuiNodeControl); iitem != NULL; iitem = iitem->next_sibling()){ parseControl(pMenu, iitem); } pMenu->reloadData(); } }
/** * @fn void AnimationManager::addAnim(std::shared_ptr<Animation> animation, std::string& filename, std::vector< sf::Rect<int> > rects, std::string& name) * * @brief Adds an animation. * * @param animation The animation. * @param [in,out] filename Filename of the file. * @param rects The rectangles. * @param [in,out] name The name. */ void AnimationManager::addAnim(std::shared_ptr<Animation> animation, std::string& filename, std::vector< sf::Rect<int> > rects, std::string& name) { std::shared_ptr<Anim> anim = createAnim(filename, rects, name); animation->addAnim(name, anim); }