【问题标题】:How do i spawn enemies from every side of the screen pygame? [duplicate]我如何从屏幕pygame的每一侧产生敌人? [复制]
【发布时间】:2020-05-05 07:53:16
【问题描述】:

我一直在为学校编写一些游戏代码,并且正在研究一些教程并弄清楚如何让玩家精灵跟踪鼠标,但现在我无法弄清楚如何从四面八方生成敌人屏幕,而不仅仅是顶部。 (澄清代码分为两个部分/文件,也完全不相关)。我也想知道,我怎么可能让小怪/NPC追逐并转向玩家?

import random
import math
import pygame as py
from PlayerSprite import *

WIDTH = 800
HEIGHT = 600
FPS = 60

# define colors
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)

# initialize pygame and create window
py.init()
py.mixer.init()
screen = py.display.set_mode((WIDTH, HEIGHT))
py.display.set_caption("Dimensional Drifter")
clock = py.time.Clock()

all_sprites = py.sprite.Group()
NPCs = py.sprite.Group()
player = Player()
all_sprites.add(player)
for i in range(8):
    n = NPC()
    all_sprites.add(n)
    NPC.add(n)
# Game loop
running = True
while running:
    # keep loop running at the right speed
    clock.tick(FPS)

    for event in py.event.get():
        # check for closing window
        if event.type == py.QUIT:
            running = False

    # Update
    all_sprites.update()
    #
    mouse_x, mouse_y = py.mouse.get_pos()
    player.rotate(mouse_x, mouse_y)
    # render
    screen.fill(BLACK)
    all_sprites.draw(screen)
    # flip the display
    py.display.flip()

py.quit()
import pygame as py
import math
import random

WIDTH = 800
HEIGHT = 600
FPS = 60

# define colors
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)


class Player(py.sprite.Sprite):
    def __init__(self):
        py.sprite.Sprite.__init__(self)
        self.image = py.Surface((50, 50), py.SRCALPHA)
        self.image.fill(GREEN)
        self.rect = self.image.get_rect()
        self.rect.centerx = WIDTH / 2
        self.rect.bottom = HEIGHT / 2
        self.Yspeed = 0
        self.rotatableimage = self.image

    def update(self):
        self.Xspeed = 0
        self.Yspeed = 0
        # line below allow for key press to equate to move of sprite
        keypreesed = py.key.get_pressed()
        if keypreesed[py.K_a]:
            self.Xspeed = - 11
        if keypreesed[py.K_d]:
            self.Xspeed = 11
        if keypreesed[py.K_w]:
            self.Yspeed = - 11
        if keypreesed[py.K_s]:
            self.Yspeed = 11
        self.rect.x += self.Xspeed
        self.rect.y += self.Yspeed
        # line below allow the sprite to wrap around the screen
        if self.rect.left > WIDTH:
            self.rect.right = 0
        if self.rect.right < 0:
            self.rect.left = WIDTH
        if self.rect.top > HEIGHT:
            self.rect.top = 0
        if self.rect.bottom < 0:
            self.rect.bottom = HEIGHT

    def rotate(self, mouse_x, mouse_y):
        rel_x = mouse_x - self.rect.x
        rel_y = mouse_y - self.rect.y
        angle = (180 / math.pi) * -math.atan2(rel_y, rel_x)

        self.image = py.transform.rotate(self.rotatableimage, int(angle))
        self.rect = self.image.get_rect(center=(self.rect.centerx, self.rect.centery))
        return


class NPC(py.sprite.Sprite):
    def __init__(self):
        py.sprite.Sprite.__init__(self)
        self.image = py.Surface((30, 30))
        self.image.fill(RED)
        self.rect = self.image.get_rect()
        self.rect.x = random.randrange(WIDTH - self.rect.width)
        self.rect.y = random.randrange(-100, -40)
        self.Yspeed = random.randrange(1, 8)

    def update(self):
        self.rect.y += self.Yspeed
        if self.rect.top > HEIGHT + 10:
            self.rect.x = random.randrange(WIDTH - self.rect.width)
            self.rect.y = random.randrange(-100, -40)
            self.Yspeed = random.randrange(1, 8)

提前致谢。

