Beispiel #1
0
MainMenu * New_MainMenu(Container *container) {
	MainMenu *ret = malloc(sizeof(MainMenu));
    ret->background = New_Texture(container->renderer, "../../assets/img/mainMenuBG.png");
    ret->buttons.start.texture = New_Texture(container->renderer, "../../assets/img/mainMenuStart.png");
    ret->buttons.start.texture = New_Texture(container->renderer, "../../assets/img/mainMenuQuit.png");
	ret->buttons.start.action = START;

    /* The where and size of the textures */ 
    ret->buttons.start.renderRect.x = 435;
    ret->buttons.start.renderRect.y = 200;
    ret->buttons.start.renderRect.w = 357;
    ret->buttons.start.renderRect.h = 132;

    ret->buttons.quit.renderRect.x = 435;
    ret->buttons.quit.renderRect.y = 400;
    ret->buttons.quit.renderRect.w = 357;
    ret->buttons.quit.renderRect.h = 132;

	return ret;
}
Beispiel #2
0
//Looks through the level and adds every object and character from the level into the world 
World * World_LoadWorldFromLevel(Level * level, Container *container) {
	World *ret = malloc(sizeof(World));
	char *player_texture;
	char *brick_texture;
	char *melee_enemy_texture;
	char *ranged_enemy_texture;
	char *flying_enemy_texture;

	ret->size.h = level->height * TILE_SCALE;
	ret->size.w = level->width * TILE_SCALE;
	ret->theme = level->theme;
	ret->is_complete = false;	
	//Depending on the theme of the level, different textures are loaded
	switch (level->theme) {
		case LAVA:
			ret->background.still = New_Texture(container->renderer, "../assets/img/Lava/background_tiled.png");
			player_texture = "../assets/img/Lava/player.png";
			brick_texture = "../assets/img/Lava/brick.png";
			melee_enemy_texture = "../assets/img/Lava/melee_enemy.png";
			ranged_enemy_texture = "../assets/img/Lava/ranged_enemy.png";
			flying_enemy_texture = "../assets/img/Lava/flying_enemy.png";
		break;
		case MEDIEVAL:
			ret->background.still = New_Texture(container->renderer, "../assets/img/Medieval/background_still.png");
			player_texture = "../assets/img/Medieval/player.png";
			brick_texture = "../assets/img/Medieval/brick.png";
			melee_enemy_texture = "../assets/img/Medieval/melee_enemy.png";
			ranged_enemy_texture = "../assets/img/Medieval/ranged_enemy.png";
			flying_enemy_texture = "../assets/img/Medieval/flying_enemy.png";
		break;
		case ICE:
			ret->background.still = New_Texture(container->renderer, "../assets/img/Ice/background_tiled.png");
			player_texture = "../assets/img/Ice/player.png";
			brick_texture = "../assets/img/Ice/brick.png";
			melee_enemy_texture = "../assets/img/Ice/melee_enemy.png";
			ranged_enemy_texture = "../assets/img/Ice/ranged_enemy.png";
			flying_enemy_texture = "../assets/img/Ice/flying_enemy.png";
		break;
		case SPOOKY:
			ret->background.still = New_Texture(container->renderer, "../assets/img/Spooky/background_still.png");
			player_texture = "../assets/img/Spooky/player.png";
			brick_texture = "../assets/img/Spooky/brick.png";
			melee_enemy_texture = "../assets/img/Spooky/melee_enemy.png";
			ranged_enemy_texture = "../assets/img/Spooky/ranged_enemy.png";
			flying_enemy_texture = "../assets/img/Spook/flying_enemy.png";
		break;
	}
	
	//Loads in a player, which contains an objecttype and other variables
	ret->player = New_Player(
		New_ObjectType(
			New_Spritesheet(
				New_Texture(
					container->renderer, player_texture
				),
				10,
				8, 8, 4, 4, 3, 3, 2, 2, 1, 1
			),
			26, 36
		),
		0, 0,
		level->theme
	);
	
	//Adds an objecttype for the goalposts

	ret->goalpost = New_ObjectType(
		New_Spritesheet(
			New_Texture(container->renderer, "../assets/img/goalpost.png"),
			1, 1
		),
		32, 32
	);


	ret->EnemyTypeCount = 3;
	ret->EnemyTypes = malloc(ret->EnemyTypeCount * sizeof(CharacterType *));	

	/* Create Melee enemy type */	
	ret->EnemyTypes[0] = New_CharacterType(
		New_ObjectType(
			New_Spritesheet(
				New_Texture(container->renderer, melee_enemy_texture),
				10,
				8, 8, 4, 4, 3, 3, 2, 2, 1, 1
			),
			31, 33
		), NULL,
		1, 100, 5
	);
	debug_msg("Melee enemy CharacterType: %p\tObjectType: %p\n", ret->EnemyTypes[0], ret->EnemyTypes[0]->object_type);

	ret->EnemyTypes[1] = New_CharacterType(
		New_ObjectType(
			New_Spritesheet(
				New_Texture(container->renderer, ranged_enemy_texture),
				10,
				8, 8, 4, 4, 3, 3, 2, 2, 1, 1
			),
			31, 33
		), NULL,
		1, 100, 1
	);
	debug_msg("Ranged enemy CharacterType: %p\tObjectType: %p\tTexture: %p\n", ret->EnemyTypes[1], ret->EnemyTypes[1]->object_type, ret->EnemyTypes[1]->object_type->spritesheet->texture);

	ret->EnemyTypes[2] = New_CharacterType(
		New_ObjectType(
			New_Spritesheet(
				New_Texture(container->renderer, flying_enemy_texture),
				6,
				4, 4, 3, 3, 2, 2
			),
			34, 33
		), NULL, /* behavior */
		2, 100, 1
	);
	debug_msg("Flying enemy CharacterType: %p\tObjectType: %p\n", ret->EnemyTypes[2], ret->EnemyTypes[2]->object_type);

	ret->ObjectTypeCount = 1;
	ret->ObjectTypes = malloc(ret->ObjectTypeCount * sizeof(ObjectType *));

	ret->ObjectTypes[0] = New_ObjectType(
		New_Spritesheet(
			New_Texture(container->renderer, brick_texture),
			1, 16
		),
		TILE_SCALE, TILE_SCALE /* width, height */
	);

	/* Collect and load instances from level tiles */
	for (int y = 0; y < level->height; y++) {
		for (int x = 0; x < level->width; x++) {
			//Add whatever object you need to add
			switch (level->tileArray[y][x]) {
				case BRICK:
					ObjectType_AddObject(ret->ObjectTypes[OBJECT_BRICK], x * TILE_SCALE, y * TILE_SCALE);
					ret->ObjectTypes[OBJECT_BRICK]->instances[ret->ObjectTypes[OBJECT_BRICK]->instance_count - 1].sprite_index[0] = Level_GetBrickChoice(level, x, y);
				break;
				case PLAYER:
					ret->player->object->dstrect.x = x * TILE_SCALE;
					ret->player->object->dstrect.y = y * TILE_SCALE;
				break;
				case GOALPOST:
					ObjectType_AddObject(ret->goalpost, x * TILE_SCALE, y * TILE_SCALE);
				break;
				case MELEE:
					CharacterType_AddCharacter(ret->EnemyTypes[0], x * TILE_SCALE, y * TILE_SCALE);
				break;
				case RANGED:
					CharacterType_AddCharacter(ret->EnemyTypes[1], x * TILE_SCALE, y * TILE_SCALE);
				break;
				case FLYING:
					CharacterType_AddCharacter(ret->EnemyTypes[2], x * TILE_SCALE, y * TILE_SCALE);
//				case BOSS:
//					ret->boss->object->dstrect.x = x * TILE_SCALE;
//					ret->boss->object->dstrect.y = y * TILE_SCALE;
//				break;
				default:
				break;
			}
		}
	}

	return ret;
}