首页 文章

如何让敌人跟随Pygame中的玩家?

提问于
浏览
-3

所以,我是Python和Pygame的初学者,想要一些帮助 . 我正在尝试制作类似于小行星的游戏,我通过浏览互联网上的其他示例来完成大部分程序 . 但是,我坚持这个问题:如何让敌人精灵跟随玩家精灵?我已经google了如何这样做,并尝试在我的代码上实现相同的东西,但精灵只是停留在一个地方,并没有跟随播放器 . 我已经使用了向量来创建玩家精灵,但我仍然不明白它是如何工作的 . 我的时间紧迫,所以我没有时间彻底了解这些东西,但我打算稍后 . 很抱歉,如果我没有正确解释我的代码,但我仍然试图了解Pygame的工作原理,大部分代码基本上都是复制的 .

import random, math, pygame, time, sys
from pygame.locals import *
from pygame.math import Vector2



######Setting up Variables
class settings:
    fps = 30
    windowwidth = 590
    windowheight = 332

class ship:
    HEALTH = 3
    SPEED = 4
    SIZE = 25

class colours:
    black = (0, 0, 0)
    white = (255, 255, 255)

###########################




######################################################################################

class Player(pygame.sprite.Sprite):
    def __init__(self,image_file , pos=(0,0)):
        super(Player, self).__init__()
        self.image = pygame.image.load(image_file)
        self.image = pygame.transform.scale(self.image, (25,25))
        self.original_image = self.image
        self.rect = self.image.get_rect(center=pos)
        self.position = Vector2(pos)
        self.direction = Vector2(1, 0)
        self.speed = 0
        self.angle_speed = 0
        self.angle = 0

    def update(self):
        if self.angle_speed != 0:
            self.direction.rotate_ip(self.angle_speed)
            self.angle += self.angle_speed
            self.image = pygame.transform.rotate(self.original_image, -self.angle)
            self.rect = self.image.get_rect(center=self.rect.center)
        self.position += self.direction * self.speed
        self.rect.center = self.position

class Enemy(pygame.sprite.Sprite):
    def __init__(self, image_file, pos=(0,0)):
        super(Enemy, self).__init__()
        self.image = pygame.image.load(image_file)
        self.image = pygame.transform.scale(self.image, (25, 25))
        self.original_image = self.image
        self.rect = self.image.get_rect(center=pos)
        self.speed = 1

    def move_towards_player(self, Player):
        dx, dy = self.rect.x - Player.rect.x, self.rect.y - Player.rect.y
        dist = math.hypot(dx, dy)
        dx, dy = dx/dist, dy/dist
        self.rect.x += dx * self.speed
        self.rect.y += dy * self.speed







class Background(pygame.sprite.Sprite):
    def __init__(self, image_file, location):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.image.load(image_file)
        self.rect = self.image.get_rect()
        self.rect.left, self.rect.top = location





def main():
    pygame.init()

    screen = pygame.display.set_mode((settings.windowwidth, settings.windowheight))
    pygame.display.set_caption('Final Game')

    background = Background('space.jpg',[0,0])

    global player, enemy
    player = Player('SpaceShip.png',[200,100])
    playersprite = pygame.sprite.RenderPlain((player))
    enemy = Enemy('Enemy Hexagon.png',[300,150])
    enemysprite = pygame.sprite.RenderPlain((enemy))


    fpsClock = pygame.time.Clock()


    intro = True

    while intro == True:
        myFont = pygame.font.SysFont('freesansbold.ttf', 75)
        otherFont = pygame.font.SysFont('freesansbold.ttf', 30)
        SurfaceFont = myFont.render("Space Destroyer", True, (colours.white))
        SurfaceFont2 = otherFont.render("Press Space to Start", True, (colours.white))
        for event in pygame.event.get():
            if event.type ==    KEYDOWN:
                if event.key == K_SPACE:

                    intro= False

        screen.blit(SurfaceFont,(50,50))
        screen.blit(SurfaceFont2,(125,125))
        pygame.display.flip()
        screen.blit(background.image, background.rect)



    while intro == False:
        fpsClock.tick(settings.fps)

        for event in pygame.event.get():
            enemy.rect.x
            if event.type == QUIT:
                pygame.quit()
                sys.exit()

            elif event.type == KEYDOWN:
                if event.key == K_UP:
                    player.speed += 4
                if event.key == K_LEFT:
                    player.angle_speed = -4
                if event.key == K_RIGHT:
                    player.angle_speed = 4

                if player.position.y < 0:
                    player.position = (player.position.x ,332)

                elif player.position.y > settings.windowheight:
                    player.position = (player.position.x, 0)

                elif player.position.x < 0:
                    player.position = (590, player.position.y)

                elif player.position.x > settings.windowwidth:
                    player.position = (0, player.position.y)

            elif event.type == KEYUP:
                if event.key == K_LEFT:
                    player.angle_speed = 0
                if event.key == K_RIGHT:
                    player.angle_speed = 0
                if event.key == K_UP:
                    player.speed = 0








        screen.fill(colours.white)
        screen.blit(background.image, background.rect)
        enemysprite.draw(screen)
        enemysprite.update()
        playersprite.draw(screen)
        playersprite.update()

        pygame.display.update()
        playersprite.update()

        pygame.display.flip()

if __name__ == '__main__': main()

1 回答

  • 0

    你从未打电话给 move_towards_player . 尝试添加此:

    ...
    enemysprite.draw(screen)
    enemysprite.update()
    playersprite.draw(screen)
    playersprite.update()
    enemy.move_towards_player(player)
    ...
    

相关问题