首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Pygame中如何让敌人追随玩家?

在Pygame中如何让敌人追随玩家?
EN

Stack Overflow用户
提问于 2018-06-09 08:51:48
回答 1查看 606关注 0票数 -3

所以,我是Python和Pygame的初学者,需要一些帮助。我正在尝试制作一个类似于小行星的游戏,我通过在互联网上查看其他例子来制作这个程序的大部分内容。然而,我被这个问题卡住了:我如何让敌人的精灵跟随玩家精灵?我已经在谷歌上搜索了如何做到这一点,并尝试在我的代码中实现相同的东西,但精灵只停留在一个地方,不跟随玩家。我使用矢量的东西来创建玩家精灵,但我仍然不太明白它是如何工作的。我的日程安排很紧,所以我没有时间彻底了解这些东西,但我打算稍后再了解。抱歉,如果我没有正确解释我的代码,但我仍然试图理解Pygame是如何工作的,并且这些代码的大部分基本上都是复制的。

代码语言:javascript
复制
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()
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-09 09:00:05

你从没给move_towards_player打过电话。尝试添加以下内容:

代码语言:javascript
复制
...
enemysprite.draw(screen)
enemysprite.update()
playersprite.draw(screen)
playersprite.update()
enemy.move_towards_player(player)
...
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50769980

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档