Mercurial > touhou
comparison pytouhou/game/bullet.py @ 163:ee0bbde02c48
Implement player bullets in Bullet.
author | Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> |
---|---|
date | Sun, 16 Oct 2011 07:41:26 -0700 |
parents | 7e7368356445 |
children | 0595315d3880 |
comparison
equal
deleted
inserted
replaced
162:959c8b312918 | 163:ee0bbde02c48 |
---|---|
10 ## but WITHOUT ANY WARRANTY; without even the implied warranty of | 10 ## but WITHOUT ANY WARRANTY; without even the implied warranty of |
11 ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 11 ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
12 ## GNU General Public License for more details. | 12 ## GNU General Public License for more details. |
13 ## | 13 ## |
14 | 14 |
15 from math import cos, sin, atan2 | 15 from math import cos, sin, atan2, pi |
16 | 16 |
17 from pytouhou.utils.interpolator import Interpolator | 17 from pytouhou.utils.interpolator import Interpolator |
18 from pytouhou.vm.anmrunner import ANMRunner | 18 from pytouhou.vm.anmrunner import ANMRunner |
19 from pytouhou.game.sprite import Sprite | 19 from pytouhou.game.sprite import Sprite |
20 | 20 |
21 | 21 |
22 class Bullet(object): | 22 class Bullet(object): |
23 def __init__(self, pos, bullet_type, sprite_idx_offset, | 23 def __init__(self, pos, bullet_type, sprite_idx_offset, |
24 angle, speed, attributes, flags, player, game): | 24 angle, speed, attributes, flags, player, game, player_bullet=False): |
25 self._game = game | 25 self._game = game |
26 self._sprite = None | 26 self._sprite = None |
27 self._anmrunner = None | 27 self._anmrunner = None |
28 self._removed = False | 28 self._removed = False |
29 self._launched = False | 29 self._launched = False |
45 self.x, self.y = pos | 45 self.x, self.y = pos |
46 self.angle = angle | 46 self.angle = angle |
47 self.speed = speed | 47 self.speed = speed |
48 dx, dy = cos(angle) * speed, sin(angle) * speed | 48 dx, dy = cos(angle) * speed, sin(angle) * speed |
49 self.delta = dx, dy | 49 self.delta = dx, dy |
50 | |
51 self.player_bullet = player_bullet | |
50 | 52 |
51 #TODO | 53 #TODO |
52 if flags & 14: | 54 if flags & 14: |
53 if flags & 2: | 55 if flags & 2: |
54 index = bullet_type.launch_anim2_index | 56 index = bullet_type.launch_anim2_index |
66 bullet_type.launch_anim_offsets[sprite_idx_offset]) | 68 bullet_type.launch_anim_offsets[sprite_idx_offset]) |
67 self._anmrunner.run_frame() | 69 self._anmrunner.run_frame() |
68 else: | 70 else: |
69 self.launch() | 71 self.launch() |
70 | 72 |
71 self._sprite.angle = angle | 73 if self.player_bullet: |
74 self._sprite.angle = angle - pi | |
75 else: | |
76 self._sprite.angle = angle | |
72 | 77 |
73 | 78 |
74 def is_visible(self, screen_width, screen_height): | 79 def is_visible(self, screen_width, screen_height): |
75 tx, ty, tw, th = self._sprite.texcoords | 80 tx, ty, tw, th = self._sprite.texcoords |
76 x, y = self.x, self.y | 81 x, y = self.x, self.y |
90 if sprite_idx_offset is not None: | 95 if sprite_idx_offset is not None: |
91 self.sprite_idx_offset = sprite_idx_offset | 96 self.sprite_idx_offset = sprite_idx_offset |
92 | 97 |
93 bt = self._bullet_type | 98 bt = self._bullet_type |
94 self._sprite = Sprite() | 99 self._sprite = Sprite() |
95 self._sprite.angle = self.angle | 100 if self.player_bullet: |
101 self._sprite.angle = self.angle - pi | |
102 else: | |
103 self._sprite.angle = self.angle | |
96 self._anmrunner = ANMRunner(bt.anm_wrapper, bt.anim_index, | 104 self._anmrunner = ANMRunner(bt.anm_wrapper, bt.anim_index, |
97 self._sprite, self.sprite_idx_offset) | 105 self._sprite, self.sprite_idx_offset) |
98 self._anmrunner.run_frame() | 106 self._anmrunner.run_frame() |
99 | 107 |
100 | 108 |
113 | 121 |
114 def cancel(self): | 122 def cancel(self): |
115 # Cancel animation | 123 # Cancel animation |
116 bt = self._bullet_type | 124 bt = self._bullet_type |
117 self._sprite = Sprite() | 125 self._sprite = Sprite() |
118 self._sprite.angle = self.angle | 126 if self.player_bullet: |
127 self._sprite.angle = self.angle - pi | |
128 else: | |
129 self._sprite.angle = self.angle | |
119 self._anmrunner = ANMRunner(bt.anm_wrapper, bt.cancel_anim_index, | 130 self._anmrunner = ANMRunner(bt.anm_wrapper, bt.cancel_anim_index, |
120 self._sprite, bt.launch_anim_offsets[self.sprite_idx_offset]) | 131 self._sprite, bt.launch_anim_offsets[self.sprite_idx_offset]) |
121 self._anmrunner.run_frame() | 132 self._anmrunner.run_frame() |
133 self.delta = self.delta[0] / 2., self.delta[1] / 2. | |
122 | 134 |
123 # Change update method | 135 # Change update method |
124 self.update = self.update_cancel | 136 self.update = self.update_cancel |
125 | 137 |
126 # Do not use this one for collisions anymore | 138 # Do not use this one for collisions anymore |
127 self._game.bullets.remove(self) | 139 if self.player_bullet: |
140 self._game.players_bullets.remove(self) | |
141 else: | |
142 self._game.bullets.remove(self) | |
128 self._game.cancelled_bullets.append(self) | 143 self._game.cancelled_bullets.append(self) |
129 | 144 |
130 | 145 |
131 def update(self): | 146 def update(self): |
132 dx, dy = self.launch_delta | 147 dx, dy = self.launch_delta |