Ejemplo n.º 1
0
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;
	}

}
Ejemplo n.º 2
0
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;	
}
Ejemplo n.º 3
0
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;
}
Ejemplo n.º 4
0
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;
}
Ejemplo n.º 5
0
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;	
}