gpt4 book ai didi

python - 如何让我的 Sprite (敌方 Sprite )自己移动?

转载 作者:太空宇宙 更新时间:2023-11-04 11:21:21 25 4
gpt4 key购买 nike

我需要让在 drawGrid 函数中定义的敌人 Sprite 移动,我希望它们移动到网格的边缘(水平),一旦到达网格的末端,它们向下移动一定量并开始移动相反的水平方向。 (就像太空侵略者中的外星人。)

我试过移动它们无济于事。

import pygame
pygame.init()

window = pygame.display.set_mode((650, 630))

pygame.display.set_caption("PeaShooters")

avatar = pygame.image.load('Sprite 1 Red.png')
enemy1 = pygame.image.load('Sprite 3 Red.png')
enemy2 = pygame.image.load('Sprite 3 Yellow.png')
background = pygame.image.load('Bg.jpg')
white = (255, 255, 255)

class player(object):
def __init__(self, x, y, width, height, shots):
self.x = 300
self.y = 500
self.width = 40
self.height = 60
self.vel = shots


def drawGrid():
window.blit(background, (0,0))
window.blit(enemy1, (en.x, en.y))
window.blit(enemy1, (200, en.y))
window.blit(enemy1, (100, en.y))
window.blit(enemy1, (400, en.y))
window.blit(enemy1, (500, en.y))
window.blit(enemy1, (en.x, en.y))
window.blit(enemy2, (50, 200))
window.blit(enemy2, (150, 200))
window.blit(enemy2, (250, 200))
window.blit(enemy2, (350, 200))
window.blit(enemy2, (450, 200))
window.blit(enemy2, (530, 200))
window.blit(avatar, (av.x, av.y))
pygame.draw.line(window, white, [50,50], [50, 600], 5)
pygame.draw.line(window, white, [50,50], [600, 50], 5)
pygame.draw.line(window, white, [600,600], [600, 50], 5)
pygame.draw.line(window, white, [50,600], [600, 600], 5)
pygame.draw.line(window, white, [50,450], [600, 450], 5)

for bullet in bullets:
bullet.draw(window)
pygame.display.update()


class shots(object):
def __init__(self, x, y, radius, colour):
self.x = x
self.y = y
self.radius = radius
self.colour = colour
self.vel = shots

def draw(self, window):
pygame.draw.circle(window, self.colour, (self.x,self.y), self.radius)

class enemy(object):

def __init__(self, x, y, width, height, end):
self.x = x
self.y = y
self.width = width
self.height = height
self.end = end
self.path = [self. x, self.end]
self.vel = 4

def draw(self,window):
self.move()

def move(self):
pass

av = player(300, 500, 40, 60, 9)
en = enemy(300, 100, 40, 60, 500)

bullets = []
running = True
while running:
pygame.time.delay(100)

for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False

for bullet in bullets:
if bullet.y < 600 and bullet.y > 70:
bullet.y -= 8
else:
bullets.pop(bullets.index(bullet))

keys = pygame.key.get_pressed()

if keys[pygame.K_w] and av.y > 440:
av.y -= av.vel

if keys[pygame.K_a] and av.x > 65:
av.x -= av.vel

if keys[pygame.K_s] and av.y < 535:
av.y += av.vel

if keys[pygame.K_d] and av.x < 530:
av.x += av.vel

if keys[pygame.K_SPACE]:
if len(bullets) < 5:
bullets.append(shots(round(av.x + av.width//2), round(av.y + av.height//2), 6, (0,0,0)))


drawGrid()

window.blit(enemy, (en.x, en.y))
window.blit(avatar, (x,y))

pygame.quit()

我希望敌人按照我描述的方式移动,但他们根本没有移动。

最佳答案

为了让您更接近您正在寻找的游戏,我会做一些事情:

  1. 创造更多敌人

现在您在这里创建了 1 个敌人:en = enemy(300, 100, 40, 60, 500) 并将敌人图像扔到屏幕上的一堆地方。要真正利用 Enemy 类,我会这样做:

enemiesList = []
for i in range (MAX_ENEMIES_I_WANT):
enemiesList.append(enemy(300, 100*i, 40, 60, 500))

注意:如果您希望敌人落入特定形状,您需要定义不同的放置敌人的位置。对于传统的太空入侵者,您可以循环两次,一次用于 y 坐标,一次用于 x。

  1. 从你的 Enemy 类中消灭你的敌人

我不会按照您现在的方式做事,而是在您的 Enemy 类中添加一个 blitToScreen() 方法。像这样的东西:

def BlitToScreen(self,screen):
screen.blit(self.sprite, self.x, self.y)

然后,将所有敌人挡在屏幕上变成两条线:

for e in enemiesList:
e.BlitToScreen(window)
  1. 最后回答您的问题,如果我们真的在模仿太空入侵者,每个敌人每帧移动的量完全相同,因此我们可以对每个 Enemy 对象进行相同的更改。

如果你有一个 frame 编号,它将看起来像这样:

tomove = [0,0]
if(frame%100 == 99):
tomove[0] += 50 # Move down
else if(frame/100%2 == 0):
tomove[1] +=50 # Move right
else:
tomove[1] -=50 # Move left

for e in enemies:
e.x += tomove[0]
e.y += tomove[1]

希望对您有所帮助!

关于python - 如何让我的 Sprite (敌方 Sprite )自己移动?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55926845/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com