【问题标题】:Pygame,shooting bullets using vectorsPygame,使用矢量射击子弹
【发布时间】:2013-10-23 06:44:24
【问题描述】:

好吧,我和其他 5 个家伙整晚都在为我们的 pygame 模块开发一个项目。我们的讲师没有给我们任何可供参考的程序,他只是向我们扔了一堆代码(没有评论)并且期待我们理解它。我们从 9 月初才开始使用 python。我们真的需要一些帮助。

所以我们有一个由 W A S & D 控制的人类玩家和 15 个在屏幕上移动的随机点。我们需要使用向量(我们从未使用过)来射击随机点。

请人帮忙。

添加编辑代码~

import pygame class Terminator(pygame.sprite.Sprite): def __init__(self, screen): pygame.sprite.Sprite.__init__(self) self.image = pygame.Surface((20, 20)) self.image.fill((0, 0, 0)) pygame.draw.circle(self.image, (255, 0, 0), (10, 10), 10, 0) self.rect = self.image.get_rect() self.dx = screen.get_width()/2 self.dy = screen.get_height()/2 self.rect.center = (self.dx, self.dy) self.speed = 5 self.screen = screen def update(self): self.rect.center = (self.dx, self.dy) def MoveLeft(self): if self.rect.left < 0: self.dx += 0 else: self.dx -= self.speed def MoveRight(self): if self.rect.right > self.screen.get_width(): self.dx += 0 else: self.dx += self.speed def MoveUp(self): if self.rect.top <0: self.dy += 0 else: self.dy -= self.speed def MoveDown(self): if self.rect.bottom > self.screen.get_height(): self.dy += 0 else: self.dy += self.speed <code> humansprite.py <pre> import pygame import random import math class Humans(pygame.sprite.Sprite): def __init__(self, screen): pygame.sprite.Sprite.__init__(self) self.image = pygame.Surface((16, 16)) self.image.fill((0, 0, 0)) pygame.draw.circle(self.image, (0, 0, 255), (8, 8), 8, 0) self.rect = self.image.get_rect() self.dx = random.randrange(0, screen.get_height()) self.dy = random.randrange(0, screen.get_width()) self.screen = screen self.speed = 1 self.alive = True def update(self): self.rect.centerx -= self.dx self.rect.centery -= self.dy if self.rect.right < 0: self.reset() def reset(self): self.rect.left = self.screen.get_width() self.rect.centery = random.randrange(0, self.screen.get_height()) self.dy = random.randrange(-2, 2) self.dx = random.randrange(1, 4) <code> seekandDestory.py <pre> import pygame from TerminatorSprite import Terminator from humansSprite import Humans pygame.init() def checkKeys(myData): (event, ship) = myData if event.key == pygame.K_LEFT: print 'LEFT' ship.MoveLeft() if event.key == pygame.K_RIGHT: print 'RIGHT' ship.MoveRight() if event.key == pygame.K_UP: print 'UP' ship.MoveUp() if event.key == pygame.K_DOWN: print 'DOWN' ship.MoveDown() def main(): screen = pygame.display.set_mode((640, 480)) pygame.display.set_caption("Seek and Destroy") background = pygame.Surface(screen.get_size()) clock = pygame.time.Clock() screen.blit(background, (0, 0)) terminator = Terminator(screen) humans = [] for people in range(15): people = Humans(screen) humans.append(people) terminatorGroup = pygame.sprite.Group(terminator) humanGroup = pygame.sprite.Group(humans) clock = pygame.time.Clock() keepGoing = True pygame.key.set_repeat(10, 10) while keepGoing: clock.tick(60) pygame.mouse.set_visible(False) for event in pygame.event.get(): if event.type == pygame.QUIT: keepGoing = False if event.type == pygame.KEYDOWN: myData = (event, terminator) checkKeys(myData) #if pygame.sprite.spritecollide(terminator, humanGroup, False): terminatorGroup.clear(screen, background) terminatorGroup.update() terminatorGroup.draw(screen) humanGroup.clear(screen, background) humanGroup.update() humanGroup.draw(screen) pygame.display.flip() pygame.mouse.set_visible(True) if __name__ == "__main__": main() <code>

【问题讨论】:

标签: vector pygame


【解决方案1】:

我昨晚刚刚完成this set of examples!查看 Lunar Lander 示例,尤其是 the way I'm handling vectors in lunarlander.py - 它提供了一个类 V,用于矢量管理。

您可能需要为您的家伙创建一个精灵,其中包含一个代表他的速度(时刻,可能为 0)和角度的矢量,然后是每个具有相似矢量和角度的随机点的精灵。当你射击时,创建一个新的精灵,其矢量的角度与你面对的当前角度相匹配,并且大小与子弹的速度相匹配。然后,在update() 方法中,移动每个精灵(子弹,随机点)。与我在lunarlander.py 中所做的非常相似。

祝你好运!如果您刚刚开始使用 Python,那将是一项艰巨的任务。编码愉快!

【讨论】:

  • 代码看起来不错。但是为什么你把Lander的父类称为最后一个语句而不是第一个语句呢?
  • 我习惯了return super(superclass, self).__init__(*args, **kwargs)这个成语。这真的不正确吗?
  • 你有相关链接吗?我尝试搜索以验证任何一种方式,但搜索效果不佳。像这样使用superkwargs 是正常的。但如果这是最后一条语句,我想如果你碰巧修改了superclass 拥有的任何变量,它可以在你的代码之后撤消/设置它们。
  • 好的,谢谢,但我几乎无法理解该代码,因为我只做了一个月左右的 Python。
  • 好的。如果您发布代码并提出更具体的问题,您可能会有更好的运气。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多