Beispiel #1
0
void cave_vh_screenrefresh(struct osd_bitmap *bitmap,int full_refresh)
{
	int pri;
	int layers_ctrl = -1;

	int	glob_flipx	=	READ_WORD(&cave_videoregs[0]) & 0x8000;
	int	glob_flipy	=	READ_WORD(&cave_videoregs[2]) & 0x8000;

	tilemap_set_flip(ALL_TILEMAPS, (glob_flipx ? TILEMAP_FLIPX : 0) | (glob_flipy ? TILEMAP_FLIPY : 0) );

	tilemap_set_enable( tilemap_0, READ_WORD(&cave_vctrl_0[4]) & 1 );
	tilemap_set_scrollx(tilemap_0, 0, READ_WORD(&cave_vctrl_0[0]) );
	tilemap_set_scrolly(tilemap_0, 0, READ_WORD(&cave_vctrl_0[2]) );

	if (tilemap_1)
	{
		tilemap_set_enable( tilemap_1, READ_WORD(&cave_vctrl_1[4]) & 1 );
		tilemap_set_scrollx(tilemap_1, 0, READ_WORD(&cave_vctrl_1[0]) );
		tilemap_set_scrolly(tilemap_1, 0, READ_WORD(&cave_vctrl_1[2]) );
	}

	if (tilemap_2)
	{
		tilemap_set_enable( tilemap_2, READ_WORD(&cave_vctrl_2[4]) & 1 );
		tilemap_set_scrollx(tilemap_2, 0, READ_WORD(&cave_vctrl_2[0]) );
		tilemap_set_scrolly(tilemap_2, 0, READ_WORD(&cave_vctrl_2[2]) );
	}

	tilemap_update(ALL_TILEMAPS);

	palette_init_used_colors();

	get_sprite_info();

	sprite_update();

	if (palette_recalc())	tilemap_mark_all_pixels_dirty(ALL_TILEMAPS);

	tilemap_render(ALL_TILEMAPS);

	/* Clear the background if at least one of layer 0's tile priorities
	   is lacking */

	if ((layers_ctrl & 0xf) != 0xf)	osd_clearbitmap(Machine->scrbitmap);

	/* Pen 0 of layer 0's tiles (any priority) goes below anything else */

	for ( pri = 0; pri < 4; pri++ )
		if ((layers_ctrl&(1<<(pri+0)))&&tilemap_0)	tilemap_draw(bitmap, tilemap_0, TILEMAP_IGNORE_TRANSPARENCY | pri);

	/* Draw the rest with transparency */

	for ( pri = 0; pri < 4; pri++ )
	{
		if ((layers_ctrl&(1<<(pri+12))))			sprite_draw(sprite_list, pri);
		if ((layers_ctrl&(1<<(pri+0)))&&tilemap_0)	tilemap_draw(bitmap, tilemap_0, pri);
		if ((layers_ctrl&(1<<(pri+4)))&&tilemap_1)	tilemap_draw(bitmap, tilemap_1, pri);
		if ((layers_ctrl&(1<<(pri+8)))&&tilemap_2)	tilemap_draw(bitmap, tilemap_2, pri);
	}
}
Beispiel #2
0
static void update(void)
{
   int i;
   for (i = 0; i < example.sprite_count; i++)
      sprite_update(example.sprites + i);

   example.t++;
   if (example.t == 60) {
      ALLEGRO_DEBUG("tick");
      example.t = 0;
   }
}
Beispiel #3
0
void entities_update_all()
{
    for (int i = 0; i < MAX_ENTITIES; ++i)
    {
        Entity* e = &(sm_entities[i]);
        if (e->enabled)
        {
            e->sprite.x = e->x;
            e->sprite.y = e->y;
            sprite_update(&(e->sprite));

            e->collider.x = e->x;
            e->collider.y = e->y;
        }
    }
}
Beispiel #4
0
void
entity_update(Entity e) {
    if (e->sprite) {
        sprite_update(e->sprite);
    }
}
Beispiel #5
0
static void update(void)
{
   int i;
   for (i = 0; i < example.sprite_count; i++)
      sprite_update(example.sprites + i);
}
Beispiel #6
0
void game_loop (GAME *game)
{
    if (!game)
        return;

    ALLEGRO_KEYBOARD_STATE keyboard_state;
    ALLEGRO_EVENT event;
    ALLEGRO_FONT *font = al_load_font ("data/fixed_font.tga", 0, 0);
    SCENE *scene;
    SPRITE_ACTOR *actor;
    LIST_ITEM *item;

    AABB_COLLISIONS collisions;
    aabb_init_collisions (&collisions);

    AABB_COLLISIONS portal_collisions;
    aabb_init_collisions (&portal_collisions);

    AABB_COLLISIONS npc_collisions;
    aabb_init_collisions (&npc_collisions);

    int i = 0;
    bool redraw = true;
    float times[NTIMES] = {0};

    double frame_time, current_time, new_time, mean_frame_time;
    double fixed_dt = 1.0 / FPS, dt;
    double curfps = 0.0;

    current_time = al_get_time ();
    al_start_timer (game->timer);

    float fadeout_duration = 0;
    float fadein_duration = 0;
    SCENE_PORTAL *dest_portal = NULL;

    char *arrow_path = get_resource_path_str ("data/ui/smallarrow_down.png");
    ALLEGRO_BITMAP *sel_arrow = al_load_bitmap (arrow_path);

    while (game->running) {
        scene = game->current_scene;
        actor = game->current_actor;

        if (redraw) {
            al_clear_depth_buffer (0);
            tiled_draw_map_back (scene->map, game->screen.tint,
                                 game->screen.position.x, game->screen.position.y,
                                 game->screen.width, game->screen.height, 0, 0, 0);

            al_draw_textf (font, al_map_rgba_f (0.9, 0, 0, 1), 5, 5, 0, "FPS: %.2f", curfps);

            al_set_render_state (ALLEGRO_ALPHA_TEST, true);
            al_set_render_state (ALLEGRO_DEPTH_TEST, true);
            al_set_render_state (ALLEGRO_DEPTH_FUNCTION, ALLEGRO_RENDER_GREATER);

            al_hold_bitmap_drawing (true);
            sprite_draw (actor, &game->screen);
            item = _al_list_front (scene->npcs);
            while (item) {
                SPRITE_ACTOR *npc_actor = (SPRITE_ACTOR *)_al_list_item_data (item);
                sprite_draw (npc_actor, &game->screen);
                item = _al_list_next (scene->npcs, item);
            }
            al_hold_bitmap_drawing (false);

            al_set_render_state (ALLEGRO_DEPTH_TEST, false);
            al_set_render_state (ALLEGRO_ALPHA_TEST, false);

            if (false) {
                item = _al_list_front (portal_collisions.boxes);
                while (item) {
                    BOX *box = _al_list_item_data (item);
                    box_draw (*box, game->screen.position, al_map_rgb_f (1, 0, 0));
                    item = _al_list_next (portal_collisions.boxes, item);
                }

                aabb_draw (scene->portal_tree, &game->screen, al_map_rgb_f (0, 0, 1));
            }

            tiled_draw_map_fore (scene->map, game->screen.tint,
                                 game->screen.position.x, game->screen.position.y,
                                 game->screen.width, game->screen.height, 0, 0, 0);

            if (game->current_npc) {
                float dx = game->current_npc->actor.box.center.x - game->screen.position.x;
                float dy = game->current_npc->actor.box.center.y - game->screen.position.y;
                dx -= al_get_bitmap_width (sel_arrow) * 0.5f;
                dy -= game->current_npc->actor.box.extent.y * 3.0f;
                al_draw_bitmap (sel_arrow, dx, dy, 0);
            }

            ui_draw (game->ui, &game->screen);
            if (game->force_vsync)
                al_wait_for_vsync ();

            al_flip_display ();
            redraw = false;
        }

        al_wait_for_event (game->event_queue, &event);

        switch (event.type) {
            case ALLEGRO_EVENT_TIMER:
                new_time = al_get_time ();
                frame_time = new_time - current_time;
                current_time = new_time;

                times[i] = frame_time;
                i = (i + 1) % NTIMES;

                mean_frame_time = 0.0;
                for (int j = 0; j < NTIMES; j++)
                    mean_frame_time += times[j];

                mean_frame_time /= NTIMES;
                curfps = 1.0 / mean_frame_time;

                dt = mean_frame_time / fixed_dt;

                if (fadeout_duration > 0.0f) {
                    float fadef = fadeout_duration / TRANS_TIME;
                    game->screen.tint = al_map_rgba_f (fadef, fadef, fadef, 1.0);
                    fadeout_duration -= mean_frame_time;
                    if (fadeout_duration <= 0.0f) {
                        fadein_duration = TRANS_TIME;
                        fadeout_duration = 0.0f;
                        game_enter_portal (game, dest_portal);
                    }
                }

                if (fadein_duration > 0.0f) {
                    float fadef = 1.0 - fadein_duration / TRANS_TIME;
                    game->screen.tint = al_map_rgba_f (fadef, fadef, fadef, 1.0);
                    fadein_duration -= mean_frame_time;
                    if (fadein_duration <= 0.0f) {
                        game->paused = false;
                        fadein_duration = 0.0f;
                    }
                }

                if (game->paused) {
                    redraw = true;
                    break;
                }

                al_get_keyboard_state (&keyboard_state);

                if (al_key_down (&keyboard_state, ALLEGRO_KEY_ESCAPE)) {
                    game->running = false;
                    continue;
                }

                if (al_key_down (&keyboard_state, ALLEGRO_KEY_ENTER)) {
                    ui_show_dialog (game->ui, NULL, NULL);
                }

                if (al_key_down (&keyboard_state, ALLEGRO_KEY_RIGHT)) {
                    actor->event->move_right (actor, dt);
                }
                if (al_key_down (&keyboard_state, ALLEGRO_KEY_LEFT)) {
                    actor->event->move_left (actor, dt);
                }
                if (al_key_down (&keyboard_state, ALLEGRO_KEY_UP)) {
                    actor->event->move_up (actor, dt);
                }
                if (al_key_down (&keyboard_state, ALLEGRO_KEY_DOWN)) {
                    actor->event->move_down (actor, dt);
                }

                BOX box = actor->box;
                box.center.x += actor->movement.x * dt;
                box.center.y += actor->movement.y * dt;

                aabb_collide_fill_cache (scene->collision_tree, &box, &collisions);
                if (scene->collision_tree->num_collisions > 0) {
                    item = _al_list_front (collisions.boxes);
                    while (item) {
                        if (box_lateral (*(BOX *)_al_list_item_data (item), actor->box))
                            actor->movement.x = 0;
                        else
                            actor->movement.y = 0;
                        item = _al_list_next (collisions.boxes, item);
                    }
                }

                aabb_collide_fill_cache (scene->portal_tree, &box, &portal_collisions);
                if (scene->portal_tree->num_collisions > 0) {
                    item = _al_list_front (portal_collisions.boxes);
                    while (item) {
                        BOX *colbox = _al_list_item_data (item);
                        TILED_OBJECT *obj = colbox->data;
                        SCENE_PORTAL *portal = scene_get_portal (game->scenes, obj->name);
                        if (portal && portal->destiny_portal) {
                            dest_portal = scene_get_portal (game->scenes, portal->destiny_portal);
                            if (dest_portal) {
                                fadeout_duration = TRANS_TIME;
                                game->paused = true;
                                actor->movement = (VECTOR2D){0, 0};
                                ui_show_dialog_cstr (game->ui, "Speaker:", "Entering portal.");
                                break;
                            }
                        }
                        item = _al_list_next (portal_collisions.boxes, item);
                    }
                }

                box = screen_box (&game->screen);

                game->current_npc = NULL;
                item = _al_list_front (scene->npcs);
                float max_dist = 0;
                while (item) {
                    SPRITE_NPC *npc = _al_list_item_data (item);
                    float dist = vsqdistance (npc->actor.box.center, game->current_actor->box.center);
                    if (dist < 128.0f * 128.0f && dist > max_dist) {
                        game->current_npc = npc;
                        max_dist = dist;
                    }
                    item = _al_list_next (scene->npcs, item);
                }

                //aabb_collide_fill_cache (scene->npc_tree, &box, &npc_collisions);
                //if (scene->npc_tree->num_collisions > 0) {
                //    item = _al_list_front (npc_collisions.boxes);
                //    float max_dist = 0;
                //    while (item) {
                //        BOX *colbox = _al_list_item_data (item);
                //        SPRITE_NPC *npc = colbox->data;
                //        float dist = vsqdistance (npc->actor.box.center, game->current_actor->box.center);
                //        if (dist < 128.0f * 128.0f && dist > max_dist) {
                //            game->current_npc = npc;
                //            max_dist = dist;
                //        }
                //        item = _al_list_next (npc_collisions.boxes, item);
                //    }
                //}

                screen_update (&game->screen, actor->position, scene->map, dt);
                sprite_update (actor, dt, mean_frame_time);

                item = _al_list_front (scene->npcs);
                while (item) {
                    SPRITE_ACTOR *npc_actor = (SPRITE_ACTOR *)_al_list_item_data (item);
                    sprite_update (npc_actor, dt, mean_frame_time);
                    item = _al_list_next (scene->npcs, item);
                }

                redraw = true;
                break;
            case ALLEGRO_EVENT_DISPLAY_CLOSE:
                game->running = false;
                break;
            default:
                fprintf (stderr, "Unsupported event received: %d\n", event.type);
                break;
        }
    }

    aabb_free_collisions (&collisions);
    aabb_free_collisions (&portal_collisions);
    aabb_free_collisions (&npc_collisions);
}
Beispiel #7
0
void world_update_dt(void) {
    t_sprite_iterator iter;
    t_spritePtr sprite;
    t_item_iterator iiter;
    t_itemPtr item;
    
//    if (world.t-debug_time_printed > 10.0) {
//        debug_time_printed+=10.0;
//        printf("t= %.1f   %d sprites nexts: %.1f %.1f %.1f\n",debug_time_printed,world.sprites_n,world.time_next_piligrim,world.time_next_cansado,world.time_next_bici);
//    }
    
    
    
    // en la iteracion de actualizacion acumula collision candidates para despues
    collision_candidates_n=0;
    collision_bici_n=0;
    t_pos collision_x=world.player.vx*game_dt;
    // y calcula el walker mas retrasado y su velocidad
    t_pos min_x=500;
    t_v min_v=c_v_fast;
    world_iterate_sprites(&iter);
    // actualiza posicion y velocidad y estado de la animacion
    // tiene que hacerse al final para el player porque su velocidad se usa en el calculo de los demas
    while ( NULL != (sprite=world_iterate_next(&iter)) ) {
        sprite_update(sprite);

        if (sprite->anim_state_id > 100) {
            printf("warning : anim state invalid\n");
        }
        
        if (abs(sprite->x-collision_x)<200.0) { // si estan cerca pueden colisionar
            collision_candidates[collision_candidates_n]=sprite;
            collision_candidates_n+=1;
        }
        if ((sprite->sprite_class->id==SPRCLS_ID_PEREGRINO || sprite->sprite_class->id==SPRCLS_ID_BORDONERO) && (sprite->anim_state_id<STID_WALKER_STOP || sprite->anim_state_id==STID_WALKER_RECEIVED_HIT)) {// || sprite->anim_state_id==STID_WALKER_RECEIVING_HIT)) {
            if (sprite->x<min_x && sprite->x>0) {
                min_x=sprite->x;
                min_v=sprite->vx;
            }
        }
        if (collision_bici_n<1 && sprite->sprite_class->id==SPRCLS_ID_BICI) {
            collision_bici_n+=1;
            collision_bici=sprite;
        }
        
        // posible destruccion de sprites lejanos cuidado no usar despues sprite
        if (sprite->x-world.cam_x < -100 && sprite->sprite_class->id<SPRCLS_ID_BICI ) {
            world_delete_sprite(iter.i);
        }
        if (sprite->x-world.cam_x > 2000 && sprite->sprite_class->id==SPRCLS_ID_BICI ) {
            world_delete_sprite(iter.i);
            audio_una_bici_menos();
        }
    }
    
    //if (collision_candidates_n>0) printf("collision candidates: %d\n",collision_candidates_n);
    
    item_iterate_init(&iiter);
    while ( NULL != (item=item_iterate_next(&world, &iiter)) ) {
        item_update(item);
        
        if (item->x<-800) {
            item_delete(&world,iiter.i);
        }
    }
    

    if (world.player.x>world.player_checkpoint) {
//        printf("checkpoint !!!\n");
        world.player_checkpoint+=7000.0;
        world.player_deadline=world.t+60.0;
    }
    
    if (!world.waiting_to_start) {
        if (world.player.anim_state_id!=STID_PLAYER_FALLEN) {
            world_lose_life(game_dt*c_life_loss_per_second);
        }
    }
        
    if ( ( world.player_deadline<world.t || world.player_vida<=0.0 ) && ( world.player.anim_state_id<STID_PLAYER_STOP || world.player.anim_state_id==STID_PLAYER_SIDE ) ) {
        if (world.player.anim_state_id!=STID_PLAYER_TIRED) {
            audio_stop_music();
            audio_play_player_clip(AUDIO_SND_GAMEOVER);
            stats_end_game_timedistance();
        }
        world.player.vx=0;
        sprite_set_state(&world.player, STID_PLAYER_TIRED);
    }
    
    if (world.player.anim_state_id<STID_PLAYER_STOP && (world.player_untouchable_time<=world.t) ) {
        if(min_x<90.0) {
            world.player.vx=0.5*min_v;
        } else if (min_x<100.0) {
            world.player.vx=min_v;        
        }
    }
    
    sprite_update(&world.player);
    
    // controles
    t_id player_state=world.player.anim_state_id;

    if (!world.waiting_to_start) {
        if (world.player.vx<c_v_fast && player_state<STID_PLAYER_STOP) world.player.vx+=c_v_a*game_dt;
    } else {
        if (world.t>world_waiting_to_start_time) {
            world.waiting_to_start=False;
            sprite_set_state(&world.player, STID_PLAYER_WALK);
        }
    }

    if ( game_salto_pressed && player_state<STID_PLAYER_STOP ) {
        sprite_set_state(&world.player, STID_PLAYER_PREPARINGJUMP);
        audio_play_player_clip(AUDIO_SND_SALTO);
    }
    if ( game_hit_pressed && player_state<STID_PLAYER_STOP ) {
//        audio_play_player_clip(AUDIO_SND_HIT);
        audio_play_golpe_inicio();
        sprite_set_state(&world.player, STID_PLAYER_PREPARINGHIT);
    }
    if ( game_esquivar_pressed && player_state<STID_PLAYER_STOP ) {
        world.player.vx=0;
        sprite_set_state(&world.player, STID_PLAYER_SIDE);
    }
    if ( game_stop_pressed && player_state<STID_PLAYER_STOP ) {
        world.player.vx=c_v_slow*.7+c_v_fast*.3;
        //world_gain_life(1.0);
        //sprite_set_state(&world.player, STID_PLAYER_STOP);
    }
//    if ( !game_stop_pressed && player_state==STID_PLAYER_STOP ) {
//        world.player.vx=c_v_slow;
//        sprite_set_state(&world.player, STID_PLAYER_WALK);
//    }
    if ( !game_esquivar_pressed && player_state==STID_PLAYER_SIDE ) {
        world.player.vx=c_v_slow;
        sprite_set_state(&world.player, STID_PLAYER_WALK);
    }
    
//    // el estado puede haber cambiado por los controles
//    player_state=world.player.anim_state_id;
//    if ( world.player_vida<.1 && player_state<STID_PLAYER_STOP ) {
//        world.player.vx=c_v_slow*1.5;
//    }
//    
//    if ( world.player_vida<.05 && player_state<STID_PLAYER_STOP ) {
//        world.player.vx=c_v_slow*1.0;
//    }
    
    // si tienes poca vida y aun no estas muerto declarate in panic
    if (world.player_vida<.3 &&  world.player.anim_state_id!=STID_PLAYER_TIRED ) {
        float vida=world.player_vida;
        int ifreq=(vida<0.1)?3:((vida<0.2)?2:1);
        ifreq=1; // anular frecuencia variable del warning
        audio_low_warning_play(ifreq);
        achievments_inpanicnow(true);
    } else {
        achievments_inpanicnow(false);
    }
    
    
    // colisiones
    if ( world.player.y <0.001 && world.player.vy<0.001 ) {
        if ( player_state==STID_PLAYER_JUMP ) {
            world.player.y=0;
            world.player.vy=0;
//            world.player.vx=c_v_fast;
            sprite_set_state(&world.player, STID_PLAYER_WALK);
            audio_play_player_clip(AUDIO_SND_CAIDABIEN);
        } else if ( player_state==STID_PLAYER_FALL ) {
            world.player.y=0;
            world.player.vy=0;
            //world.player.vx=c_v_slow*0.5;
            sprite_set_state(&world.player, STID_PLAYER_FALLEN);
            audio_play_player_clip(AUDIO_SND_CAIDA);
        } else if ( player_state==STID_PLAYER_FALLEN ) {
            world.player.vx-=c_v_fast*0.02;
            if (world.player.vx<0) world.player.vx=0;
        }
    }
    
    int i;
    for (i=0; i<collision_candidates_n; i++) {
        sprite=collision_candidates[i];
        // colisionan sprite y player ???
        world_handle_collision_candidate(&world.player, sprite);
    }
    
    item_iterate_init(&iiter);
    while ( NULL != (item=item_iterate_next(&world, &iiter)) ) {
        if (item->item_class->type==ITEM_CLS_TUMBA) continue;
        if (world_item_collision_check(&world.player, item) /* && player_state==STID_PLAYER_STOP */ ) {
            audio_play_player_clip(AUDIO_SND_COMER);
            if (item->item_class->type==ITEM_CLS_POWERUP_LIFE) {
                world_gain_life(1.0);                
            } else {
                world_gain_life(c_life_gain_per_food);
                achievments_eaten(item);
            }
            item_delete(&world,iiter.i);
            stats_add_comida(item->item_class->type);
        }
    }
    
    // vuelta extra para que las bicis arrasen
    // del collision candidates se ha quedado con una bici y prueba si colisiona con otros
    if (collision_bici_n>0 && collision_bici->x<1500.0) {
        world_iterate_sprites(&iter);
        while ( NULL != (sprite=world_iterate_next(&iter)) ) {
            if (sprite!=collision_bici) {
               
                if (world_nonplayer_collision_check(collision_bici,sprite)) {
                    if ( (sprite->sprite_class->id==SPRCLS_ID_PEREGRINO || sprite->sprite_class->id==SPRCLS_ID_BORDONERO) && sprite->anim_state_id<STID_WALKER_STOP) {
                        audio_play_other_clip(AUDIO_SND_CAIDA);
                        sprite_set_state(sprite, STID_WALKER_RECEIVING_HIT);
                        sprite->vx=0.0;
                    }
                }
            }
        }
    }
    
    //int i;
//	int min_i;
//	t_pos min_x=200;
//	t_v min_v=100;
//    for (i=0;i<MAX_N_WALKER;i++) {
//        if (world.walker_list[i].valid) {
//            world.walker_list[i].x+=(world.walker_list[i].v-world.player_vx)*game_dt;
//			if (!world.walker_list[i].apartado) {
//				if (world.walker_list[i].x<min_x) {
//					min_x=world.walker_list[i].x;
//					min_v=world.walker_list[i].v;
//					min_i=i;
//				}
//			}
//            // regenera rapido para probar
//            if (world.walker_list[i].x-world.cam_x<-25.0) {
//               // printf("regenerate now\n");
//                world.walker_list[i].x=480+world.cam_x+24-100*log(rand()*1.0/RAND_MAX);
//                world.walker_list[i].v=c_v_slow+5.0*(int)(4.0*(rand()*1.0/RAND_MAX));
//				world.walker_list[i].apartado=0;
//            }
//            
//        }
//    }
//
//    if (min_x<50) {
//		world.player_vx=min_v;
//		if (!world.player_slow) {
//			world.player_slow=1;
//			world.player_slow_since=world.t;
//		} else {
//			if (world.t-world.player_slow_since>3.0) {
//				world.walker_list[min_i].apartado=1;
//				world.walker_list[min_i].v=0;
//			}
//		}
//	
//	} else {
//		world.player_vx=c_v_fast;
//		world.player_slow=0;
//	}
//	
//	if (world.player.y<0.0001) {
//		world.player.y=0;
////		if (game_salto_pressed) {
////			world.player_vy=100;
////		}
//        }	
//    
    
    //genera
    
//    if (world.t > world.time_next_piligrim) {
//        int tipo=rand()%2;   // de momento 50 - 50 cambiar probabilidades
//        world_create_walker(1000.0, tipo);
//        world.time_next_piligrim=world.t+random_exp_time(20.0);
//    }    
//    if (world.t > world.time_next_cansado) {
//        world_create_walker(1000.0, 2);
//        world.time_next_cansado=world.t+random_exp_time(20.0);
//    }    
//    if (world.t > world.time_next_bici) {
//        world_create_walker(-400.0, 3);
//        world.time_next_bici=world.t+random_exp_time(20.0);
//    }
    
    
    //probando cosas mas creativas para la camara
    // camara on fuerza que proporcional a la distancia al punto deseado
    // y con rozamiento viscoso para que no oscile

    if (cam_type==0) {    
    
        t_pos cam_now,cam_target;
        cam_now=world.cam_x-world.player.vx*game_dt;
        cam_target=-c_cam_offset;
//
    world.cam_v+=250.0*(cam_target-cam_now)*game_dt-1.5*world.cam_v;

//    if (abs(world.cam_v)>500.0) world.cam_v=copysign(500.0,world.cam_v);
//        world.cam_v=copysign(200,(cam_target-cam_now));
    
        float smooth_alfa=0; // 0 no smooth
        
        t_pos cam_smooth=cam_now+world.cam_v*game_dt;
        world.cam_x=world.cam_x*smooth_alfa+cam_smooth*(1-smooth_alfa);
        
    
 //   if (world.cam_x>cam_target) {world.cam_x=cam_target;world.cam_v=world.player.vx;}
//    if (world.cam_x+200<cam_target) {world.cam_x=cam_target;world.cam_v=world.player.vx;}

//    if (world.cam_x<-300) {world.cam_x=-300; world.cam_v=world.player.vx;}
//    if (world.cam_x>-100) {world.cam_x=-100; world.cam_v=world.player.vx;}
    } else if (cam_type==1) {
        
        // camara simple con distancia maxima y minima
        t_pos max_cam_distance=300;
        t_pos min_cam_distance=200-10000*c_cam_init_free;
        t_pos cam_now=world.cam_x-world.player.vx*game_dt+world.cam_v*game_dt;
        if (cam_now<-max_cam_distance) {world.cam_v=world.player.vx;cam_now=-max_cam_distance;}
        if (cam_now>-min_cam_distance) {world.cam_v=0*world.player.vx;cam_now=-min_cam_distance;}
        world.cam_x=cam_now;
        // cuando la camara alcanza al jugador se acaba el estado inicial de camara
        if (c_cam_init_free && cam_now<-200) c_cam_init_free=0;
    
    } else if (cam_type==2) {
        // de momento la camara sigue al jugador siempre a una distancia
        world.cam_x=-c_cam_offset;
    }
    
    
//    if(game_hit_pressed) {
//        world.cam_x+=10;
//    }
//    if(game_esquivar_pressed) {
//        world.cam_x-=10;
//    }
    
    
    world_update_zones();
    generador_update();
    
    world.t+=game_dt;
    
    achievments_check_update();
}
Beispiel #8
0
int main(int argc, char** argv){
    printf("hello world\n");
    
    behaviors_init();
   
    log_file_open("log.txt");

    if (SDL_Init(SDL_INIT_EVERYTHING) == -1){
		printf("%s\n", SDL_GetError());
		return 1;
	}
    printf("sdl init success\n");

    SDL_Renderer *renderer = NULL;
    SDL_Window *window = NULL;
    
	//Setup our window and renderer
	window = SDL_CreateWindow("Stick Fighter", SDL_WINDOWPOS_CENTERED, 
                                               SDL_WINDOWPOS_CENTERED, 
                                               SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN);
	if (window == NULL){
		printf("%s\n", SDL_GetError());
		return 2;
	}
    renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
	if (renderer == NULL){
		printf("%s\n", SDL_GetError());
		return 3;
	}
    
    SDL_Texture *background1 = NULL;
    SDL_Texture *background2 = NULL;
    SDL_Texture *image = NULL;

    //background = sprite_load_image(renderer, "res/background_rcr.png");
    background1 = sprite_load_image(renderer, "res/background_rcr.png");
    background2 = sprite_load_image(renderer, "res/background_new.png");

    SDL_Texture* backgrounds[2];
    backgrounds[0] = background1;
    backgrounds[1] = background2;
    
    SDL_Rect bg;
    //Query the texture to get its width and height to use
    SDL_QueryTexture(background1, NULL, NULL, &bg.w, &bg.h);
    float bg_width = bg.w;
    float bg_height = bg.h;
    float world_width = bg_width / 10;
    float world_height = bg_height / 10;

    printf("bg_width: %f bg_height: %f world_width: %f world_height: %f\n", bg_width, bg_height, world_width, world_height);

    //printf("bg 1: [%p]\n", backgrounds[0]);
    //printf("bg 2: [%p]\n", backgrounds[1]);
	
    image = sprite_load_image(renderer, "res/output.png");
    //printf("after sprite load image\n");
        
    //load the meta info
    char* filename = "res/animation_meta_info.txt";
    DArray meta_info;
    darray_init(&meta_info);
    sprite_load_meta_file(filename, &meta_info);
    darray_print(&meta_info);

    float interval = 0.0f;
    float start = 0.0f;
    int quit = 0;
    
    float delay = 1000.0f / FPS;
    Sprite* player = sprite_create(PLAYER, WALK, 200, 300, delay, image);
    player->x_speed = 0;
    player->y_speed = 0;
    
    Sprite* enemy = sprite_create(ENEMY, WALK, 0, 300, delay, image);
    enemy->x_speed = 2;
    enemy->y_speed = 2;
    enemy->advance_frame = 1;
    //set white background
    SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255);
    
    pixel_to_world(bg_width, bg_height, world_width, world_height,
                   enemy->x, enemy->y, &enemy->location->coords->x, &enemy->location->coords->y);
    
    int dest_x = 0;
    int dest_y = 0;
    
    //TODO:
    //animations for punch and basic kick
    //animation for getting hit
    //animations for walk left and run left
    //2 more ai behaviors
    //health bars above units and health stats
    //dying animation
    //dying logic
    //generate enemies off screen and have them walk on to screen
    //redo tornado kick and spinning back kick so stick figure is same size
    //figure out how to color stick figure without having to make new sprites on sheet...need to make figures white to set modulation
    //add rolling punch move
    //add game state which keeps track of game state
    //add buy moves screen in between levels
    //add a generator which generates guys for 100 levels

    int i = 0;
    while (!quit){
        printf("iteration: %i\n", i);
		
        start = SDL_GetTicks();
        
        quit = player_input(player, &meta_info);
        //printf("quit: %i\n", quit);  
       
        //log_msg(LOG_DEBUG, "after player input: current frame: %i\n", player->current_frame[HIT]);
        
        //pixel location to world location
        pixel_to_world(bg_width, bg_height, world_width, world_height, 
                       player->x, player->y, &player->location->coords->x, &player->location->coords->y);

        //world location to pixel location
        world_to_pixel(bg_width, bg_height, world_width, world_height,
                       enemy->location->coords->x, enemy->location->coords->y, &dest_x, &dest_y);
        
        //boundry check
        boundry_check(SCREEN_WIDTH, SCREEN_HEIGHT, enemy, &meta_info, &dest_x, &dest_y);

        //printf("2nd before moveto = enemy x:%i enemy y:%i dest_x:%i dest_y:%i\n", enemy->x, enemy->y, dest_x, dest_y);
        
        //update enemy sprite by sprite's speed
        moveto_coordinates(enemy, dest_x, dest_y);
        
        //are we at the original world location in pixel coordinates?
        int arrived = within_coordinates(enemy, dest_x, dest_y);
        
        printf("arrived: %i\n", arrived);
        if(arrived == 1) {
            //wander(enemy); 
            // we reached last behavior's destination so do new AI behavior
            wander_stall_attack(player, enemy, &meta_info, 3);
        }

        sprite_update_bounding_box(player, &meta_info);
        sprite_update_bounding_box(enemy, &meta_info);

        //check collision
        int collision = sprite_check_collision(player, enemy);
        
        //printf("collision: %i\n", collision);
        
        if(collision) {
            sprite_handle_collision(player, enemy, &meta_info);
        }
        
        //handle collision
        //if animation is an attack then check frame range that triggers a hit
        //check if attack animation triggers a hi or low hit
        //if sequence of attacks is within delta time then 4th hit triggers a knockdown
        //if attack would make health below 0 then it triggers a knockdown
        
        //handle opposite attack from opposing sprite
        //if is in attack animation then check frame range for a hit

        //update animation frame
        sprite_update(player, &meta_info, renderer);
        sprite_update(enemy, &meta_info, renderer);
        
        //Rendering
		SDL_RenderClear(renderer);
       
        //printf("player->x: %i\n", player->x);
        //printf("moving right: %i\n", player->moving_right);
        //printf("moving left: %i\n", player->moving_left);
        int current_background = 0;
        sprite_draw_background(renderer, backgrounds, 2, &current_background, player->x, player->moving_right, player->moving_left, &player->scroll);
        
        sprite_draw_health_bar(renderer, player, &meta_info, 100); 
        sprite_draw_health_bar(renderer, enemy, &meta_info, 100); 
        
        //draw sprite
        sprite_render_frame(SCREEN_WIDTH, SCREEN_HEIGHT, player, &meta_info, renderer, 0);
        sprite_render_frame(bg_width, bg_height, enemy, &meta_info, renderer, 0);

		//Update the screen
		SDL_RenderPresent(renderer);
         
        interval = SDL_GetTicks() - start;
        
        if(interval > 0) {
            //float fps = 1.0f / (interval / 1000.0f);
            //printf("%f fps\n", fps);
        }
        i++;
	}
    
    //SDL_Delay(4000);

	//Destroy the various items
    sprite_destroy(player);
    sprite_destroy(enemy);
    darray_destroy(&meta_info);
	SDL_DestroyTexture(backgrounds[0]);
	SDL_DestroyTexture(backgrounds[1]);
	SDL_DestroyTexture(image);
	SDL_DestroyRenderer(renderer);
	SDL_DestroyWindow(window);
    
    printf("after destory text rend win\n");

	SDL_Quit();
    
    log_file_close();

    return 0;
}