-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathbullet.c
130 lines (108 loc) · 3.74 KB
/
bullet.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
#include <stdio.h>
#include <stdlib.h>
#include "tile.h"
#include "bullet.h"
static int bullet_collision_right(bullet_t *bullet, tile_t map[TILEMAP_WIDTH * TILEMAP_HEIGHT]) {
int idx = 0;
for (idx = 0; idx < TILEMAP_WIDTH * TILEMAP_HEIGHT; idx++) {
if (map[idx].sprites[0] != 0 && map[idx].mod == BRICK) {
if(map[idx].is_inside(&map[idx], bullet->tile->x+10, bullet->tile->y+1)) {
return 1;
}
if (map[idx].is_inside(&map[idx], bullet->tile->x+10, bullet->tile->y+1)) {
return 1;
}
}
}
return 0;
}
static int bullet_collision_left(bullet_t *bullet, tile_t map[TILEMAP_WIDTH * TILEMAP_HEIGHT]) {
int idx = 0;
for (idx = 0; idx < TILEMAP_WIDTH * TILEMAP_HEIGHT; idx++) {
if (map[idx].sprites[0] != 0 && map[idx].mod == BRICK) {
if (map[idx].is_inside(&map[idx], bullet->tile->x - 2, bullet->tile->y + 1)) {
return 1;
}
if (map[idx].is_inside(&map[idx], bullet->tile->x - 2, bullet->tile->y + 1)) {
return 1;
}
}
}
return 0;
}
static void bullet_tick(bullet_t *bullet, tile_t map[TILEMAP_WIDTH * TILEMAP_HEIGHT],
int deadzone_left, int deadzone_right) {
printf("bullet-tick x=%d, y=%d \n", bullet->tile->x, bullet->tile->y);
if (bullet->state == BULLET_STATE_DEAD) {
return;
}
bullet->tile->x+=bullet->speed_x;
if (bullet->tile->x >= deadzone_right) {
bullet->state = BULLET_STATE_DEAD;
}
if (bullet->tile->x <= deadzone_left) {
bullet->state = BULLET_STATE_DEAD;
}
if (bullet_collision_right(bullet, map) || bullet_collision_left(bullet, map)) {
bullet->state = BULLET_STATE_DEAD;
}
}
static int bullet_is_dead(bullet_t *bullet) {
return (bullet->state == BULLET_STATE_DEAD) ? 1 : 0;
}
static int bullet_get_sprite(tile_t *tile) {
bullet_t *bullet = (bullet_t *)tile->context;
if (bullet->state == BULLET_STATE_FLYING_LEFT) {
return SPRITE_IDX_BULLET_LEFT;
} else {
return SPRITE_IDX_BULLET_RIGHT;
}
}
/* Create a bullet that flys left */
bullet_t* bullet_create_left(int x, int y) {
bullet_t *bullet = malloc(sizeof(bullet_t));
// According to measurements a bullet moves 2 pixels per tick
bullet->speed_x = -2;
bullet->state = BULLET_STATE_FLYING_LEFT;
bullet->steps = 0;
bullet->tick = &bullet_tick;
bullet->is_dead = &bullet_is_dead;
bullet->tile = malloc(sizeof(tile_t));
bullet->tile->x = x;
bullet->tile->y = y;
bullet->tile->width = 2;
bullet->tile->height = 2;
bullet->tile->collision_dx = 0;
bullet->tile->collision_dy = 0;
bullet->tile->collision_dw = 0;
bullet->tile->collision_dh = 0;
bullet->tile->tick = NULL;
bullet->tile->is_inside = NULL;
bullet->tile->context = bullet;
bullet->tile->get_sprite = &bullet_get_sprite;
return bullet;
}
/* Create a bullet that flys right */
bullet_t* bullet_create_right(int x, int y) {
bullet_t *bullet = malloc(sizeof(bullet_t));
// According to measurements a bullet moves 2 pixels per tick
bullet->speed_x = 2;
bullet->state = BULLET_STATE_FLYING_RIGHT;
bullet->steps = 0;
bullet->tick = &bullet_tick;
bullet->is_dead = &bullet_is_dead;
bullet->tile = malloc(sizeof(tile_t));
bullet->tile->x = x;
bullet->tile->y = y;
bullet->tile->width = 2;
bullet->tile->height = 2;
bullet->tile->collision_dx = 0;
bullet->tile->collision_dy = 0;
bullet->tile->collision_dw = 0;
bullet->tile->collision_dh = 0;
bullet->tile->tick = NULL;
bullet->tile->is_inside = NULL;
bullet->tile->context = bullet;
bullet->tile->get_sprite = &bullet_get_sprite;
return bullet;
}