请,我的Pygame图像不会移动但是当我更改要打印的代码并按下箭头键时,它确实有效。任何帮助将不胜感激。我在原始代码中导入了OS,随机和pygame,并将宽度和高度设置为800,600
class Alien(pygame.sprite.Sprite):
def __init__(self,speed, size):
self.x = random.randrange(0,width)
self.y = random.randrange(-200, -20)
self.size = random.randint(3, 20)
self.speed = speed
def move_down(self):
self.y += self.speed
def draw(self, screen, colour):
pygame.draw.circle(screen, colour, (self.x, self.y), self.size)
def check_landed(self):
if self.y > height:
self.x = random.randrange(0,width)
self.y = random.randrange(-400, -20)
self.speed = random.randrange(1,4)
class Actor(Alien):
def __init__(self, filename):
self.score = 0
self.image = pygame.image.load(os.path.join("../images", filename)).convert_alpha()
self.rect = self.image.get_rect()
def move(self):
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT] or keys[pygame.K_a]:
self.rect.centerx -= 10
print("let")
elif keys[pygame.K_RIGHT] or keys[pygame.K_d]:
self.rect.centerx += 10
def draw(self, screen):
screen.blit(self.image, (width/2, height - 40))
在主要游戏实施中,我有
enemies = []
actor = Actor("ship.jpg")
for i in range (20):
aliens = Alien(2, 4)
enemies.append(aliens)
done = False
while done == False:
for event in pygame.event.get():
if event.type == pygame.QUIT:
done = True
screen.fill(white)
actor.x = 500
actor.y = 500
actor.draw(screen)
actor.move()
for i in range(len(enemies)):
enemies[i].draw(screen, red)
enemies[i].move_down()
enemies[i].check_landed()
pygame.display.flip()
clock.tick(30)
答案 0 :(得分:1)
您已覆盖Sprite.draw
方法。
正常方法,正如文档所说,"使用Sprite.image属性作为源表面,使用Sprite.rect作为位置"。
在您的Alien
子类中,您没有使用它,但您改为使用x
和y
属性,这些属性也可能有效,因为#39; s你在任何地方修改的内容:
def draw(self, screen, colour):
pygame.draw.circle(screen, colour, (self.x, self.y), self.size)
但是您的Actor
子类没有使用 ,只是在(width/2, height - 40)
的固定位置点击屏幕:
def draw(self, screen):
screen.blit(self.image, (width/2, height - 40))
所以,无论你改变什么属性,你总是会在同一个位置画画。
我不确定为什么你会为这两个类中的任何一个重写draw
。我还不确定为什么Alien
继承自Sprite
但后来使用x
和y
属性而忽略rect
,而Actor
继承自Alien
,但在再次使用x
时忽略y
和rect
。这几乎肯定会让你感到困惑。但是如果你想要尽可能小的变化:
screen.blit(self.image, self.rect)
当然,您还需要在启动时将self.rect
设置为初始起始位置,并防止用户一直离开屏幕边缘,依此类推。而且,再一次,清理它最好不要混淆。但这应该让你开始。