fine tune of collision handling

This commit is contained in:
Sebastian Krzyszkowiak 2012-05-19 18:48:29 +02:00
parent c6e3707ab4
commit 160761e899
2 changed files with 20 additions and 6 deletions

View file

@ -141,7 +141,7 @@ bool Fly(struct Game *game, struct TM_Action *action, enum TM_ActionState state)
if (state != TM_ACTIONSTATE_RUNNING) return false;
if (!(action->arguments)) {
SelectDerpySpritesheet(game, "fly");
game->level.flying = true;
/*game->level.gg = true;*/
TM_AddBackgroundAction(&ShowMeter, NULL, 0, "showmeter");
}
action->arguments++;
@ -263,8 +263,8 @@ void Level_Draw(struct Game *game) {
SelectDerpySpritesheet(game, "fly");
game->level.flying = true;
game->level.sheet_speed = tps(game, 60*2.4);
}*/
if (!game->level.flying) game->level.sheet_speed = tps(game, 60*0.0020/game->level.speed);
}
if (!game->level.flying) game->level.sheet_speed = tps(game, 60*0.0020/game->level.speed); */
if (game->level.derpy_y < 0) game->level.derpy_y=0;
else if (game->level.derpy_y > 0.8) game->level.derpy_y=0.8;
}
@ -280,6 +280,7 @@ void Level_Draw(struct Game *game) {
int derpyy = game->level.derpy_y*al_get_display_height(game->display);
int derpyw = al_get_bitmap_width(game->level.derpy);
int derpyh = al_get_bitmap_height(game->level.derpy);
int derpyo = al_get_display_width(game->display)*0.1953125-al_get_bitmap_width(game->level.derpy); /* offset */
bool colision = false;
struct Obstacle *tmp = game->level.obstacles;
while (tmp) {
@ -290,7 +291,7 @@ void Level_Draw(struct Game *game) {
int w = al_get_bitmap_width(*(tmp->bitmap));
int h = al_get_bitmap_height(*(tmp->bitmap));
if (!tmp->hit)
if ((((x>=derpyx+0.36*derpyw) && (x<=derpyx+0.94*derpyw)) || ((x+w>=derpyx+0.36*derpyw) && (x+w<=derpyx+0.94*derpyw))) &&
if ((((x>=derpyx+0.38*derpyw+derpyo) && (x<=derpyx+0.94*derpyw+derpyo)) || ((x+w>=derpyx+0.38*derpyw+derpyo) && (x+w<=derpyx+0.94*derpyw+derpyo))) &&
(((y>=derpyy+0.26*derpyh) && (y<=derpyy+0.76*derpyh)) || ((y+h>=derpyy+0.26*derpyh) && (y+h<=derpyy+0.76*derpyh)))) {
tmp->hit=true;
game->level.hp+=tps(game, 60*0.0002*tmp->points);
@ -300,6 +301,8 @@ void Level_Draw(struct Game *game) {
}
}
al_draw_bitmap(*(tmp->bitmap), x, y, 0);
if (game->level.debug_show_sprite_frames) al_draw_rectangle(x, y, x+w, y+h, al_map_rgba(255,0,0,255), 3);
if (tmp->hit) colision = true;
tmp->x -= tps(game, game->level.speed*60)*310;
if (tmp->callback) tmp->callback(game, tmp);
@ -333,6 +336,14 @@ void Level_Draw(struct Game *game) {
al_draw_tinted_bitmap(game->level.derpy, al_map_rgba(255,255-colision*255,255-colision*255,255), derpyx+al_get_display_width(game->display)*0.1953125-al_get_bitmap_width(game->level.derpy), derpyy, 0);
/* if ((((x>=derpyx+0.36*derpyw) && (x<=derpyx+0.94*derpyw)) || ((x+w>=derpyx+0.36*derpyw) && (x+w<=derpyx+0.94*derpyw))) &&
(((y>=derpyy+0.26*derpyh) && (y<=derpyy+0.76*derpyh)) || ((y+h>=derpyy+0.26*derpyh) && (y+h<=derpyy+0.76*derpyh)))) {
*/
if (game->level.debug_show_sprite_frames) {
al_draw_rectangle(derpyx+derpyo, derpyy, derpyx+derpyw+derpyo, derpyy+derpyh, al_map_rgba(0,255,0,255), 3);
al_draw_rectangle(derpyx+0.38*derpyw+derpyo, derpyy+0.26*derpyh, derpyx+0.94*derpyw+derpyo, derpyy+0.76*derpyh, al_map_rgba(0,0,255,255), 3);
}
al_draw_bitmap(game->level.foreground, (-game->level.fg_pos)*al_get_bitmap_width(game->level.foreground), 0 ,0);
al_draw_bitmap(game->level.foreground, (1+(-game->level.fg_pos))*al_get_bitmap_width(game->level.foreground), 0 ,0);
@ -477,8 +488,8 @@ void Level_Load(struct Game *game) {
game->level.sheet_tmp = 0;
game->level.handle_input = false;
game->level.obstacles = NULL;
game->level.flying = false;
game->level.meter_alpha=0;
game->level.debug_show_sprite_frames=false;
al_clear_to_color(al_map_rgb(0,0,0));
if (game->level.current_level!=1) Moonwalk_Load(game);
else {
@ -529,9 +540,11 @@ int Level_Keydown(struct Game *game, ALLEGRO_EVENT *ev) {
} else if ((game->debug) && (ev->keyboard.keycode==ALLEGRO_KEY_F2)) {
game->level.hp -= 0.1;
if (game->level.hp <= 0) game->level.hp=0.001;
} else if ((game->debug) && (ev->keyboard.keycode==ALLEGRO_KEY_F3)) {
} else if ((game->debug) && (ev->keyboard.keycode==ALLEGRO_KEY_F3)) {
game->level.hp += 0.1;
if (game->level.hp > 1) game->level.hp=1;
} else if ((game->debug) && (ev->keyboard.keycode==ALLEGRO_KEY_F4)) {
game->level.debug_show_sprite_frames = !game->level.debug_show_sprite_frames;
}
if (game->level.current_level!=1) Moonwalk_Keydown(game, ev);
if (ev->keyboard.keycode==ALLEGRO_KEY_ESCAPE) {

View file

@ -121,6 +121,7 @@ struct Level {
ALLEGRO_BITMAP *derpy; /*!< Derpy sprite. */
ALLEGRO_BITMAP *meter_bmp; /*!< Bitmap of the HP meter. */
ALLEGRO_BITMAP *meter_image; /*!< Derpy image used in the HP meter. */
bool debug_show_sprite_frames; /*!< When true, displays colorful borders around spritesheets and their active areas. */
struct Spritesheet* derpy_sheets; /*!< List of sprite sheets of Derpy character. */
struct Spritesheet* pony_sheets; /*!< List of sprite sheets of character rescued by Derpy. */
struct {