Skip to content Skip to sidebar Skip to footer

Object To Shoot A Projectile

I'm trying to make my tanks shoot, and I did all the code I think I should have done but I don't know why the tanks aren't shooting anything. import pygame, assetloader from pygame

Solution 1:

I usually add bullets in this way: I pass the group that contains all sprites and the bullet group to the player instance and add new bullets to these group in the player's handle_event method.

import pygame as pg
from pygame.math import Vector2


pg.init()
screen = pg.display.set_mode((640, 480))
screen_rect = screen.get_rect()
FONT = pg.font.Font(None, 24)
BG_COLOR = pg.Color('gray12')

BULLET_IMAGE = pg.Surface((20, 11), pg.SRCALPHA)
pg.draw.polygon(
    BULLET_IMAGE, pg.Color('aquamarine1'), [(0, 0), (20, 5), (0, 11)])
PLAYER_IMAGE = pg.Surface((50, 30), pg.SRCALPHA)
pg.draw.polygon(
    PLAYER_IMAGE, pg.Color('dodgerblue1'), [(0, 0), (50, 15), (0, 30)])


class Player(pg.sprite.Sprite):

    def __init__(self, pos, all_sprites, bullet_group):
        super().__init__()
        self.image = PLAYER_IMAGE
        self.orig_image = self.image  # Needed to preserve image quality.
        self.rect = self.image.get_rect(center=(pos))
        self.pos = Vector2(pos)
        self.vel = Vector2(1, 0)
        self.angle = 0
        self.angle_speed = 0
        self.all_sprites = all_sprites
        self.bullet_group = bullet_group

    def handle_event(self, event):
        if event.type == pg.MOUSEBUTTONDOWN:
            # Left button fires a bullet from cannon center with
            # current angle. Add the bullet to the bullet_group.
            if event.button == 1:
                bullet = Bullet(self.pos, self.angle)
                self.bullet_group.add(bullet)
                self.all_sprites.add(bullet)
        elif event.type == pg.KEYDOWN:
            # Rotate self by setting the .angle_speed.
            if event.key in (pg.K_a, pg.K_LEFT):
                self.angle_speed = -3
            elif event.key in (pg.K_d, pg.K_RIGHT):
                self.angle_speed = 3
        elif event.type == pg.KEYUP:
            if event.key in (pg.K_a, pg.K_LEFT):
                self.angle_speed = 0
            elif event.key in (pg.K_d, pg.K_RIGHT):
                self.angle_speed = 0

    def update(self):
        self.pos += self.vel
        self.rect.center = self.pos

        if self.angle_speed != 0:
            self.rotate()

    def rotate(self):
        # Update the angle and the velocity vector.
        self.angle += self.angle_speed
        self.vel.rotate_ip(self.angle_speed)
        # Rotate the image and get a new rect with the previous center.
        self.image = pg.transform.rotozoom(self.orig_image, -self.angle, 1)
        self.rect = self.image.get_rect(center=self.rect.center)


class Bullet(pg.sprite.Sprite):

    def __init__(self, pos, angle):
        super().__init__()
        self.image = pg.transform.rotate(BULLET_IMAGE, -angle)
        self.rect = self.image.get_rect(center=pos)
        # To apply an offset (40 pixels) to the start position,
        # create another vector and rotate it as well.
        offset = Vector2(40, 0).rotate(angle)
        # Add the offset vector to the position vector (the center).
        self.pos = Vector2(pos) + offset
        # Rotate the start velocity vector (9, 0) by the angle.
        self.vel = Vector2(9, 0).rotate(angle)

    def update(self):
        # Add the velocity to the pos to move the sprite.
        self.pos += self.vel
        self.rect.center = self.pos  # Update the rect as well.
        # Remove bullets outside of the screen area.
        if not screen_rect.contains(self.rect):
            self.kill()


def main():
    clock = pg.time.Clock()
    all_sprites = pg.sprite.Group()
    # Bullets will be added to this group.
    bullet_group = pg.sprite.Group()
    # Pass the bullet group to the player.
    player = Player((300, 200), all_sprites, bullet_group)
    all_sprites.add(player)

    playing = True
    while playing:
        for event in pg.event.get():
            if event.type == pg.QUIT:
                playing = False
            # Pass events to the player instance.
            player.handle_event(event)

        all_sprites.update()

        screen.fill(BG_COLOR)
        all_sprites.draw(screen)
        pg.display.update()

        clock.tick(30)


if __name__ == '__main__':
    main()
    pg.quit()

Post a Comment for "Object To Shoot A Projectile"