void sceneShow::run_viewpoint_scene(CURRENT_FILE_FORMAT::file_scene_show_viewpoint viewpoint) { std::cout << "** sceneShow::run_image_scene::START" << std::endl; float x = viewpoint.ini_x; float y = viewpoint.ini_y; graphicsLib_gSurface image; graphLib.surfaceFromFile(FILEPATH + "images/scenes/" + viewpoint.filename, &image); //std::cout << "** sceneShow::run_image_scene::total_dist: " << total_dist << std::endl; while (total_dist > 0) { input.read_input(); //std::cout << "total_dist: " << total_dist << std::endl; timer.delay(viewpoint.move_delay); std::cout << "rect - x[" << x << "], .y[" << y << "], w[" << viewpoint.w << "], h[" << viewpoint.h << "]" << std::endl; //void graphicsLib::showSurfacePortion(graphicsLib_gSurface *surfaceOrigin, const st_rectangle origin_rect, st_rectangle destiny_rect) graphLib.showSurfacePortion(&image, st_rectangle(x, y, viewpoint.w, viewpoint.h), st_rectangle(viewpoint.pos_x, viewpoint.pos_y, viewpoint.w, viewpoint.h)); graphLib.updateScreen(); x += speed_x; y += speed_y; total_dist--; } graphLib.showSurfacePortion(&image, st_rectangle(x, y, viewpoint.w, viewpoint.h), st_rectangle(viewpoint.pos_x, viewpoint.pos_y, viewpoint.w, image.height)); timer.delay(viewpoint.move_delay); graphLib.updateScreen(); }
void sceneShow::show_animation(int n, int repeat_n, int repeat_mode) { int frame_n = 0; CURRENT_FILE_FORMAT::file_scene_show_animation scene = animation_list.at(n); long frame_timer = timer.getTimer() + scene.frame_delay; long started_timer = timer.getTimer(); int repeat_times = 0; graphicsLib_gSurface image; graphLib.surfaceFromFile(FILEPATH + "images/scenes/animations/" + scene.filename, &image); int max_frames = image.width / scene.frame_w; graphicsLib_gSurface bg_image; graphLib.initSurface(st_size(scene.frame_w, scene.frame_h), &bg_image); graphLib.copy_gamescreen_area(st_rectangle(scene.x, scene.y, scene.frame_w, scene.frame_h), st_position(0, 0), &bg_image); while (true) { std::cout << "sceneShow::show_animation::LOOP" << std::endl; //graphLib.showSurfaceAt(&bg_image, st_position(scene.x, scene.y), false); int x = frame_n*scene.frame_w; std::cout << "origin.x: " << x << ", dest.x: " << scene.x << ", frame.w: " << scene.frame_w << ", frame.h: " << scene.frame_h << std::endl; graphLib.showSurfaceRegionAt(&image, st_rectangle(x, 0, scene.frame_w, scene.frame_h), st_position(scene.x, scene.y)); graphLib.updateScreen(); if (frame_timer < timer.getTimer()) { frame_n++; if (frame_n > max_frames) { frame_n = 0; repeat_times++; } frame_timer = timer.getTimer() + scene.frame_delay; } // stop condition if (repeat_times > 0 && repeat_n <= 1) { std::cout << "sceneShow::show_animation::LEAVE#1" << std::endl; return; } else { if (repeat_mode == 0) { // time-mode if ((timer.getTimer() - started_timer) > repeat_n) { std::cout << "sceneShow::show_animation::LEAVE#2" << std::endl; return; } } else { // repeat number mode if (repeat_times > repeat_n) { std::cout << "sceneShow::show_animation::LEAVE#3" << std::endl; return; } } } timer.delay(10); } }
void draw::show_boss_intro_sprites(short boss_id, bool show_fall) { UNUSED(show_fall); unsigned int intro_frames_n = 0; //int intro_frames_rollback = 0; st_position boss_pos(20, -37); st_position sprite_size; graphicsLib_gSurface bgCopy, boss_graphics; std::string graph_filename = FILEPATH + "data/images/sprites/enemies/" + std::string(game_data.game_npcs[boss_id].graphic_filename); sprite_size.x = game_data.game_npcs[boss_id].frame_size.width; sprite_size.y = game_data.game_npcs[boss_id].frame_size.height; graphLib.surfaceFromFile(graph_filename.c_str(), &boss_graphics); graphLib.initSurface(st_size(RES_W, RES_H), &bgCopy); graph_filename = FILEPATH + "data/images/backgrounds/stage_boss_intro.png"; graphLib.surfaceFromFile(graph_filename.c_str(), &bgCopy); st_position bg_pos(0, (RES_H/2)-(bgCopy.height/2)); graphLib.copyArea(bg_pos, &bgCopy, &graphLib.gameScreen); update_screen(); int sprite_pos_y = RES_H/2 - sprite_size.y/2; for (int i=0; i<ANIM_FRAMES_COUNT; i++) { if (game_data.game_npcs[boss_id].sprites[ANIM_TYPE_INTRO][i].used == true) { intro_frames_n++; } } // fall into position while (boss_pos.y < sprite_pos_y) { boss_pos.y += 4; graphLib.copyArea(bg_pos, &bgCopy, &graphLib.gameScreen); graphLib.copyArea(st_rectangle(0, 0, sprite_size.x, sprite_size.y), st_position(boss_pos.x, boss_pos.y), &boss_graphics, &graphLib.gameScreen); graphLib.wait_and_update_screen(5); } graphLib.wait_and_update_screen(500); // show intro sprites if (intro_frames_n > 1) { for (int i=0; i<ANIM_FRAMES_COUNT; i++) { if (game_data.game_npcs[boss_id].sprites[ANIM_TYPE_INTRO][i].used == true) { //std::cout << "i: " << i << ", used: " << game_data.game_npcs[boss_id].sprites[ANIM_TYPE_INTRO][i].used << ", duration: " << game_data.game_npcs[boss_id].sprites[ANIM_TYPE_INTRO][i].duration << std::endl; graphLib.copyArea(bg_pos, &bgCopy, &graphLib.gameScreen); graphLib.copyArea(st_rectangle(sprite_size.x * game_data.game_npcs[boss_id].sprites[ANIM_TYPE_INTRO][i].sprite_graphic_pos_x, 0, sprite_size.x, sprite_size.y), st_position(boss_pos.x, boss_pos.y), &boss_graphics, &graphLib.gameScreen); graphLib.wait_and_update_screen(game_data.game_npcs[boss_id].sprites[ANIM_TYPE_INTRO][i].duration); } } } else { // just frow first sprite graphLib.copyArea(bg_pos, &bgCopy, &graphLib.gameScreen); graphLib.copyArea(st_rectangle(0, 0, sprite_size.x, sprite_size.y), st_position(boss_pos.x, boss_pos.y), &boss_graphics, &graphLib.gameScreen); graphLib.wait_and_update_screen(200); } }
// @TODO - this should only set some variables in a global and the drawinbg should be handled my show_scene() // That way we can move the run_XXX methods into threads to run in paralel void sceneShow::run_image_scene(CURRENT_FILE_FORMAT::file_scene_show_image scene_image) { std::cout << "** sceneShow::run_image_scene::START" << std::endl; float x = scene_image.ini_x; float y = scene_image.ini_y; graphicsLib_gSurface image; graphicsLib_gSurface bg_image; graphLib.initSurface(st_size(RES_W, RES_H), &bg_image); graphLib.copy_gamescreen_area(st_rectangle(0, 0, RES_W, RES_H), st_position(0, 0), &bg_image); graphLib.surfaceFromFile(FILEPATH + "images/scenes/" + scene_image.filename, &image); std::cout << "** sceneShow::run_image_scene::total_dist: " << total_dist << std::endl; while (total_dist > 0) { input.read_input(); //std::cout << "total_dist: " << total_dist << std::endl; timer.delay(scene_image.move_delay); // @TODO - copy background, but should be done in a smarter way as there can be several moving elements graphLib.showSurfaceAt(&bg_image, st_position(0, 0), false); graphLib.showSurfaceAt(&image, st_position(x, y), false); graphLib.updateScreen(); x += speed_x; y += speed_y; total_dist--; } graphLib.showSurfaceAt(&image, st_position(x, y), false); graphLib.updateScreen(); }
void draw::show_credits() { int line_n=0; unsigned int scrolled=0; int posY = -RES_H; st_rectangle dest; graphicsLib_gSurface credits_surface; graphLib.initSurface(st_size(RES_W, RES_H+12), &credits_surface); graphLib.blank_surface(credits_surface); graphLib.blank_screen(); // add the initial lines to screen create_credits_text(credits_surface); update_screen(); // scroll the lines while (scrolled < (credits_list.size()*12)+RES_H/2+46) { graphLib.copyArea(st_rectangle(0, posY, RES_W, RES_H), st_position(0, 0), &credits_surface, &graphLib.gameScreen); update_screen(); timer.delay(60); posY++; scrolled++; if (posY > 12) { graphLib.copyArea(st_rectangle(0, posY, credits_surface.width, RES_H), st_position(0, 0), &credits_surface, &credits_surface); // scroll the lines dest.x = 0; dest.y = RES_H; dest.w = RES_W; dest.h = 12; graphLib.blank_area(dest.x, dest.y, dest.w, dest.h, credits_surface); draw_credit_line(credits_surface, line_n+21); posY = 0; line_n++; } } update_screen(); }
void gfx_sin_wave::show(int x, int y) { float angle_max = 3.14 * SIN_STEPS; float angle_step = angle_max / surface->width; float angle = 0; for (int j=0; j<max_amplitude; j++) { graphLib.clear_area(x, y, surface->width, surface->height, 0, 0, 0); for (int i=0; i<surface->height; i++) { float pos_x = (sin(angle) + x)*amplitude; int pos_y = i + y; angle += angle_step; //std::cout << "i[" << i << "], pos_x[" << pos_x << "], pos_y[" << pos_y << "]" << std::endl; graphLib.showSurfacePortion(surface, st_rectangle(0, i, surface->width, 1), st_rectangle(pos_x, pos_y, surface->width, 1)); } amplitude--; graphLib.updateScreen(); timer.delay(40); } }
void draw::show_rain() { if (rain_obj.gSurface == NULL) { // load rain std::string filename = FILEPATH + "/data/images/tilesets/rain.png"; graphLib.surfaceFromFile(filename, &rain_obj); } for (int i=0; i<MAP_W; i++) { for (int j=0; j<MAP_H; j++) { graphLib.showSurfaceRegionAt(&rain_obj, st_rectangle(_rain_pos*TILESIZE, 0, TILESIZE, TILESIZE), st_position(i*TILESIZE, j*TILESIZE)); } } if (timer.getTimer() > _rain_timer) { _rain_pos++; if (_rain_pos > 2) { _rain_pos = 0; } _rain_timer = timer.getTimer() + RAIN_DELAY; } }
void sceneShow::show_animation(int n, int repeat_n, int repeat_mode) { int frame_n = 0; CURRENT_FILE_FORMAT::file_scene_show_animation scene = animation_list.at(n); long frame_timer = timer.getTimer() + scene.frame_delay; long started_timer = timer.getTimer(); int repeat_times = 0; graphicsLib_gSurface image; graphLib.surfaceFromFile(FILEPATH + "images/scenes/animations/" + scene.filename, &image); int max_frames = image.width / scene.frame_w; graphicsLib_gSurface bg_image; graphLib.initSurface(st_size(scene.frame_w, scene.frame_h), &bg_image); graphLib.copy_gamescreen_area(st_rectangle(scene.x, scene.y, scene.frame_w, scene.frame_h), st_position(0, 0), &bg_image); std::cout << "max_frames[" << max_frames << "], image.w[" << image.width << "], scene.frame_w[" << scene.frame_w << "]" << std::endl; while (true) { input.read_input(); int x = frame_n*scene.frame_w; // stop condition if (repeat_times > 0 && repeat_n <= 1) { std::cout << "sceneShow::show_animation::LEAVE#1" << std::endl; break; } else { if (repeat_mode == 0) { // time-mode if ((timer.getTimer() - started_timer) > repeat_n) { std::cout << "sceneShow::show_animation::LEAVE#2" << std::endl; break; } } else { // repeat number mode if (repeat_times > repeat_n) { std::cout << "sceneShow::show_animation::LEAVE#3" << std::endl; break; } } } graphLib.showSurfaceAt(&bg_image, st_position(scene.x, scene.y), false); std::cout << "x[" << x << "], img.w[" << image.width << "], frame.w[" << scene.frame_w << "]" << std::endl; graphLib.showSurfaceRegionAt(&image, st_rectangle(x, 0, scene.frame_w, scene.frame_h), st_position(scene.x, scene.y)); graphLib.updateScreen(); timer.delay(scene.frame_delay); if (frame_timer < timer.getTimer()) { frame_n++; if (frame_n >= max_frames) { frame_n = 0; repeat_times++; } frame_timer = timer.getTimer() + scene.frame_delay; } } // avoid leaving animation image trail if it is a repeating one if (repeat_n > 1) { graphLib.showSurfaceAt(&bg_image, st_position(scene.x, scene.y), false); graphLib.updateScreen(); timer.delay(scene.frame_delay); } }
void classPlayer::execute_projectiles() { // animate projectiles vector<projectile>::iterator it; bool ignore_hit_timer = false; if (_simultaneous_shots > 1) { ignore_hit_timer = true; } for (it=projectile_list.begin(); it<projectile_list.end(); it++) { if ((*it).is_finished == true) { projectile_list.erase(it); break; } st_size moved = (*it).move(); //std::cout << "projectile.move_type: " << (*it)->get_move_type() << std::endl; /// @TODO projectiles that are tele-guided if ((*it).get_move_type() == TRAJECTORY_CHAIN) { (*it).set_y(position.y+frameSize.height/2); } else if ((*it).get_move_type() == TRAJECTORY_QUAKE) { damage_ground_npcs(); continue; } (*it).draw(); if ((*it).is_reflected == true) { continue; } // check colision agains enemies std::vector<classnpc*>::iterator enemy_it; for (enemy_it=map->_npc_list.begin(); enemy_it != map->_npc_list.end(); enemy_it++) { if ((*it).is_finished == true) { projectile_list.erase(it); break; } if ((*enemy_it)->is_on_visible_screen() == false) { continue; } if ((*enemy_it)->is_dead() == true) { continue; } //classnpc* enemy = (*enemy_it); if ((*it).check_colision(st_rectangle((*enemy_it)->getPosition().x, (*enemy_it)->getPosition().y, (*enemy_it)->get_size().width, (*enemy_it)->get_size().height), st_position(moved.width, moved.height)) == true) { if ((*enemy_it)->is_shielded((*it).get_direction()) == true) { // shielded NPC -> reflects shot if ((*it).get_trajectory() == TRAJECTORY_CHAIN) { (*it).consume_projectile(); } else { (*it).reflect(); } continue; } if ((*enemy_it)->is_invisible() == true) { // invisible NPC -> ignore shot continue; } // check if have hit area, and if hit it st_rectangle enemy_hit_area = (*enemy_it)->get_hit_area(); st_size enemy_size = (*enemy_it)->get_size(); enemy_hit_area.x += (*enemy_it)->getPosition().x-1; enemy_hit_area.y += (*enemy_it)->getPosition().y; //std::cout << ">> PLAYER::execute_projectiles[" << (*enemy_it)->getName() << "] - npc.h: " << enemy_size.height << ", hit_area.h: " << enemy_hit_area.h << std::endl; if (enemy_hit_area.w != enemy_size.width || enemy_hit_area.h != enemy_size.height) { //std::cout << ">> PLAYER::execute_projectiles[" << (*enemy_it)->getName() << "] - use hit_area" << std::endl; if ((*it).check_colision(enemy_hit_area, st_position(moved.width, moved.height)) == false) { // hit body, but not the hit area -> reflect //std::cout << ">> PLAYER::execute_projectiles[" << (*enemy_it)->getName() << "]Projectile missed - enemy_hit_area.w: " << enemy_hit_area.w << ", enemy_hit_area.h: " << enemy_hit_area.h << std::endl; (*it).consume_projectile(); continue; } //} else { //std::cout << ">> PLAYER::execute_projectiles[" << (*enemy_it)->getName() << "] - DONT use hit_area" << std::endl; } short wpn_id = (*it).get_weapon_id(); //std::cout << "******* wpn_id: " << wpn_id << std::endl; if (wpn_id < 0) { wpn_id = 0; } //std::cout << ">> player weapon damage #1" << std::endl; //std::cout << "******* (*enemy_it)->is_using_circle_weapon(): " << (*enemy_it)->is_using_circle_weapon() << ", (*it)->get_trajectory(): " << (*it)->get_trajectory() << ", TRAJECTORY_CHAIN: " << TRAJECTORY_CHAIN << std::endl; // NPC using cicrcle weapon, is only be destroyed by CHAIN, but NPC won't take damage if ((*enemy_it)->is_using_circle_weapon() == true ) { if ((*it).get_trajectory() == TRAJECTORY_CHAIN) { //std::cout << "PLAYER projectile hit NPC centered-weapon" << std::endl; (*enemy_it)->consume_projectile(); } (*it).consume_projectile(); return; } if ((*it).get_damage() > 0) { int multiplier = game_data.game_npcs[(*enemy_it)->get_number()].weakness[wpn_id].damage_multiplier; if (multiplier <= 0) { multiplier = 1; } (*enemy_it)->damage((*it).get_damage() * multiplier, ignore_hit_timer); } if ((*it).get_damage() > 0) { (*it).consume_projectile(); soundManager.play_sfx(SFX_NPC_HIT); } } } } }