Mercurial > touhou
annotate pytouhou/game/bullet.pyx @ 310:81c5b0b51093
Implement hardcoded function 11.
author | Thibaut Girka <thib@sitedethib.com> |
---|---|
date | Wed, 14 Mar 2012 17:00:43 +0100 |
parents | f3099ebf4f61 |
children | 0f88ae611d37 |
rev | line source |
---|---|
84 | 1 # -*- encoding: utf-8 -*- |
2 ## | |
3 ## Copyright (C) 2011 Thibaut Girka <thib@sitedethib.com> | |
4 ## | |
5 ## This program is free software; you can redistribute it and/or modify | |
6 ## it under the terms of the GNU General Public License as published | |
7 ## by the Free Software Foundation; version 3 only. | |
8 ## | |
9 ## This program is distributed in the hope that it will be useful, | |
10 ## but WITHOUT ANY WARRANTY; without even the implied warranty of | |
11 ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
12 ## GNU General Public License for more details. | |
13 ## | |
14 | |
163
ee0bbde02c48
Implement player bullets in Bullet.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
161
diff
changeset
|
15 from math import cos, sin, atan2, pi |
84 | 16 |
86
a87a3c080585
Handle a few attack flags
Thibaut Girka <thib@sitedethib.com>
parents:
85
diff
changeset
|
17 from pytouhou.utils.interpolator import Interpolator |
84 | 18 from pytouhou.vm.anmrunner import ANMRunner |
19 from pytouhou.game.sprite import Sprite | |
20 | |
21 | |
256
507dfd6efe0c
Refactor pytouhou.game.bullet.
Thibaut Girka <thib@sitedethib.com>
parents:
255
diff
changeset
|
22 LAUNCHING, LAUNCHED, CANCELLED = range(3) |
236
741860192b56
Implement ANM0 interrupts
Thibaut Girka <thib@sitedethib.com>
parents:
232
diff
changeset
|
23 |
257
9b699e8de4a7
Switch Bullet to Cython to improve performances.
Thibaut Girka <thib@sitedethib.com>
parents:
256
diff
changeset
|
24 cdef class Bullet(object): |
9b699e8de4a7
Switch Bullet to Cython to improve performances.
Thibaut Girka <thib@sitedethib.com>
parents:
256
diff
changeset
|
25 cdef public unsigned int _state, flags, frame, sprite_idx_offset |
9b699e8de4a7
Switch Bullet to Cython to improve performances.
Thibaut Girka <thib@sitedethib.com>
parents:
256
diff
changeset
|
26 cdef public double dx, dy, angle, speed #TODO |
9b699e8de4a7
Switch Bullet to Cython to improve performances.
Thibaut Girka <thib@sitedethib.com>
parents:
256
diff
changeset
|
27 cdef public object player_bullet, target |
304
f3099ebf4f61
Update attribute names to reflect the actual interface.
Thibaut Girka <thib@sitedethib.com>
parents:
267
diff
changeset
|
28 cdef public object _game, _bullet_type |
f3099ebf4f61
Update attribute names to reflect the actual interface.
Thibaut Girka <thib@sitedethib.com>
parents:
267
diff
changeset
|
29 cdef public object sprite, anmrunner, removed, was_visible |
257
9b699e8de4a7
Switch Bullet to Cython to improve performances.
Thibaut Girka <thib@sitedethib.com>
parents:
256
diff
changeset
|
30 cdef public object attributes, damage, hitbox_half_size, speed_interpolator, grazed |
9b699e8de4a7
Switch Bullet to Cython to improve performances.
Thibaut Girka <thib@sitedethib.com>
parents:
256
diff
changeset
|
31 cdef public object x, y #TODO |
9b699e8de4a7
Switch Bullet to Cython to improve performances.
Thibaut Girka <thib@sitedethib.com>
parents:
256
diff
changeset
|
32 |
123 | 33 def __init__(self, pos, bullet_type, sprite_idx_offset, |
232
8843e26f80c3
Hopefully implement “accelerating” bullets
Thibaut Girka <thib@sitedethib.com>
parents:
220
diff
changeset
|
34 angle, speed, attributes, flags, target, game, |
220
0595315d3880
Fix SHT handling; change a few things to be closer to ZUN’s mind; and first stub of PCB support.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
163
diff
changeset
|
35 player_bullet=False, damage=0, hitbox=None): |
151
5cf927cbd9c5
Merge GameState into Game. TODO: Merge PlayerState into Player
Thibaut Girka <thib@sitedethib.com>
parents:
149
diff
changeset
|
36 self._game = game |
123 | 37 self._bullet_type = bullet_type |
256
507dfd6efe0c
Refactor pytouhou.game.bullet.
Thibaut Girka <thib@sitedethib.com>
parents:
255
diff
changeset
|
38 self._state = LAUNCHING |
304
f3099ebf4f61
Update attribute names to reflect the actual interface.
Thibaut Girka <thib@sitedethib.com>
parents:
267
diff
changeset
|
39 self.sprite = None |
f3099ebf4f61
Update attribute names to reflect the actual interface.
Thibaut Girka <thib@sitedethib.com>
parents:
267
diff
changeset
|
40 self.anmrunner = None |
f3099ebf4f61
Update attribute names to reflect the actual interface.
Thibaut Girka <thib@sitedethib.com>
parents:
267
diff
changeset
|
41 self.removed = False |
f3099ebf4f61
Update attribute names to reflect the actual interface.
Thibaut Girka <thib@sitedethib.com>
parents:
267
diff
changeset
|
42 self.was_visible = True |
84 | 43 |
220
0595315d3880
Fix SHT handling; change a few things to be closer to ZUN’s mind; and first stub of PCB support.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
163
diff
changeset
|
44 if hitbox: |
0595315d3880
Fix SHT handling; change a few things to be closer to ZUN’s mind; and first stub of PCB support.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
163
diff
changeset
|
45 self.hitbox_half_size = (hitbox[0] / 2., hitbox[1] / 2.) |
0595315d3880
Fix SHT handling; change a few things to be closer to ZUN’s mind; and first stub of PCB support.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
163
diff
changeset
|
46 else: |
0595315d3880
Fix SHT handling; change a few things to be closer to ZUN’s mind; and first stub of PCB support.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
163
diff
changeset
|
47 self.hitbox_half_size = (bullet_type.hitbox_size / 2., bullet_type.hitbox_size / 2.) |
142
c7f0fd9d2145
Simple collision detection
Thibaut Girka <thib@sitedethib.com>
parents:
127
diff
changeset
|
48 |
86
a87a3c080585
Handle a few attack flags
Thibaut Girka <thib@sitedethib.com>
parents:
85
diff
changeset
|
49 self.speed_interpolator = None |
a87a3c080585
Handle a few attack flags
Thibaut Girka <thib@sitedethib.com>
parents:
85
diff
changeset
|
50 self.frame = 0 |
a87a3c080585
Handle a few attack flags
Thibaut Girka <thib@sitedethib.com>
parents:
85
diff
changeset
|
51 self.grazed = False |
a87a3c080585
Handle a few attack flags
Thibaut Girka <thib@sitedethib.com>
parents:
85
diff
changeset
|
52 |
232
8843e26f80c3
Hopefully implement “accelerating” bullets
Thibaut Girka <thib@sitedethib.com>
parents:
220
diff
changeset
|
53 self.target = target |
84 | 54 |
55 self.sprite_idx_offset = sprite_idx_offset | |
56 | |
57 self.flags = flags | |
58 self.attributes = list(attributes) | |
59 | |
60 self.x, self.y = pos | |
61 self.angle = angle | |
62 self.speed = speed | |
256
507dfd6efe0c
Refactor pytouhou.game.bullet.
Thibaut Girka <thib@sitedethib.com>
parents:
255
diff
changeset
|
63 self.dx, self.dy = cos(angle) * speed, sin(angle) * speed |
84 | 64 |
163
ee0bbde02c48
Implement player bullets in Bullet.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
161
diff
changeset
|
65 self.player_bullet = player_bullet |
220
0595315d3880
Fix SHT handling; change a few things to be closer to ZUN’s mind; and first stub of PCB support.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
163
diff
changeset
|
66 self.damage = damage |
163
ee0bbde02c48
Implement player bullets in Bullet.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
161
diff
changeset
|
67 |
122
174324a4da51
Add support for launch animations! (Warning: slow :()
Thibaut Girka <thib@sitedethib.com>
parents:
120
diff
changeset
|
68 #TODO |
174324a4da51
Add support for launch animations! (Warning: slow :()
Thibaut Girka <thib@sitedethib.com>
parents:
120
diff
changeset
|
69 if flags & 14: |
174324a4da51
Add support for launch animations! (Warning: slow :()
Thibaut Girka <thib@sitedethib.com>
parents:
120
diff
changeset
|
70 if flags & 2: |
123 | 71 index = bullet_type.launch_anim2_index |
72 launch_mult = bullet_type.launch_anim_penalties[0] | |
122
174324a4da51
Add support for launch animations! (Warning: slow :()
Thibaut Girka <thib@sitedethib.com>
parents:
120
diff
changeset
|
73 elif flags & 4: |
123 | 74 index = bullet_type.launch_anim4_index |
75 launch_mult = bullet_type.launch_anim_penalties[1] | |
122
174324a4da51
Add support for launch animations! (Warning: slow :()
Thibaut Girka <thib@sitedethib.com>
parents:
120
diff
changeset
|
76 else: |
123 | 77 index = bullet_type.launch_anim8_index |
78 launch_mult = bullet_type.launch_anim_penalties[2] | |
256
507dfd6efe0c
Refactor pytouhou.game.bullet.
Thibaut Girka <thib@sitedethib.com>
parents:
255
diff
changeset
|
79 self.dx, self.dy = self.dx * launch_mult, self.dy * launch_mult |
304
f3099ebf4f61
Update attribute names to reflect the actual interface.
Thibaut Girka <thib@sitedethib.com>
parents:
267
diff
changeset
|
80 self.sprite = Sprite() |
f3099ebf4f61
Update attribute names to reflect the actual interface.
Thibaut Girka <thib@sitedethib.com>
parents:
267
diff
changeset
|
81 self.anmrunner = ANMRunner(bullet_type.anm_wrapper, |
f3099ebf4f61
Update attribute names to reflect the actual interface.
Thibaut Girka <thib@sitedethib.com>
parents:
267
diff
changeset
|
82 index, self.sprite, |
123 | 83 bullet_type.launch_anim_offsets[sprite_idx_offset]) |
304
f3099ebf4f61
Update attribute names to reflect the actual interface.
Thibaut Girka <thib@sitedethib.com>
parents:
267
diff
changeset
|
84 self.anmrunner.run_frame() |
122
174324a4da51
Add support for launch animations! (Warning: slow :()
Thibaut Girka <thib@sitedethib.com>
parents:
120
diff
changeset
|
85 else: |
174324a4da51
Add support for launch animations! (Warning: slow :()
Thibaut Girka <thib@sitedethib.com>
parents:
120
diff
changeset
|
86 self.launch() |
88
2cc60137d368
Ugly implementation of three new attack flags.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
86
diff
changeset
|
87 |
163
ee0bbde02c48
Implement player bullets in Bullet.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
161
diff
changeset
|
88 if self.player_bullet: |
304
f3099ebf4f61
Update attribute names to reflect the actual interface.
Thibaut Girka <thib@sitedethib.com>
parents:
267
diff
changeset
|
89 self.sprite.angle = angle - pi |
163
ee0bbde02c48
Implement player bullets in Bullet.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
161
diff
changeset
|
90 else: |
304
f3099ebf4f61
Update attribute names to reflect the actual interface.
Thibaut Girka <thib@sitedethib.com>
parents:
267
diff
changeset
|
91 self.sprite.angle = angle |
86
a87a3c080585
Handle a few attack flags
Thibaut Girka <thib@sitedethib.com>
parents:
85
diff
changeset
|
92 |
84 | 93 |
258
620134bc51f4
Move bullet visibility check to Bullet to improve performance and prepare handling of flags 1024 and 2048.
Thibaut Girka <thib@sitedethib.com>
parents:
257
diff
changeset
|
94 cpdef is_visible(Bullet self, screen_width, screen_height): |
304
f3099ebf4f61
Update attribute names to reflect the actual interface.
Thibaut Girka <thib@sitedethib.com>
parents:
267
diff
changeset
|
95 tx, ty, tw, th = self.sprite.texcoords |
123 | 96 x, y = self.x, self.y |
84 | 97 |
98 max_x = tw / 2. | |
99 max_y = th / 2. | |
100 | |
123 | 101 if (max_x < x - screen_width |
102 or max_x < -x | |
103 or max_y < y - screen_height | |
104 or max_y < -y): | |
84 | 105 return False |
106 return True | |
107 | |
108 | |
258
620134bc51f4
Move bullet visibility check to Bullet to improve performance and prepare handling of flags 1024 and 2048.
Thibaut Girka <thib@sitedethib.com>
parents:
257
diff
changeset
|
109 def set_anim(Bullet self, sprite_idx_offset=None): |
107
5d9052b9a4e8
(almost) implement Cirno's freezing spellcard
Thibaut Girka <thib@sitedethib.com>
parents:
106
diff
changeset
|
110 if sprite_idx_offset is not None: |
5d9052b9a4e8
(almost) implement Cirno's freezing spellcard
Thibaut Girka <thib@sitedethib.com>
parents:
106
diff
changeset
|
111 self.sprite_idx_offset = sprite_idx_offset |
5d9052b9a4e8
(almost) implement Cirno's freezing spellcard
Thibaut Girka <thib@sitedethib.com>
parents:
106
diff
changeset
|
112 |
122
174324a4da51
Add support for launch animations! (Warning: slow :()
Thibaut Girka <thib@sitedethib.com>
parents:
120
diff
changeset
|
113 bt = self._bullet_type |
304
f3099ebf4f61
Update attribute names to reflect the actual interface.
Thibaut Girka <thib@sitedethib.com>
parents:
267
diff
changeset
|
114 self.sprite = Sprite() |
163
ee0bbde02c48
Implement player bullets in Bullet.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
161
diff
changeset
|
115 if self.player_bullet: |
304
f3099ebf4f61
Update attribute names to reflect the actual interface.
Thibaut Girka <thib@sitedethib.com>
parents:
267
diff
changeset
|
116 self.sprite.angle = self.angle - pi |
163
ee0bbde02c48
Implement player bullets in Bullet.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
161
diff
changeset
|
117 else: |
304
f3099ebf4f61
Update attribute names to reflect the actual interface.
Thibaut Girka <thib@sitedethib.com>
parents:
267
diff
changeset
|
118 self.sprite.angle = self.angle |
f3099ebf4f61
Update attribute names to reflect the actual interface.
Thibaut Girka <thib@sitedethib.com>
parents:
267
diff
changeset
|
119 self.anmrunner = ANMRunner(bt.anm_wrapper, bt.anim_index, |
f3099ebf4f61
Update attribute names to reflect the actual interface.
Thibaut Girka <thib@sitedethib.com>
parents:
267
diff
changeset
|
120 self.sprite, self.sprite_idx_offset) |
f3099ebf4f61
Update attribute names to reflect the actual interface.
Thibaut Girka <thib@sitedethib.com>
parents:
267
diff
changeset
|
121 self.anmrunner.run_frame() |
122
174324a4da51
Add support for launch animations! (Warning: slow :()
Thibaut Girka <thib@sitedethib.com>
parents:
120
diff
changeset
|
122 |
174324a4da51
Add support for launch animations! (Warning: slow :()
Thibaut Girka <thib@sitedethib.com>
parents:
120
diff
changeset
|
123 |
258
620134bc51f4
Move bullet visibility check to Bullet to improve performance and prepare handling of flags 1024 and 2048.
Thibaut Girka <thib@sitedethib.com>
parents:
257
diff
changeset
|
124 def launch(Bullet self): |
256
507dfd6efe0c
Refactor pytouhou.game.bullet.
Thibaut Girka <thib@sitedethib.com>
parents:
255
diff
changeset
|
125 self._state = LAUNCHED |
507dfd6efe0c
Refactor pytouhou.game.bullet.
Thibaut Girka <thib@sitedethib.com>
parents:
255
diff
changeset
|
126 self.frame = 0 |
122
174324a4da51
Add support for launch animations! (Warning: slow :()
Thibaut Girka <thib@sitedethib.com>
parents:
120
diff
changeset
|
127 self.set_anim() |
256
507dfd6efe0c
Refactor pytouhou.game.bullet.
Thibaut Girka <thib@sitedethib.com>
parents:
255
diff
changeset
|
128 self.dx, self.dy = cos(self.angle) * self.speed, sin(self.angle) * self.speed |
122
174324a4da51
Add support for launch animations! (Warning: slow :()
Thibaut Girka <thib@sitedethib.com>
parents:
120
diff
changeset
|
129 if self.flags & 1: |
174324a4da51
Add support for launch animations! (Warning: slow :()
Thibaut Girka <thib@sitedethib.com>
parents:
120
diff
changeset
|
130 self.speed_interpolator = Interpolator((self.speed + 5.,), 0, |
174324a4da51
Add support for launch animations! (Warning: slow :()
Thibaut Girka <thib@sitedethib.com>
parents:
120
diff
changeset
|
131 (self.speed,), 16) |
107
5d9052b9a4e8
(almost) implement Cirno's freezing spellcard
Thibaut Girka <thib@sitedethib.com>
parents:
106
diff
changeset
|
132 |
5d9052b9a4e8
(almost) implement Cirno's freezing spellcard
Thibaut Girka <thib@sitedethib.com>
parents:
106
diff
changeset
|
133 |
258
620134bc51f4
Move bullet visibility check to Bullet to improve performance and prepare handling of flags 1024 and 2048.
Thibaut Girka <thib@sitedethib.com>
parents:
257
diff
changeset
|
134 def collide(Bullet self): |
161
7e7368356445
Add bullet cancel anim support
Thibaut Girka <thib@sitedethib.com>
parents:
158
diff
changeset
|
135 self.cancel() |
7e7368356445
Add bullet cancel anim support
Thibaut Girka <thib@sitedethib.com>
parents:
158
diff
changeset
|
136 |
7e7368356445
Add bullet cancel anim support
Thibaut Girka <thib@sitedethib.com>
parents:
158
diff
changeset
|
137 |
258
620134bc51f4
Move bullet visibility check to Bullet to improve performance and prepare handling of flags 1024 and 2048.
Thibaut Girka <thib@sitedethib.com>
parents:
257
diff
changeset
|
138 def cancel(Bullet self): |
161
7e7368356445
Add bullet cancel anim support
Thibaut Girka <thib@sitedethib.com>
parents:
158
diff
changeset
|
139 # Cancel animation |
7e7368356445
Add bullet cancel anim support
Thibaut Girka <thib@sitedethib.com>
parents:
158
diff
changeset
|
140 bt = self._bullet_type |
304
f3099ebf4f61
Update attribute names to reflect the actual interface.
Thibaut Girka <thib@sitedethib.com>
parents:
267
diff
changeset
|
141 self.sprite = Sprite() |
163
ee0bbde02c48
Implement player bullets in Bullet.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
161
diff
changeset
|
142 if self.player_bullet: |
304
f3099ebf4f61
Update attribute names to reflect the actual interface.
Thibaut Girka <thib@sitedethib.com>
parents:
267
diff
changeset
|
143 self.sprite.angle = self.angle - pi |
163
ee0bbde02c48
Implement player bullets in Bullet.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
161
diff
changeset
|
144 else: |
304
f3099ebf4f61
Update attribute names to reflect the actual interface.
Thibaut Girka <thib@sitedethib.com>
parents:
267
diff
changeset
|
145 self.sprite.angle = self.angle |
f3099ebf4f61
Update attribute names to reflect the actual interface.
Thibaut Girka <thib@sitedethib.com>
parents:
267
diff
changeset
|
146 self.anmrunner = ANMRunner(bt.anm_wrapper, bt.cancel_anim_index, |
f3099ebf4f61
Update attribute names to reflect the actual interface.
Thibaut Girka <thib@sitedethib.com>
parents:
267
diff
changeset
|
147 self.sprite, bt.launch_anim_offsets[self.sprite_idx_offset]) |
f3099ebf4f61
Update attribute names to reflect the actual interface.
Thibaut Girka <thib@sitedethib.com>
parents:
267
diff
changeset
|
148 self.anmrunner.run_frame() |
256
507dfd6efe0c
Refactor pytouhou.game.bullet.
Thibaut Girka <thib@sitedethib.com>
parents:
255
diff
changeset
|
149 self.dx, self.dy = self.dx / 2., self.dy / 2. |
161
7e7368356445
Add bullet cancel anim support
Thibaut Girka <thib@sitedethib.com>
parents:
158
diff
changeset
|
150 |
7e7368356445
Add bullet cancel anim support
Thibaut Girka <thib@sitedethib.com>
parents:
158
diff
changeset
|
151 # Change update method |
256
507dfd6efe0c
Refactor pytouhou.game.bullet.
Thibaut Girka <thib@sitedethib.com>
parents:
255
diff
changeset
|
152 self._state = CANCELLED |
161
7e7368356445
Add bullet cancel anim support
Thibaut Girka <thib@sitedethib.com>
parents:
158
diff
changeset
|
153 |
7e7368356445
Add bullet cancel anim support
Thibaut Girka <thib@sitedethib.com>
parents:
158
diff
changeset
|
154 # Do not use this one for collisions anymore |
163
ee0bbde02c48
Implement player bullets in Bullet.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
161
diff
changeset
|
155 if self.player_bullet: |
ee0bbde02c48
Implement player bullets in Bullet.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
161
diff
changeset
|
156 self._game.players_bullets.remove(self) |
ee0bbde02c48
Implement player bullets in Bullet.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
161
diff
changeset
|
157 else: |
ee0bbde02c48
Implement player bullets in Bullet.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
161
diff
changeset
|
158 self._game.bullets.remove(self) |
161
7e7368356445
Add bullet cancel anim support
Thibaut Girka <thib@sitedethib.com>
parents:
158
diff
changeset
|
159 self._game.cancelled_bullets.append(self) |
152
86807b8a63bd
Add collisions with enemies and items.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
151
diff
changeset
|
160 |
86807b8a63bd
Add collisions with enemies and items.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
151
diff
changeset
|
161 |
258
620134bc51f4
Move bullet visibility check to Bullet to improve performance and prepare handling of flags 1024 and 2048.
Thibaut Girka <thib@sitedethib.com>
parents:
257
diff
changeset
|
162 def update(Bullet self): |
304
f3099ebf4f61
Update attribute names to reflect the actual interface.
Thibaut Girka <thib@sitedethib.com>
parents:
267
diff
changeset
|
163 if self.anmrunner is not None and not self.anmrunner.run_frame(): |
256
507dfd6efe0c
Refactor pytouhou.game.bullet.
Thibaut Girka <thib@sitedethib.com>
parents:
255
diff
changeset
|
164 if self._state == LAUNCHING: |
507dfd6efe0c
Refactor pytouhou.game.bullet.
Thibaut Girka <thib@sitedethib.com>
parents:
255
diff
changeset
|
165 #TODO: check if it doesn't skip a frame |
507dfd6efe0c
Refactor pytouhou.game.bullet.
Thibaut Girka <thib@sitedethib.com>
parents:
255
diff
changeset
|
166 self.launch() |
507dfd6efe0c
Refactor pytouhou.game.bullet.
Thibaut Girka <thib@sitedethib.com>
parents:
255
diff
changeset
|
167 elif self._state == CANCELLED: |
304
f3099ebf4f61
Update attribute names to reflect the actual interface.
Thibaut Girka <thib@sitedethib.com>
parents:
267
diff
changeset
|
168 self.removed = True |
256
507dfd6efe0c
Refactor pytouhou.game.bullet.
Thibaut Girka <thib@sitedethib.com>
parents:
255
diff
changeset
|
169 else: |
304
f3099ebf4f61
Update attribute names to reflect the actual interface.
Thibaut Girka <thib@sitedethib.com>
parents:
267
diff
changeset
|
170 self.anmrunner = None |
122
174324a4da51
Add support for launch animations! (Warning: slow :()
Thibaut Girka <thib@sitedethib.com>
parents:
120
diff
changeset
|
171 |
256
507dfd6efe0c
Refactor pytouhou.game.bullet.
Thibaut Girka <thib@sitedethib.com>
parents:
255
diff
changeset
|
172 if self._state == LAUNCHING: |
507dfd6efe0c
Refactor pytouhou.game.bullet.
Thibaut Girka <thib@sitedethib.com>
parents:
255
diff
changeset
|
173 pass |
507dfd6efe0c
Refactor pytouhou.game.bullet.
Thibaut Girka <thib@sitedethib.com>
parents:
255
diff
changeset
|
174 elif self._state == CANCELLED: |
507dfd6efe0c
Refactor pytouhou.game.bullet.
Thibaut Girka <thib@sitedethib.com>
parents:
255
diff
changeset
|
175 pass |
507dfd6efe0c
Refactor pytouhou.game.bullet.
Thibaut Girka <thib@sitedethib.com>
parents:
255
diff
changeset
|
176 elif self.flags & 1: |
507dfd6efe0c
Refactor pytouhou.game.bullet.
Thibaut Girka <thib@sitedethib.com>
parents:
255
diff
changeset
|
177 # Initial speed burst |
507dfd6efe0c
Refactor pytouhou.game.bullet.
Thibaut Girka <thib@sitedethib.com>
parents:
255
diff
changeset
|
178 #TODO: use frame instead of interpolator? |
507dfd6efe0c
Refactor pytouhou.game.bullet.
Thibaut Girka <thib@sitedethib.com>
parents:
255
diff
changeset
|
179 if not self.speed_interpolator: |
507dfd6efe0c
Refactor pytouhou.game.bullet.
Thibaut Girka <thib@sitedethib.com>
parents:
255
diff
changeset
|
180 self.flags &= ~1 |
507dfd6efe0c
Refactor pytouhou.game.bullet.
Thibaut Girka <thib@sitedethib.com>
parents:
255
diff
changeset
|
181 elif self.flags & 16: |
507dfd6efe0c
Refactor pytouhou.game.bullet.
Thibaut Girka <thib@sitedethib.com>
parents:
255
diff
changeset
|
182 # Each frame, add a vector to the speed vector |
86
a87a3c080585
Handle a few attack flags
Thibaut Girka <thib@sitedethib.com>
parents:
85
diff
changeset
|
183 length, angle = self.attributes[4:6] |
89
1513f5626656
Fix attack flags implementation
Thibaut Girka <thib@sitedethib.com>
parents:
88
diff
changeset
|
184 angle = self.angle if angle < -900.0 else angle #TODO: is that right? |
256
507dfd6efe0c
Refactor pytouhou.game.bullet.
Thibaut Girka <thib@sitedethib.com>
parents:
255
diff
changeset
|
185 self.dx += cos(angle) * length |
507dfd6efe0c
Refactor pytouhou.game.bullet.
Thibaut Girka <thib@sitedethib.com>
parents:
255
diff
changeset
|
186 self.dy += sin(angle) * length |
507dfd6efe0c
Refactor pytouhou.game.bullet.
Thibaut Girka <thib@sitedethib.com>
parents:
255
diff
changeset
|
187 self.speed = (self.dx ** 2 + self.dy ** 2) ** 0.5 |
304
f3099ebf4f61
Update attribute names to reflect the actual interface.
Thibaut Girka <thib@sitedethib.com>
parents:
267
diff
changeset
|
188 self.angle = self.sprite.angle = atan2(self.dy, self.dx) |
f3099ebf4f61
Update attribute names to reflect the actual interface.
Thibaut Girka <thib@sitedethib.com>
parents:
267
diff
changeset
|
189 if self.sprite.automatic_orientation: |
f3099ebf4f61
Update attribute names to reflect the actual interface.
Thibaut Girka <thib@sitedethib.com>
parents:
267
diff
changeset
|
190 self.sprite.changed = True |
149
3673d55a8448
Fix bullet flags 16 and 32 handling
Thibaut Girka <thib@sitedethib.com>
parents:
145
diff
changeset
|
191 if self.frame == self.attributes[0]: #TODO: include last frame, or not? |
256
507dfd6efe0c
Refactor pytouhou.game.bullet.
Thibaut Girka <thib@sitedethib.com>
parents:
255
diff
changeset
|
192 self.flags &= ~16 |
86
a87a3c080585
Handle a few attack flags
Thibaut Girka <thib@sitedethib.com>
parents:
85
diff
changeset
|
193 elif self.flags & 32: |
256
507dfd6efe0c
Refactor pytouhou.game.bullet.
Thibaut Girka <thib@sitedethib.com>
parents:
255
diff
changeset
|
194 # Each frame, accelerate and rotate |
86
a87a3c080585
Handle a few attack flags
Thibaut Girka <thib@sitedethib.com>
parents:
85
diff
changeset
|
195 #TODO: check |
a87a3c080585
Handle a few attack flags
Thibaut Girka <thib@sitedethib.com>
parents:
85
diff
changeset
|
196 acceleration, angular_speed = self.attributes[4:6] |
89
1513f5626656
Fix attack flags implementation
Thibaut Girka <thib@sitedethib.com>
parents:
88
diff
changeset
|
197 self.speed += acceleration |
1513f5626656
Fix attack flags implementation
Thibaut Girka <thib@sitedethib.com>
parents:
88
diff
changeset
|
198 self.angle += angular_speed |
256
507dfd6efe0c
Refactor pytouhou.game.bullet.
Thibaut Girka <thib@sitedethib.com>
parents:
255
diff
changeset
|
199 self.dx = cos(self.angle) * self.speed |
507dfd6efe0c
Refactor pytouhou.game.bullet.
Thibaut Girka <thib@sitedethib.com>
parents:
255
diff
changeset
|
200 self.dy = sin(self.angle) * self.speed |
304
f3099ebf4f61
Update attribute names to reflect the actual interface.
Thibaut Girka <thib@sitedethib.com>
parents:
267
diff
changeset
|
201 self.sprite.angle = self.angle |
f3099ebf4f61
Update attribute names to reflect the actual interface.
Thibaut Girka <thib@sitedethib.com>
parents:
267
diff
changeset
|
202 if self.sprite.automatic_orientation: |
f3099ebf4f61
Update attribute names to reflect the actual interface.
Thibaut Girka <thib@sitedethib.com>
parents:
267
diff
changeset
|
203 self.sprite.changed = True |
149
3673d55a8448
Fix bullet flags 16 and 32 handling
Thibaut Girka <thib@sitedethib.com>
parents:
145
diff
changeset
|
204 if self.frame == self.attributes[0]: |
256
507dfd6efe0c
Refactor pytouhou.game.bullet.
Thibaut Girka <thib@sitedethib.com>
parents:
255
diff
changeset
|
205 self.flags &= ~32 |
88
2cc60137d368
Ugly implementation of three new attack flags.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
86
diff
changeset
|
206 elif self.flags & 448: |
2cc60137d368
Ugly implementation of three new attack flags.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
86
diff
changeset
|
207 #TODO: check |
2cc60137d368
Ugly implementation of three new attack flags.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
86
diff
changeset
|
208 frame, count = self.attributes[0:2] |
89
1513f5626656
Fix attack flags implementation
Thibaut Girka <thib@sitedethib.com>
parents:
88
diff
changeset
|
209 angle, speed = self.attributes[4:6] |
122
174324a4da51
Add support for launch animations! (Warning: slow :()
Thibaut Girka <thib@sitedethib.com>
parents:
120
diff
changeset
|
210 if self.frame % frame == 0: |
89
1513f5626656
Fix attack flags implementation
Thibaut Girka <thib@sitedethib.com>
parents:
88
diff
changeset
|
211 count = count - 1 |
88
2cc60137d368
Ugly implementation of three new attack flags.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
86
diff
changeset
|
212 |
124
f06e96dbed4e
Fix a few things with special bullet flags
Thibaut Girka <thib@sitedethib.com>
parents:
123
diff
changeset
|
213 if self.frame != 0: |
f06e96dbed4e
Fix a few things with special bullet flags
Thibaut Girka <thib@sitedethib.com>
parents:
123
diff
changeset
|
214 self.speed = speed |
88
2cc60137d368
Ugly implementation of three new attack flags.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
86
diff
changeset
|
215 |
124
f06e96dbed4e
Fix a few things with special bullet flags
Thibaut Girka <thib@sitedethib.com>
parents:
123
diff
changeset
|
216 if self.flags & 64: |
f06e96dbed4e
Fix a few things with special bullet flags
Thibaut Girka <thib@sitedethib.com>
parents:
123
diff
changeset
|
217 self.angle += angle |
f06e96dbed4e
Fix a few things with special bullet flags
Thibaut Girka <thib@sitedethib.com>
parents:
123
diff
changeset
|
218 elif self.flags & 128: |
256
507dfd6efe0c
Refactor pytouhou.game.bullet.
Thibaut Girka <thib@sitedethib.com>
parents:
255
diff
changeset
|
219 self.angle = atan2(self.target.y - self.y, |
507dfd6efe0c
Refactor pytouhou.game.bullet.
Thibaut Girka <thib@sitedethib.com>
parents:
255
diff
changeset
|
220 self.target.x - self.x) + angle |
124
f06e96dbed4e
Fix a few things with special bullet flags
Thibaut Girka <thib@sitedethib.com>
parents:
123
diff
changeset
|
221 elif self.flags & 256: |
f06e96dbed4e
Fix a few things with special bullet flags
Thibaut Girka <thib@sitedethib.com>
parents:
123
diff
changeset
|
222 self.angle = angle |
f06e96dbed4e
Fix a few things with special bullet flags
Thibaut Girka <thib@sitedethib.com>
parents:
123
diff
changeset
|
223 |
256
507dfd6efe0c
Refactor pytouhou.game.bullet.
Thibaut Girka <thib@sitedethib.com>
parents:
255
diff
changeset
|
224 self.dx = cos(self.angle) * self.speed |
507dfd6efe0c
Refactor pytouhou.game.bullet.
Thibaut Girka <thib@sitedethib.com>
parents:
255
diff
changeset
|
225 self.dy = sin(self.angle) * self.speed |
304
f3099ebf4f61
Update attribute names to reflect the actual interface.
Thibaut Girka <thib@sitedethib.com>
parents:
267
diff
changeset
|
226 self.sprite.angle = self.angle |
f3099ebf4f61
Update attribute names to reflect the actual interface.
Thibaut Girka <thib@sitedethib.com>
parents:
267
diff
changeset
|
227 if self.sprite.automatic_orientation: |
f3099ebf4f61
Update attribute names to reflect the actual interface.
Thibaut Girka <thib@sitedethib.com>
parents:
267
diff
changeset
|
228 self.sprite.changed = True |
122
174324a4da51
Add support for launch animations! (Warning: slow :()
Thibaut Girka <thib@sitedethib.com>
parents:
120
diff
changeset
|
229 |
127 | 230 if count >= 0: |
124
f06e96dbed4e
Fix a few things with special bullet flags
Thibaut Girka <thib@sitedethib.com>
parents:
123
diff
changeset
|
231 self.speed_interpolator = Interpolator((self.speed,), self.frame, |
122
174324a4da51
Add support for launch animations! (Warning: slow :()
Thibaut Girka <thib@sitedethib.com>
parents:
120
diff
changeset
|
232 (0.,), self.frame + frame - 1) |
89
1513f5626656
Fix attack flags implementation
Thibaut Girka <thib@sitedethib.com>
parents:
88
diff
changeset
|
233 else: |
1513f5626656
Fix attack flags implementation
Thibaut Girka <thib@sitedethib.com>
parents:
88
diff
changeset
|
234 self.flags &= ~448 |
88
2cc60137d368
Ugly implementation of three new attack flags.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
86
diff
changeset
|
235 |
89
1513f5626656
Fix attack flags implementation
Thibaut Girka <thib@sitedethib.com>
parents:
88
diff
changeset
|
236 self.attributes[1] = count |
256
507dfd6efe0c
Refactor pytouhou.game.bullet.
Thibaut Girka <thib@sitedethib.com>
parents:
255
diff
changeset
|
237 |
507dfd6efe0c
Refactor pytouhou.game.bullet.
Thibaut Girka <thib@sitedethib.com>
parents:
255
diff
changeset
|
238 # Common updates |
86
a87a3c080585
Handle a few attack flags
Thibaut Girka <thib@sitedethib.com>
parents:
85
diff
changeset
|
239 |
a87a3c080585
Handle a few attack flags
Thibaut Girka <thib@sitedethib.com>
parents:
85
diff
changeset
|
240 if self.speed_interpolator: |
a87a3c080585
Handle a few attack flags
Thibaut Girka <thib@sitedethib.com>
parents:
85
diff
changeset
|
241 self.speed_interpolator.update(self.frame) |
a87a3c080585
Handle a few attack flags
Thibaut Girka <thib@sitedethib.com>
parents:
85
diff
changeset
|
242 self.speed, = self.speed_interpolator.values |
256
507dfd6efe0c
Refactor pytouhou.game.bullet.
Thibaut Girka <thib@sitedethib.com>
parents:
255
diff
changeset
|
243 self.dx = cos(self.angle) * self.speed |
507dfd6efe0c
Refactor pytouhou.game.bullet.
Thibaut Girka <thib@sitedethib.com>
parents:
255
diff
changeset
|
244 self.dy = sin(self.angle) * self.speed |
86
a87a3c080585
Handle a few attack flags
Thibaut Girka <thib@sitedethib.com>
parents:
85
diff
changeset
|
245 |
256
507dfd6efe0c
Refactor pytouhou.game.bullet.
Thibaut Girka <thib@sitedethib.com>
parents:
255
diff
changeset
|
246 self.x += self.dx |
507dfd6efe0c
Refactor pytouhou.game.bullet.
Thibaut Girka <thib@sitedethib.com>
parents:
255
diff
changeset
|
247 self.y += self.dy |
84 | 248 |
86
a87a3c080585
Handle a few attack flags
Thibaut Girka <thib@sitedethib.com>
parents:
85
diff
changeset
|
249 self.frame += 1 |
a87a3c080585
Handle a few attack flags
Thibaut Girka <thib@sitedethib.com>
parents:
85
diff
changeset
|
250 |
258
620134bc51f4
Move bullet visibility check to Bullet to improve performance and prepare handling of flags 1024 and 2048.
Thibaut Girka <thib@sitedethib.com>
parents:
257
diff
changeset
|
251 # Filter out-of-screen bullets and handle special flags |
620134bc51f4
Move bullet visibility check to Bullet to improve performance and prepare handling of flags 1024 and 2048.
Thibaut Girka <thib@sitedethib.com>
parents:
257
diff
changeset
|
252 if self.flags & 448: |
304
f3099ebf4f61
Update attribute names to reflect the actual interface.
Thibaut Girka <thib@sitedethib.com>
parents:
267
diff
changeset
|
253 self.was_visible = False |
258
620134bc51f4
Move bullet visibility check to Bullet to improve performance and prepare handling of flags 1024 and 2048.
Thibaut Girka <thib@sitedethib.com>
parents:
257
diff
changeset
|
254 elif self.is_visible(self._game.width, self._game.height): |
304
f3099ebf4f61
Update attribute names to reflect the actual interface.
Thibaut Girka <thib@sitedethib.com>
parents:
267
diff
changeset
|
255 self.was_visible = True |
f3099ebf4f61
Update attribute names to reflect the actual interface.
Thibaut Girka <thib@sitedethib.com>
parents:
267
diff
changeset
|
256 elif self.was_visible: |
f3099ebf4f61
Update attribute names to reflect the actual interface.
Thibaut Girka <thib@sitedethib.com>
parents:
267
diff
changeset
|
257 self.removed = True |
260
e22e0d73f614
Implement bullet flags 1024 and 2048 (bouncing bullet).
Thibaut Girka <thib@sitedethib.com>
parents:
258
diff
changeset
|
258 if self.flags & (1024 | 2048) and self.attributes[0] > 0: |
e22e0d73f614
Implement bullet flags 1024 and 2048 (bouncing bullet).
Thibaut Girka <thib@sitedethib.com>
parents:
258
diff
changeset
|
259 # Bounce! |
e22e0d73f614
Implement bullet flags 1024 and 2048 (bouncing bullet).
Thibaut Girka <thib@sitedethib.com>
parents:
258
diff
changeset
|
260 if self.x < 0 or self.x > self._game.width: |
e22e0d73f614
Implement bullet flags 1024 and 2048 (bouncing bullet).
Thibaut Girka <thib@sitedethib.com>
parents:
258
diff
changeset
|
261 self.angle = pi - self.angle |
304
f3099ebf4f61
Update attribute names to reflect the actual interface.
Thibaut Girka <thib@sitedethib.com>
parents:
267
diff
changeset
|
262 self.removed = False |
260
e22e0d73f614
Implement bullet flags 1024 and 2048 (bouncing bullet).
Thibaut Girka <thib@sitedethib.com>
parents:
258
diff
changeset
|
263 if self.y < 0 or ((self.flags & 1024) and self.y > self._game.height): |
e22e0d73f614
Implement bullet flags 1024 and 2048 (bouncing bullet).
Thibaut Girka <thib@sitedethib.com>
parents:
258
diff
changeset
|
264 self.angle = -self.angle |
304
f3099ebf4f61
Update attribute names to reflect the actual interface.
Thibaut Girka <thib@sitedethib.com>
parents:
267
diff
changeset
|
265 self.removed = False |
f3099ebf4f61
Update attribute names to reflect the actual interface.
Thibaut Girka <thib@sitedethib.com>
parents:
267
diff
changeset
|
266 self.sprite.angle = self.angle |
f3099ebf4f61
Update attribute names to reflect the actual interface.
Thibaut Girka <thib@sitedethib.com>
parents:
267
diff
changeset
|
267 if self.sprite.automatic_orientation: |
f3099ebf4f61
Update attribute names to reflect the actual interface.
Thibaut Girka <thib@sitedethib.com>
parents:
267
diff
changeset
|
268 self.sprite.changed = True |
260
e22e0d73f614
Implement bullet flags 1024 and 2048 (bouncing bullet).
Thibaut Girka <thib@sitedethib.com>
parents:
258
diff
changeset
|
269 self.dx = cos(self.angle) * self.speed |
e22e0d73f614
Implement bullet flags 1024 and 2048 (bouncing bullet).
Thibaut Girka <thib@sitedethib.com>
parents:
258
diff
changeset
|
270 self.dy = sin(self.angle) * self.speed |
e22e0d73f614
Implement bullet flags 1024 and 2048 (bouncing bullet).
Thibaut Girka <thib@sitedethib.com>
parents:
258
diff
changeset
|
271 self.attributes[0] -= 1 |
258
620134bc51f4
Move bullet visibility check to Bullet to improve performance and prepare handling of flags 1024 and 2048.
Thibaut Girka <thib@sitedethib.com>
parents:
257
diff
changeset
|
272 |