H a n d s o n, p r o j e c t b a s e d
Download 4.21 Mb. Pdf ko'rish
|
Python Crash Course, 2nd Edition
- Bu sahifa navigatsiya:
- Creating the Bullet Class
Shooting Bullets
Now let’s add the ability to shoot bullets. We’ll write code that fires a bullet, which is represented by a small rectangle, when the player presses the space bar. Bullets will then travel straight up the screen until they disappear off the top of the screen. A Ship that Fires Bullets 247 Adding the Bullet Settings At the end of the __init__() method, we’ll update settings.py to include the values we’ll need for a new Bullet class: def __init__(self): --snip-- # Bullet settings self.bullet_speed = 1.0 self.bullet_width = 3 self.bullet_height = 15 self.bullet_color = (60, 60, 60) These settings create dark gray bullets with a width of 3 pixels and a height of 15 pixels. The bullets will travel slightly slower than the ship. Creating the Bullet Class Now create a bullet.py file to store our Bullet class. Here’s the first part of bullet.py: import pygame from pygame.sprite import Sprite class Bullet(Sprite): """A class to manage bullets fired from the ship""" def __init__(self, ai_game): """Create a bullet object at the ship's current position.""" super().__init__() self.screen = ai_game.screen self.settings = ai_game.settings self.color = self.settings.bullet_color # Create a bullet rect at (0, 0) and then set correct position. u self.rect = pygame.Rect(0, 0, self.settings.bullet_width, self.settings.bullet_height) v self.rect.midtop = ai_game.ship.rect.midtop # Store the bullet's position as a decimal value. w self.y = float(self.rect.y) The Bullet class inherits from Sprite , which we import from the pygame .sprite module. When you use sprites, you can group related elements in your game and act on all the grouped elements at once. To create a bullet instance, __init__() needs the current instance of AlienInvasion , and we call super() to inherit properly from Sprite . We also set attributes for the screen and settings objects, and for the bullet’s color. At u, we create the bullet’s rect attribute. The bullet isn’t based on an image, so we have to build a rect from scratch using the pygame.Rect() class. This class requires the x and ycoordinates of the topleft corner of the settings.py bullet.py 248 Chapter 12 rect , and the width and height of the rect . We initialize the rect at (0, 0), but we’ll move it to the correct location in the next line, because the bullet’s position depends on the ship’s position. We get the width and height of the bullet from the values stored in self.settings . At v, we set the bullet’s midtop attribute to match the ship’s midtop attri bute. This will make the bullet emerge from the top of the ship, making it look like the bullet is fired from the ship. We store a decimal value for the bullet’s ycoordinate so we can make fine adjustments to the bullet’s speed w. Here’s the second part of bullet.py, update() and draw_bullet() : def update(self): """Move the bullet up the screen.""" # Update the decimal position of the bullet. u self.y -= self.settings.bullet_speed # Update the rect position. v self.rect.y = self.y def draw_bullet(self): """Draw the bullet to the screen.""" w pygame.draw.rect(self.screen, self.color, self.rect) The update() method manages the bullet’s position. When a bullet is fired, it moves up the screen, which corresponds to a decreasing ycoordinate value. To update the position, we subtract the amount stored in settings .bullet_speed from self.y u. We then use the value of self.y to set the value of self.rect.y v. The bullet_speed setting allows us to increase the speed of the bullets as the game progresses or as needed to refine the game’s behavior. Once a bullet is fired, we never change the value of its xcoordinate, so it will travel vertically in a straight line even if the ship moves. When we want to draw a bullet, we call draw_bullet() . The draw.rect() function fills the part of the screen defined by the bullet’s rect with the color stored in self.color w. Download 4.21 Mb. Do'stlaringiz bilan baham: |
Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling
ma'muriyatiga murojaat qiling