static void obj_deco_construct(GameObject* self, Vector2 pos, void* user_data) { SprHandle spr_handle = (SprHandle)user_data; Vector2 size = sprsheet_get_size_h(spr_handle); RectF dest = { pos.x, pos.y - size.y, pos.x + size.x, pos.y }; // Render RenderComponent* render = self->render; render->world_dest = dest; render->color = COLOR_RGBA(255, 255, 255, 255); render->anim_frame = MAX_UINT16; render->spr = spr_handle; switch(self->type){ case OBJ_FG_DECO_TYPE: render->layer = ground_layer; render->camera = 0; break; default: render->layer = bg_mushrooms_layer; render->camera = 1; break; } }
static void _gen_ground(void){ SprHandle spr; int advance = 0; static float ground_x = 0; while(ground_x < page_width) { char sym = mchains_next(ground_chain, &rnd); mchains_symbol_info(ground_chain, sym, &advance, &spr); Vector2 pos = vec2(fg_page_cursor + ground_x, v_height); if(spr) { advance = (uint) sprsheet_get_size_h(spr).x; // no collision for grass_start1 and grass_end2 if(sym == 'a' || sym == 'h'){ objects_create(&obj_fg_deco_desc, pos, (void*)spr); objects_create(&obj_fall_trigger_desc, vec2_add(pos,vec2(0.0f,127.0f)), (void*)advance); } else { objects_create(&obj_ground_desc, pos, (void*)spr); //water speed trigger if( sym == 'j' || sym == 'k' || sym == 'l' || sym == 'm' || sym == 'n' || sym == 'o'){ ObjSpeedTrigger* t = (ObjSpeedTrigger*)objects_create(&obj_speed_trigger_desc, pos, (void*)spr); t->drag_coef = 1.9f; } } } else { spr = empty_spr; if(sym == '_' || sym == '-' || sym == '='){ // Fall trigger objects_create(&obj_fall_trigger_desc, pos, (void*)advance); // Coin arc over gap if(!tutorial_level){ for(uint i = 0; i < 5; ++i) { float x = pos.x + advance * (-0.3f + i * 0.4f); int d = MIN(i, 4 - i); float y = v_height - 293.0f; if(d) y -= (d+1) * 25.0f; objects_create( &obj_powerup_desc, vec2(x, y), (void*)&coin_powerup ); } } } } placement_interval(vec2(pos.x,pos.x + advance),spr); ground_x += (float)advance; } ground_x -= page_width; }
static void obj_trampoline_construct(GameObject* self, Vector2 pos, void* user_data) { SprHandle spr_handle = (SprHandle)user_data; ObjTrampoline* trampoline = (ObjTrampoline*)self; Vector2 size = sprsheet_get_size_h(spr_handle); float width = size.x; float height = size.y; trampoline->oh = height; trampoline->h = height; trampoline->dh = 0.0f; trampoline->db = 0.0f; RectF collider = { pos.x - 50.0f, pos.y, pos.x + width + 50.0f, pos.y - height }; // Physics PhysicsComponent* physics = self->physics; physics->cd_obj = coldet_new_aabb(objects_cdworld, &collider, OBJ_TRAMPOLINE_TYPE, NULL); physics->inv_mass = 0.0f; physics->hit_callback = obj_trampoline_collide; // Render RenderComponent* render = self->render; render->world_dest = rectf( pos.x, pos.y - height, pos.x + width, pos.y ); render->layer = foreground_layer; render->anim_frame = MAX_UINT16; render->spr = spr_handle; render->update_pos = obj_trampoline_update_pos; render->became_invisible = obj_trampoline_became_invisible; // for rising up animation physics->cd_obj->pos.y += height/2.0f + 15.0f; render->world_dest.bottom += height/2.0f + 15.0f; }
static void obj_mushroom_construct(GameObject* self, Vector2 pos, void* user_data) { SprHandle spr_handle = (SprHandle)user_data; ObjMushroom* mushroom = (ObjMushroom*)self; Vector2 size = sprsheet_get_size_h(spr_handle); float width = size.x; float height = size.y; mushroom->oh = height; mushroom->h = height; mushroom->dh = 0.0f; float adjust = 20.0f; // Take 10 pixel slice at the top as a collider geometry RectF collider = { pos.x + adjust, pos.y - height, pos.x + width - adjust, pos.y - height + 10.0f }; // Physics PhysicsComponent* physics = self->physics; physics->cd_obj = coldet_new_aabb(objects_cdworld, &collider, OBJ_MUSHROOM_TYPE, NULL); physics->inv_mass = 0.0f; physics->hit_callback = obj_mushroom_collide; // Render RenderComponent* render = self->render; render->world_dest = rectf( pos.x, pos.y - height, pos.x + width, pos.y ); render->layer = foreground_layer; render->anim_frame = MAX_UINT16; render->spr = spr_handle; render->update_pos = obj_mushroom_update_pos; render->became_invisible = obj_mushroom_became_invisible; }
static void _gen_mushrooms(void){ SprHandle spr; int advance = 0; static float fg_x = 0; while(fg_x < page_width) { char sym = mchains_next(fg_chain, &rnd); mchains_symbol_info(fg_chain, sym, &advance, &spr); Vector2 pos = vec2(fg_page_cursor + fg_x, v_height-128.0f); if(spr) advance = (int) sprsheet_get_size_h(spr).x; else if (!tutorial_level && coins > 0){ coins_cd = 2; Vector2 p = vec2(pos.x + advance / 2.0f, v_height-189.0f); SprHandle spr = sprsheet_get_handle(coin_powerup.spr); float width = sprsheet_get_size_h(spr).x; // checks if a token can be placed on the ground // (does not apply for air tokens elsewhere) if(placement_allowed(vec2(p.x,p.x+width),spr) && fg_x + advance / 2.0f < page_width){ objects_create(&obj_powerup_desc, p, (void*)&coin_powerup); coins--; } } if(spr && placement_allowed(vec2(pos.x,pos.x + advance), spr)) { if(sym == 'x'){ objects_create(&obj_cactus_desc, pos, (void*)spr); // placing bomb powerup after cactuses Vector2 p = vec2(pos.x + advance / 2.0f + 100.0f, v_height-189.0f); place_powerup(&obj_powerup_desc, p, ROCKET); } else { objects_create(&obj_mushroom_desc, pos, (void*)spr); // Placing coins/powerups on big shrooms if(!tutorial_level){ Vector2 size = sprsheet_get_size_h(spr); float width = size.x; float height = size.y; Vector2 p = vec2_add(pos, vec2(width/2.0f,-height - 50.0f)); if(sym == 'j'){ // Place rocket or a coin on top of mushroom if(!place_powerup(&obj_powerup_desc, p, BOMB)) objects_create(&obj_powerup_desc, p, (void*)&coin_powerup); } else if(sym == 'h'){ // Place shield or a coin on top of mushroom if(!place_powerup(&obj_powerup_desc, p, SHIELD)) objects_create(&obj_powerup_desc, p, (void*)&coin_powerup); } else if(sym == 'c'){ // placing trampoline powerup after certain mushroom Vector2 p = vec2(pos.x + advance / 2.0f + 200.0f, v_height-189.0f); place_powerup(&obj_powerup_desc, p, TRAMPOLINE); } else if(height >= 265.0f) objects_create(&obj_powerup_desc, p, (void*)&coin_powerup); } } } fg_x += (float)advance; } fg_x -= page_width; }