如何解决如何从矢量方向拍摄
我正在尝试让我的飞船从它的尖端射击。现在它从飞船上发射,但每当我移动时它就会跟着它。
我知道问题出在 Bullet 类中,但我不知道如何解决。
我对编程还很陌生,所以请使用 ELI5。
将pygame导入为pg 导入系统 导入数学 从 pygame.math 导入 Vector2 x,y = 0,0
class Rocket(pg.sprite.Sprite):
def __init__(self,pos=(1920/2,1080/2)):
super().__init__()
self.original_image = pg.image.load("rocket.png")
self.original_image = pg.transform.scale(self.original_image,(120,100))
self.image = self.original_image
self.angle_change = 0
self.angle = 0
self.angle_speed = 0
self.rect = self.image.get_rect(center = pos)
self.position = Vector2(pos)
self.direction = Vector2(1,0)
#self.direction.rotate_ip(180)
print(self.direction)
#self.image = pg.transform.rotozoom(self.image,self.angle,1)
self.pressed_w = False
self.pressed_a = False
self.pressed_space = False
self.pressed_d = False
self.speed = 2
self.gravity = False
self.rect.x += self.direction.x
self.rect.y += self.direction.y
def update(self):
if self.pressed_w:
self.rect.x += self.direction.x*self.speed
self.rect.y += self.direction.y*self.speed
if self.pressed_a:
self.angle -= 2
self.image = pg.transform.rotozoom(self.original_image,1)
self.direction.rotate_ip(2)
if self.pressed_d:
self.angle += 2
self.image = pg.transform.rotozoom(self.original_image,1)
#endrer self.direction med antall grader i self.angle
self.direction.rotate_ip(-2)
if self.pressed_space:
self.create_bullet()
if self.rect.left < 0: self.rect.left = 0
if self.rect.right > width: self.rect.right = width
if self.rect.top < 0: self.rect.top = 0
if self.rect.bottom > height: self.rect.bottom = height
if self.angle_speed != 0:
# Rotate the direction vector and then the image.
self.direction.rotate_ip(self.angle_speed)
self.angle += self.angle_speed
self.image = pg.transform.rotozoom(self.original_image,1)
#self.new_rect = self.image.get_rect(center=self.image.get_rect(center=pos).center)
#return self.image,self.new_rect
def create_bullet(self):
b = Bullet(self.direction,(self.rect.x,self.rect.y))
bullet_group.add(b)
return b
#return Bullet(self.direction,self.rect.y))
class Bullet(pg.sprite.Sprite):
def __init__(self,direction,center):
super().__init__()
self.image = pg.Surface((50,10))
self.image.fill((255,0))
self.rect = self.image.get_rect(center=center)
self.direction = direction
def update(self):
self.rect.x += self.direction.x*5
self.rect.y += self.direction.y*5
class Rocket1(pg.sprite.Sprite):
def __init__(self,pos = (1920/2,1080/2)):
super().__init__()
self.image = pg.image.load("rocketflames.png")
self.image = pg.transform.scale(self.image,100))
self.angle_change = 0
self.angle = 0
self.angle_speed = 0
self.rect = self.image.get_rect(center=pos)
self.position = Vector2(pos)
self.direction = Vector2(1,0)
self.image = pg.transform.rotozoom(self.image,1)
self.rect = self.image.get_rect()
self.rot_image = 0
self.new_rect = 0
self.pressed_up = False
self.pressed_left = False
self.pressed_down = False
self.pressed_right = False
self.speed = 3
self.gravity = False
def update(self,1080/2)):
if self.pressed_left:
self.rect.x -= self.speed
if self.pressed_right:
self.rect.x += self.speed
if self.pressed_up:
self.rect.y -= self.speed
if self.pressed_down:
self.rect.y += self.speed
if self.gravity:
self.rect.y += self.speed
if self.rect.left < 0: self.rect.left = 0
if self.rect.right > width: self.rect.right = width
if self.rect.top < 0: self.rect.top = 0
if self.rect.bottom > height: self.rect.bottom = height
if self.angle_speed != 0:
# Rotate the direction vector and then the image.
self.direction.rotate_ip(self.angle_speed)
self.angle += self.angle_speed
self.rot_image = pg.transform.rotate(self.image,self.angle)
self.new_rect = self.rot_image.get_rect(center=self.rot_image.get_rect(center=pos).center)
return self.rot_image,self.new_rect
pg.init()
clock = pg.time.Clock()
width = 1920
height = 1080
screen = pg.display.set_mode((width,height))
background = pg.image.load("bg.jpg")
pos = (width/2,height/2)
#rocket
player_rect = Rocket()
player_rect1 = Rocket1()
rotated_image = player_rect1.new_rect
obstacle = Obstacle
rocket_group = pg.sprite.Group()
rocket_group.add(player_rect,player_rect1)
bullet_group = pg.sprite.Group()
obstacle_group = pg.sprite.Group()
if __name__ == '__main__':
while True:
for event in pg.event.get():
if event.type == pg.QUIT:
pg.quit()
sys.exit()
if event.type == pg.KEYDOWN:
if event.key == pg.K_w:
player_rect.pressed_w = True
player_rect.gravity = False
if event.type == pg.KEYDOWN:
if event.key == pg.K_d:
player_rect.pressed_d = True
if event.type == pg.KEYDOWN:
if event.key == pg.K_SPACE:
player_rect.pressed_space = True
bullet_group.add(player_rect.create_bullet())
if event.type == pg.KEYDOWN:
if event.key == pg.K_a:
player_rect.pressed_a = True
if event.type == pg.KEYUP:
if event.key == pg.K_w:
player_rect.pressed_w = False
player_rect.gravity = True
if event.type == pg.KEYDOWN:
if event.key == pg.K_SPACE:
player_rect.pressed_space = False
if event.type == pg.KEYUP:
if event.key == pg.K_d:
player_rect.pressed_d = False
if event.type == pg.KEYUP:
if event.key == pg.K_a:
player_rect.pressed_a = False
###
if event.type == pg.KEYDOWN:
if event.key == pg.K_UP:
player_rect1.pressed_up = True
player_rect1.gravity = False
if event.type == pg.KEYDOWN:
if event.key == pg.K_RIGHT:
player_rect1.angle_speed = 0.1
if event.type == pg.KEYDOWN:
if event.key == pg.K_LEFT:
player_rect1.angle_speed = -0.1
if event.type == pg.KEYUP:
if event.key == pg.K_UP:
player_rect1.pressed_up = False
player_rect1.gravity = True
if event.type == pg.KEYUP:
if event.key == pg.K_RIGHT:
player_rect1.angle_speed = 0
if event.type == pg.KEYUP:
if event.key == pg.K_LEFT:
player_rect1.angle_speed = 0
pg.display.flip()
screen.blit(background,(0,0))
rocket_group.draw(screen)
bullet_group.draw(screen)
obstacle_group.draw(screen)
bullet_group.update()
rocket_group.update()
obstacle_group.update()
clock.tick(120)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。