Как создать пули в pygame?

Я знаю, что на это было несколько тем, но я до сих пор не могу понять, как сделать мой корабль выстрелом из пуль. Я хочу добавить к моим пулям MOUSEBUTTONDOWN, стреляющим с корабля, когда звуковой эффект играет. Спасибо за помощь!

import sys, pygame, pygame.mixer from pygame.locals import * pygame.init() size = width, height = 800, 600 screen = pygame.display.set_mode(size) clock = pygame.time.Clock() background = pygame.image.load("bg.png") ship = pygame.image.load("ship.png") ship = pygame.transform.scale(ship,(64,64)) shot = pygame.mixer.Sound("shot.wav") soundin = pygame.mixer.Sound("sound.wav") soundin.play() while 1: for event in pygame.event.get(): if event.type == pygame.QUIT: sys.exit() elif event.type == MOUSEBUTTONDOWN: shot.play() clock.tick(60) mx,my = pygame.mouse.get_pos() screen.blit(background,(0,0)) screen.blit(ship,(mx-32,500)) pygame.display.flip() 

2 Solutions collect form web for “Как создать пули в pygame?”

Для этого вам нужно пройти несколько шагов. Вам понадобится изображение пули, способ сохранить расположение пуль, способ создания пуль, способ визуализации пуль и способ обновления пуль. Похоже, вы уже знаете, как импортировать изображения, поэтому я пропущу эту часть.

Существует несколько способов хранения фрагментов информации. Я буду использовать список левого верхнего угла пуль. Создайте список в любом месте до конечного цикла с помощью bullets=[] .

Чтобы создать пули, вы захотите использовать расположение мыши. Добавьте в bullets.append([event.pos[0]-32, 500]) после shot.play() отступом такое же количество.

Чтобы отобразить пули, вы добавите цикл for в свой игровой цикл. После строки screen.blit(background, (0, 0)) добавьте следующий код:

 for bullet in bullets: screen.blit(bulletpicture, pygame.Rect(bullet[0], bullet[1], 0, 0) 

Чтобы обновить маркеры, вам нужно что-то помещать в игровой цикл, который выглядит так:

 for b in range(len(bullets)): bullets[b][0]-=10 

Наконец, вам нужно удалить пули, когда они достигнут верхней части экрана. Добавьте это после цикла for, который вы только что создали:

 for bullet in bullets: if bullet[0]<0: bullets.remove(bullet) 

Поместив все это в свой код, он должен выглядеть примерно так:

 import sys, pygame, pygame.mixer from pygame.locals import * pygame.init() size = width, height = 800, 600 screen = pygame.display.set_mode(size) clock = pygame.time.Clock() bullets=[] background = pygame.image.load("bg.png") ship = pygame.image.load("ship.png") ship = pygame.transform.scale(ship,(64,64)) bulletpicture = pygame.image.load("You know what to do") shot = pygame.mixer.Sound("shot.wav") soundin = pygame.mixer.Sound("sound.wav") soundin.play() while 1: for event in pygame.event.get(): if event.type == pygame.QUIT: sys.exit() elif event.type == MOUSEBUTTONDOWN: shot.play() bullets.append([event.pos[0]-32, 500]) clock.tick(60) mx,my = pygame.mouse.get_pos() for b in range(len(bullets)): bullets[b][0]-=10 for bullet in bullets: if bullet[0]<0: bullets.remove(bullet) screen.blit(background,(0,0)) for bullet in bullets: screen.blit(bulletpicture, pygame.Rect(bullet[0], bullet[1], 0, 0) screen.blit(ship,(mx-32,500)) pygame.display.flip() 

Если мы с вами все сделали правильно, это должно дать вам действующие пуль. Пожалуйста, не стесняйтесь задавать мне какие-либо вопросы, если вы не понимаете, что происходит или что-то не работает.

Вот пример, демонстрирующий, как pygame.sprite.Sprite s и pygame.sprite.Group s могут использоваться для создания пули. Он также показывает, как стрелять непрерывно с помощью переменной таймера и dt (время дельта), clock.tick возвращает clock.tick .

pygame.sprite.groupcollide используется для обнаружения столкновений между пулями и группой спрайтов enemies . Я перебираю предметы в hits чтобы уменьшить точки здоровья врагов.

 import random import pygame as pg pg.init() BG_COLOR = pg.Color('gray12') ENEMY_IMG = pg.Surface((50, 30)) ENEMY_IMG.fill(pg.Color('darkorange1')) BULLET_IMG = pg.Surface((9, 15)) BULLET_IMG.fill(pg.Color('aquamarine2')) class Enemy(pg.sprite.Sprite): def __init__(self, pos, *sprite_groups): super().__init__(*sprite_groups) self.image = ENEMY_IMG self.rect = self.image.get_rect(center=pos) self.health = 30 def update(self, dt): if self.health <= 0: self.kill() class Bullet(pg.sprite.Sprite): def __init__(self, pos, *sprite_groups): super().__init__(*sprite_groups) self.image = BULLET_IMG self.rect = self.image.get_rect(center=pos) self.pos = pg.math.Vector2(pos) self.vel = pg.math.Vector2(0, -450) self.damage = 10 def update(self, dt): # Add the velocity to the position vector to move the sprite. self.pos += self.vel * dt self.rect.center = self.pos # Update the rect pos. if self.rect.bottom <= 0: self.kill() class Game: def __init__(self): self.clock = pg.time.Clock() self.screen = pg.display.set_mode((800, 600)) self.all_sprites = pg.sprite.Group() self.enemies = pg.sprite.Group() self.bullets = pg.sprite.Group() for i in range(15): pos = (random.randrange(30, 750), random.randrange(500)) Enemy(pos, self.all_sprites, self.enemies) self.bullet_timer = .1 self.done = False def run(self): while not self.done: # dt = time since last tick in milliseconds. dt = self.clock.tick(60) / 1000 self.handle_events() self.run_logic(dt) self.draw() def handle_events(self): for event in pg.event.get(): if event.type == pg.QUIT: self.done = True def run_logic(self, dt): mouse_pressed = pg.mouse.get_pressed() self.all_sprites.update(dt) self.bullet_timer -= dt # Subtract the time since the last tick. if self.bullet_timer <= 0: self.bullet_timer = 0 # Bullet ready. if mouse_pressed[0]: # Left mouse button. # Create a new bullet instance and add it to the groups. Bullet(pg.mouse.get_pos(), self.all_sprites, self.bullets) self.bullet_timer = 2.1 # Reset the timer. # hits is a dict. The enemies are the keys and bullets the values. hits = pg.sprite.groupcollide(self.enemies, self.bullets, False, True) for enemy, bullet_list in hits.items(): for bullet in bullet_list: enemy.health -= bullet.damage def draw(self): self.screen.fill(BG_COLOR) self.all_sprites.draw(self.screen) pg.display.flip() if __name__ == '__main__': Game().run() pg.quit() 
Python - лучший язык программирования в мире.