Пример #1
0
player_t *player_create(void){
	player_t *player = malloc(sizeof(player_t));
	
	player->body = body_create();
	player->sprite = sprite_create();
	
	player->flashing = 0;
   
	player->body->rect->x = 205;
	player->body->rect->y = 128;
	player->body->rect->w = 30;
	player->body->rect->h = 38;
	
	player->fall_speed = 10.0;
	player->fall_accel = 0.35;
	
	player->ground_speed = 4.00;
	player->ground_accel = 0.25;
	player->ground_decel = 0.25;
	
	player->jump_force = -8.2;
	player->jump_brake = -3.0;

	player->face_dir = DIR_R;
	player->ctrl_dir = DIR_X;
	player->move_dir = DIR_X;

	return player;
}
Пример #2
0
void animation_create(animation *ani, void *src, int id) {
    sd_animation *sdani = (sd_animation*)src;

    // Copy simple stuff
    ani->id = id;
    ani->start_pos = vec2i_create(sdani->start_x, sdani->start_y);
    str_create_from_cstr(&ani->animation_string, sdani->anim_string);

    // Copy collision coordinates
    vector_create(&ani->collision_coords, sizeof(collision_coord));
    collision_coord tmp_coord;
    for(int i = 0; i < sdani->col_coord_count; i++) {
        tmp_coord.pos = vec2i_create(sdani->col_coord_table[i].x, sdani->col_coord_table[i].y);
        tmp_coord.frame_index = sdani->col_coord_table[i].y_ext;
        vector_append(&ani->collision_coords, &tmp_coord);
    }

    // Copy extra strings
    vector_create(&ani->extra_strings, sizeof(str));
    str tmp_string;
    for(int i = 0; i < sdani->extra_string_count; i++) {
        str_create_from_cstr(&tmp_string, sdani->extra_strings[i]);
        vector_append(&ani->extra_strings, &tmp_string);
        // don't str_free tmp_str here because it will free the pointers
        // inside it, which vector_append does not copy
    }

    // Handle sprites
    vector_create(&ani->sprites, sizeof(sprite));
    sprite tmp_sprite;
    for(int i = 0; i < sdani->frame_count; i++) {
        sprite_create(&tmp_sprite, (void*)sdani->sprites[i], i);
        vector_append(&ani->sprites, &tmp_sprite);
    }
}
Пример #3
0
static void collide_world(sprite_t *this_sprite, int x, int y)
{
  sprite_t *s;

  s = sprite_create(&explosion,NULL);
  sprite_set_pos(s,x,y);
  sprite_group_insert(effects_group,s);
  sprite_kill(this_sprite);
}
Пример #4
0
item_t *item_create(void){
	item_t *item = malloc(sizeof(item_t));
	
	item->type = 0;
	item->body = body_create();
	item->sprite = sprite_create();
	item->flags = 0;
	
	return item;
}
Пример #5
0
static void crashing_trigger(sprite_t *s)
{
	sprite_t *p;
	float v[2] = {0,-20};
	p = sprite_create(&blacksmoke,NULL);
	sprite_set_pos(p,s->x,s->y);
	sprite_set_vel(p,v);
	sprite_group_insert(effects_group,p);
	create_effect(&fire,s->x,s->y);
}
Пример #6
0
int main(void)
{
	//Create game object
	zephyrjc_t *game = zephyrjc_init();

	//Init graphics
	zephyrjc_init_graphics(game, 640, 480, 32);

	//Init keyboard
	zephyrjc_keyboard_init(game);

	//Create scenario and set as current
	scenario_t *test_scenario = scenario_create(game);
	zephyrjc_set_current_scenario(game, test_scenario);

	//Create an abstract object
	object_t *obj = object_create(test_scenario);

	//Add transform component to object
	component_t *transform = transform_create(obj);

	//Add tilemap
	component_t *tileengine = tileengine_create(obj);
	tilepool_t *tp = create_tilepool("tiles.png", 16, 16, 0, 0, 55, 36);

	uint16_t test_array[36][55];
	for(int y=0;y<36;y++)
	{
		for (int x=0;x<55;x++)
		{
			test_array[y][x] = x+y*55;
		}
	}

	tilemap_t *tilemap = create_tilemap(tp, (uint16_t*) *test_array, 55, 36, 0);
	tileengine_t *cte = (tileengine_t*) tileengine;
	cte->current_tilemap = tilemap;
	cte->source.x = 0;
	cte->source.y = 0;
	cte->source.w = 640;
	cte->source.h = 480;

	//Add sprite component to object. Set sprite
	sprite_t *sp = (sprite_t*) sprite_create(obj);
	spriteBuffer_t *sprite = create_sprite();
	load_bmp(sprite, "mario.png");
	sprite_set(sp, sprite);

	//Start Zephyr Jarlsberg & Chedar engine
	zephyrjc_start(game);
	return 0;
}
Пример #7
0
static void collide(sprite_t *this_sprite,
		    sprite_t *other_sprite,
		    int x, int y)
{
  sprite_t *s;
  float n[2];

  if (other_sprite->type == &missile)
    return;
  s = sprite_create(&dsmoke,NULL);
  sprite_set_pos(s,x,y);
  sprite_get_vel(this_sprite, n);
  s->anim_p = ((vangle(n) + 128) & 255)/8 ;
  sprite_get_vel(other_sprite,n);
  sprite_set_vel(s,n);
  sprite_group_insert(effects_group,s);
  sprite_kill(this_sprite);
}
Пример #8
0
void scorekeeper()
{
	char cbuf[500];
	char cbuf2[40];
	sprite_t *s;
	int i;
	update_teams_score(nbTeams,nbPlayers);

	int endOfGame=0;
	int maxscore = 0;
	/** une équipe atteint le score max**/
	for (i = 0; i < nbTeams; i++){
		if (teams[i].points>=max_points)
			endOfGame=1;
		if (teams[i].points>maxscore)
			maxscore=teams[i].points;
	}
	/** le temps est écoulé **/
	if (sprite_global.game_clock>timeToStop)
		endOfGame=1;

	if(endOfGame){
		sprintf(cbuf,"Les gagnants sont :\n");
		for (i = 0; i < nbTeams; i++){
			if(teams[i].points==maxscore){
				/*<string-array name="colors">
			        <item>vert Clair</item>
			        <item>Rouge</item>
			        <item>Bleu</item>
			        <item>Jaune</item>
			        <item>Turquoise</item>
			        <item>Violet</item>
			        <item>Orange</item>
			        <item>Gris</item>
			        <item>Vert Foncé</item>
			        <item>Bleu Foncé</item>
			    </string-array>*/

				switch (i){
				case 0:
					sprintf(cbuf2,"     Les Verts Clairs \n");
					break;
				case 1:
					sprintf(cbuf2,"     Les Rouges \n");
					break;
				case 2:
					sprintf(cbuf2,"     Les Bleus \n");
					break;
				case 3:
					sprintf(cbuf2,"     Les Jaunes \n");
					break;
				case 4:
					sprintf(cbuf2,"     Les Turquoises \n");
					break;
				case 5:
					sprintf(cbuf2,"     Les Violets \n");
					break;
				case 6:
					sprintf(cbuf2,"     Les Oranges \n");
					break;
				case 7:
					sprintf(cbuf2,"     Les Gris \n");
					break;
				case 8:
					sprintf(cbuf2,"     Les Verts Foncés \n");
					break;
				case 9:
					sprintf(cbuf2,"     Les Bleus Foncés \n");
					break;
				default:
					break;
				}

				//sprintf(cbuf2,"     Team %d\n",i);
				strcat(cbuf,cbuf2);
			}
		}
		sprintf(cbuf2,"\n\n %d points\n",maxscore);
		strcat(cbuf,cbuf2);
		message_time(cbuf,10);
		message_time("Starting in 3",1);
		message_time("Starting in 2",1);
		message_time("Starting in 1",1);
		message_time("GO !",1);

		init_spawn_delays();
		int j;
		for (j = 0; j< nbTeams; j++){
			teams[j].points=0;
		}

		for (j = 0; j < playerCount; j++){
			players[j].points=0;
			sprite_kill(players[j].sprite);
		}
		timeToStop=sprite_global.game_clock+1000*cfgnum("game.max_duration",60);
		return;

	}



	for (i = 0; i < playerCount; i++)
	{
		if (!sprite_isvalid(&(players[i].controller->target)))
		{
			if (!players[i].spawnTimer){
				sprite_release(&(players[i].sprite));
				sprite_timer_set(&(players[i].spawnTimer),players[i].timeBeforeRespawn);
				printf("timer set player %d %d\n", i ,players[i].timeBeforeRespawn );

			}else{
				if (sprite_timer_finished(players[i].spawnTimer)){
					s = sprite_create(players[i].sprite_type,&players[i]);
					sprite_aquire(s, &(players[i].sprite));
					sprite_aquire(players[i].sprite, &(players[i].controller->target));
					assert(sprite_isvalid(&(players[i].controller->target)));
					s = players[i].sprite;
					sprite_group_insert(mech_group, s);
					sprite_set_pos(s, players[i].startpos[0], players[i].startpos[1]);

					players[i].spawnTimer=NULL;
				}
			}
		}
	}
}
Пример #9
0
void objects_setup(void)
{
	int i, x, y;
	sprite_t *sp;
	float v[2];

	srand(23);

	sprite_t *s;

	for (i=0;i<nbTeams;i++){
		s = sprite_create(&teamicon,&teams[i]);
		sprite_set_pos(s,75+100*(i), sprite_global.display->h - 75);
		sprite_group_insert(ui_group, s);
	}

	for (i=0;i<nbTeams;i++){

		int x = 190+300*(i%5);
		int y = 80;
		if (i>4)
			y+=400;

		s = sprite_create(&teamicon,&teams[i]);
		sprite_set_pos(s,x, y);
		sprite_group_insert(ui_group_connect, s);
	}


	/*sp = sprite_create(&bonusmachine);
	 sprite_group_insert(mech_group,sp);
	 sprite_set_pos(sp,level.xmax/2,15);*/

	/*for (i=0;i<3;i++)
	 {
	 sp = sprite_create(&bird);
	 sprite_group_insert(mech_group,sp);
	 }*/

	/*for (i=0;i<5;i++)
	 {
	 sp = sprite_create(&bouncer);
	 sprite_group_insert(mech_group,sp);
	 sprite_set_pos(sp,rand() % 700 + 50,rand() % 200 + 100);
	 }*/

	/*sp = sprite_create(&cloud);
	 sprite_group_insert(foreground_group,sp);
	 sprite_set_pos(sp,400,70);
	 v[0] = 15; v[1] = 0;
	 sprite_set_vel(sp,v);*/

	/*sp = sprite_create(&cloud);
	 sprite_group_insert(foreground_group,sp);
	 sprite_set_pos(sp,0,150);
	 v[0] = 10; v[1] = 0;
	 sprite_set_vel(sp,v);*/

	/*sp = sprite_create(&zeppelin);
	 sprite_group_insert(mech_group,sp);
	 sprite_set_pos(sp,50,200);*/

	/*sp = sprite_create(&airballoon);
	 sprite_group_insert(mech_group,sp);
	 sprite_set_pos(sp,100,150);
	 v[0] = 5; v[1] = 3;
	 sprite_set_vel(sp,v);*/

	/*sp = sprite_create(&cannon);
	 sprite_group_insert(mech_group,sp);
	 sprite_set_pos(sp,380,518);*/
}
Пример #10
0
static void sigget(sprite_t *s, int signal, void *data)
{
	float v[2] = {0,0};
	sprite_t *p;
	float r[2];
	int sigabs;

	switch(signal)
	{
	case SIGNAL_CANCONTROL:
		*(int *)data = !(s->state & PLANE_CRASHING);
		break;
	case SIGNAL_DAMAGE:
		((mech_sprite_t *)s)->damage += *(int *)data;
		((player_t*)s->owner)->damage=(100*((mech_sprite_t *)s)->damage)/hitpoints;
		break;
	case SIGNAL_LAST_ENNEMI:
		((player_t*)s->owner)->lastEnnemi=(player_t*)data;
		break;
	case SIGNAL_ACCELERATE:
		s->state |= PLANE_ACCELERATING;
		break;
	case -SIGNAL_ACCELERATE:
		s->state &= ~PLANE_ACCELERATING;
		break;
	case SIGNAL_UP:
		s->state |= PLANE_UP;
		s->state &= ~PLANE_DOWN;
		break;
	case -SIGNAL_UP:
		s->state &= ~PLANE_UP;
		break;
	case SIGNAL_DOWN:
		s->state |= PLANE_DOWN;
		s->state &= ~PLANE_UP;
		break;
	case -SIGNAL_DOWN:
		s->state &= ~PLANE_DOWN;
		break;
	case SIGNAL_FIRE: /* create bullet */
		if (sprite_timer_finished(((struct biplane*)s)->gun_timer) &&
				!(s->state & PLANE_CRASHING))
		{
			sound_effect(&sound_gunfire,s->x,s->y);
			p = sprite_create(((struct biplane*)s)->bullet_type,s->owner);
			//p->owner=s->owner;
			sprite_group_insert(bullet_group,p);
			r[0] = mech_heading((mech_sprite_t *)s)[0];
			r[1] = mech_heading((mech_sprite_t *)s)[1];
			vmul(r,21); /* Find start of bullet in clumsy way */
			vrot(r,-9);
			sprite_set_pos(p,s->x + r[0],s->y + r[1]);
			sprite_get_vel(s,v);
			vmadd(v,200,mech_heading((mech_sprite_t *)s));
			sprite_set_vel(p,v);
			/* cannot fire again in some time */
			sprite_timer_set(&(((struct biplane*)s)->gun_timer),bullet_delay);
		}
		break;
	case SIGNAL_NUM0: /* create bomb */
		if (sprite_timer_finished(((struct biplane*)s)->bomb_timer) &&
				(!(s->state & PLANE_CRASHING)) &&
				(((struct biplane*)s)->nr_bombs > 0))
		{
			((struct biplane*)s)->nr_bombs--;
			p = sprite_create(&bomb,s->owner);
			p->anim_p = s->anim_p;
			((mech_sprite_t *)p)->angle = ((mech_sprite_t *)s)->angle;
			r[0] = mech_heading((mech_sprite_t *)s)[0];
			r[1] = mech_heading((mech_sprite_t *)s)[1];
			vmul(r,14);
			vrot(r,-80);
			sprite_set_pos(p,s->x + r[0],s->y + r[1]);
			sprite_get_vel(s,v);
			vmadd(v,5,r);
			sprite_set_vel(p,v);
			sprite_group_insert(bomb_group,p);
			sprite_timer_set(&(((struct biplane*)s)->bomb_timer),
					bomb_delay);
		}
		break;
	case SIGNAL_NUM1: /* jump ship */
		if (sprite_timer_finished(((struct biplane*)s)->bomb_timer) &&
				(!(s->state & PLANE_CRASHING)))
		{
			p = sprite_create(&parachute,NULL);
			r[0] = mech_heading((mech_sprite_t *)s)[0];
			r[1] = mech_heading((mech_sprite_t *)s)[1];
			vmul(r,14);
			vrot(r,80);
			sprite_set_pos(p,s->x + r[0],s->y + r[1]);
			sprite_get_vel(s,v);
			vmadd(v,5,r);
			sprite_set_vel(p,v);
			sprite_group_insert(mech_group,p);
			sprite_timer_set(&(((struct biplane*)s)->bomb_timer),bomb_delay);
		}
		break;
	case SIGNAL_KILL:
		create_effect(&explosion,s->x,s->y);
		sprite_kill(s);
		break;
	case SIGNAL_ISHARMLESS:
		if (s->state & PLANE_CRASHING)
			((struct signal_reply *)data)->reply = 1;
		break;
	case SIGNAL_STATSTRING://TTODO : useless ?
		sprintf(data,"%i bombs",((struct biplane*)s)->nr_bombs);
		break;
	default:
		break;
	}
}
Пример #11
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;
}