Python/Pygame - стреляет пулей в направлении спрайта
Привет недавно я работал над платформой игры, чтобы изучить Pygame и узнать больше о Python в целом. Мне удалось беспрепятственно реализовать большинство желаемых функций, и сейчас я работаю над пулевой системой. Я использовал этот учебник для маркеров: http://programarcadegames.com/python_examples/show_file.php?file=bullets.py
Проблема в том, что мои пули будут стрелять только в одном направлении, и мне нужно, чтобы они стреляли в том направлении, в котором стоит мой игровой спрайт.
До сих пор я пытался создать значения True/False для случая, когда нажата клавиша A (слева) или D (справа), и соответственно изменить значение, добавляемое к маркеру.(Это приводило только к тому, что маркеры перемещались только тогда, когда клавиша была нажата, поэтому я их убрал)
Вот мой класс пули:
class Bullet(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.image.load("C:/Users/Tom/Data/Art/bullet.png")
self.rect = self.image.get_rect()
def update(self):
self.rect.x += 10
Вот мой класс игрока:
class Player(Entity):
walking_frames_l = []
walking_frames_r = []
jumping_r = []
jumping_l = []
run_frames_r = []
run_frames_l = []
def __init__(self, x, y):
image = pygame.image.load("C:\Users\Tom\Data\Art\Player1.png")
self.walking_frames_r.append(image)
image = pygame.image.load("C:\Users\Tom\Data\Art\Player11.png")
self.walking_frames_r.append(image)
image = pygame.image.load("C:\Users\Tom\Data\Art\Player11.png")
self.walking_frames_r.append(image)
image = pygame.image.load("C:\Users\Tom\Data\Art\Player2.png")
self.walking_frames_r.append(image)
image = pygame.image.load("C:\Users\Tom\Data\Art\Player22.png")
self.walking_frames_r.append(image)
image = pygame.image.load("C:\Users\Tom\Data\Art\Player3.png")
self.walking_frames_r.append(image)
image = pygame.image.load("C:\Users\Tom\Data\Art\Player33.png")
self.walking_frames_r.append(image)
image = pygame.image.load("C:\Users\Tom\Data\Art\Player4.png")
self.walking_frames_r.append(image)
image = pygame.image.load("C:\Users\Tom\Data\Art\Player44.png")
self.walking_frames_r.append(image)
image = pygame.image.load("C:\Users\Tom\Data\Art\Player1.png")
image = pygame.transform.flip(image,True,False)
self.walking_frames_l.append(image)
image = pygame.image.load("C:\Users\Tom\Data\Art\Player11.png")
image = pygame.transform.flip(image,True,False)
self.walking_frames_l.append(image)
image = pygame.image.load("C:\Users\Tom\Data\Art\Player11.png")
image = pygame.transform.flip(image,True,False)
self.walking_frames_l.append(image)
image = pygame.image.load("C:\Users\Tom\Data\Art\Player2.png")
image = pygame.transform.flip(image,True,False)
self.walking_frames_l.append(image)
image = pygame.image.load("C:\Users\Tom\Data\Art\player22.png")
image = pygame.transform.flip(image,True,False)
self.walking_frames_l.append(image)
image = pygame.image.load("C:\Users\Tom\Data\Art\player3.png")
image = pygame.transform.flip(image,True,False)
self.walking_frames_l.append(image)
image = pygame.image.load("C:\Users\Tom\Data\Art\player33.png")
image = pygame.transform.flip(image,True,False)
self.walking_frames_l.append(image)
image = pygame.image.load("C:\Users\Tom\Data\Art\player4.png")
image = pygame.transform.flip(image,True,False)
self.walking_frames_l.append(image)
image = pygame.image.load("C:\Users\Tom\Data\Art\player44.png")
image = pygame.transform.flip(image,True,False)
self.walking_frames_l.append(image)
self.frame_r = 0
self.frame_l = 0
self.last_key_pressed = None
Entity.__init__(self)
self.xvel = 0
self.yvel = 0
self.onGround = False
self.image = self.walking_frames_r[self.frame_r]
self.rect = Rect(x,y,23,31)
def update(self,shoot,up, down, left, right,select, pickups, platforms, inventory, player,bullets):
if shoot:
bullet = Bullet()
bullet.rect.x = player.rect.x
bullet.rect.y = player.rect.y
bullets.add(bullet)
if right:
print "right"
if left:
print "left"
if up:
# only jump if on the ground
if self.onGround: self.yvel -= 7
if down:
pass
if left:
self.last_key_pressed = "LEFT"
self.xvel = -4
self.frame_l += 1
self.image = self.walking_frames_l[self.frame_l]
if self.frame_l == 8: self.frame_l = 0
if right:
self.last_key_pressed = "RIGHT"
self.xvel = 4
self.frame_r += 1
self.image = self.walking_frames_r[self.frame_r]
if self.frame_r == 8: self.frame_r = 0
if not (left or right):
if self.last_key_pressed == "LEFT":
self.image = self.walking_frames_l[1]
if self.last_key_pressed == "RIGHT":
self.image = self.walking_frames_r[1]
if not self.onGround:
# only accelerate with gravity if in the air
self.yvel += 0.3
# max falling speed
if self.yvel > 30: self.yvel = 30
if not(left or right):
self.xvel = 0
# increment in x direction
self.rect.left += self.xvel
# do x-axis collisions
self.collide(self.xvel, 0,pickups, platforms,select,inventory)
# increment in y direction
self.rect.top += self.yvel
# assuming we're in the air
self.onGround = False;
# do y-axis collisions
self.collide(0, self.yvel, pickups, platforms,select,inventory)
Полный код можно посмотреть здесь: http://pastebin.com/ttLJTdv4
Спасибо!
1 ответ
В вашем классе пули Вам нужно создать переменную, чтобы отслеживать скорость в направлении х, как вы делали в классе игрока. Затем в методе обновления вы установите self.rect.x += xvel. Затем, когда вы стреляете, установите положительный или отрицательный xvel в зависимости от того, в каком направлении смотрит игрок.