【问题讨论】:

    标签: python python-3.x pygame python-3.6 python-3.7


    【解决方案1】:

    您必须为 x 和 y 方向添加随机方向和单独的速度(self.Xspeedself.Yspeed):

    self.direction = random.randrange(4)
    

    并根据随机方向设置self.rect.xself.rect.yself.Xspeedself.Yspeed

    if self.direction == 0:
        self.rect.x = random.randrange(WIDTH - self.rect.width)
        self.rect.y = random.randrange(-100, -40)
        self.Xspeed = 0
        self.Yspeed = random.randrange(1, 8)
    elif self.direction == 1:
        # [...]
    elif self.direction == 2:
        # [...]
    elif self.direction == 3:
        # [...]
    

    创建一个方法spawn,生成一个随机方向和随机速度的敌人,并在NPC的构造函数中调用:

    class NPC(py.sprite.Sprite):
        def __init__(self):
            # [...]        
    
            self.spawn()
    
        def spawn(self):
            self.direction = random.randrange(4)
            if self.direction == 0:
                # [...]
    

    update 中,速度必须分别为 和 到 x 和 y 位置:

    self.rect.x += self.Xspeed
    self.rect.y += self.Yspeed
    

    此外,如果对象在窗口外,则必须根据direction 进行评估。如果物体在窗外,则再次调用spawn(),从而物体得到一个新的随机方向、位置和速度:

    if self.direction == 0:
        if self.rect.top > HEIGHT + 10:
            self.spawn()
    elif self.direction == 1:
        if self.rect.bottom < -10:
            self.spawn()
    elif self.direction == 2:
        if self.rect.left > WIDTH + 10:
            self.spawn()
    elif self.direction == 3:
        if self.rect.right < -10:
            self.spawn()
    

    要旋转图像,您必须使用每像素 alpha (convert_alpha()) 创建表面并保持原始表面:

    self.image = py.Surface((30, 30)).convert_alpha()
    self.image.fill(RED)
    self.originalimage = self.image  
    

    计算从敌人到玩家的角度并将图像旋转pygame.transform.rotate(): (另见How to rotate a triangle to a certain angle in pygame?

    dir_x, dir_y = player.rect.x - self.rect.x, player.rect.y - self.rect.y
    self.rot = (180 / math.pi) * math.atan2(-dir_x, -dir_y)
    self.image = py.transform.rotate(self.originalimage, self.rot)
    

    班级NPC:

    class NPC(py.sprite.Sprite):
        def __init__(self, player):
            py.sprite.Sprite.__init__(self)
            self.player = player 
            self.image = py.Surface((30, 30)).convert_alpha()
            self.image.fill(RED)
            self.originalimage = self.image
            self.rect = self.image.get_rect()
            self.spawn()
    
        def spawn(self):
            self.direction = random.randrange(4)
            if self.direction == 0:
                self.rect.x = random.randrange(WIDTH - self.rect.width)
                self.rect.y = random.randrange(-100, -40)
                self.Xspeed = 0
                self.Yspeed = random.randrange(1, 8)
            elif self.direction == 1:
                self.rect.x = random.randrange(WIDTH - self.rect.width)
                self.rect.y = random.randrange(HEIGHT, HEIGHT+60)
                self.Xspeed = 0
                self.Yspeed = -random.randrange(1, 8)
            elif self.direction == 2:
                self.rect.x = random.randrange(-100, -40)
                self.rect.y = random.randrange(HEIGHT - self.rect.height)
                self.Xspeed = random.randrange(1, 8)
                self.Yspeed = 0
            elif self.direction == 3:
                self.rect.x = random.randrange(WIDTH, WIDTH+60)
                self.rect.y = random.randrange(HEIGHT - self.rect.height)
                self.Xspeed = -random.randrange(1, 8)
                self.Yspeed = 0
    
        def update(self):
            self.rect.x += self.Xspeed
            self.rect.y += self.Yspeed
    
            dir_x, dir_y = self.player.rect.x - self.rect.x, self.player.rect.y - self.rect.y
            self.rot = (180 / math.pi) * math.atan2(-dir_x, -dir_y)
            self.image = py.transform.rotate(self.originalimage, self.rot)
    
            if self.direction == 0:
                if self.rect.top > HEIGHT + 10:
                    self.spawn()
            elif self.direction == 1:
                if self.rect.bottom < -10:
                    self.spawn()
            elif self.direction == 2:
                if self.rect.left > WIDTH + 10:
                    self.spawn()
            elif self.direction == 3:
                if self.rect.right < -10:
                    self.spawn()
    
    player = Player()
    all_sprites.add(player)
    for i in range(8):
        n = NPC(player)
        all_sprites.add(n)
        NPC.add(n)
    

    【讨论】:

    • 哎呀,真是太快了,谢谢,伙计。我讨厌成为那个我很难消化这个的人,因为我很困惑
    • 我讨厌问,但是您是否可以将您的答案进一步分解,因为我对 pygame 还很陌生。谢谢
    • 你第一次在 StackOverflow 上道歉
    • 我还有一个问题要问你我已将你的代码放入我的代码中,我想知道是否必须在第一部分代码中调用任何内容
    • 哦,这很奇怪,我不知道这是 Pycharm 的问题还是什么,但我回来了这个错误行 /venv/lib/python3.7/site-packages/pygame/sprite. py",第 463 行,在 updates.update(*args) 和 NameError: name 'player' is not defined for the line: dir_x, dir_y = player.rect.x - self.rect.x, player.rect.y - self.rect.y 所以 idk
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-22
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多