Как заставить экземпляры автоматически появляться вокруг игрока? - PullRequest
0 голосов
/ 16 февраля 2019

Итак, я хочу, чтобы вокруг игрока появлялись зомби (количество зомби должно увеличиваться с течением времени).Поскольку я не хочу, чтобы игрок умирал мгновенно, мне нужно, чтобы зомби появлялись вдали от игрока на определенном расстоянии, но в другом месте, кроме этого.

import pygame    
import turtle    
import time    
import math    
import random    
import sys    
import os    
pygame.init()    



WHITE = (255,255,255)    
GREEN = (0,255,0)    
RED = (255,0,0)    
BLUE = (0,0,255)    
BLACK = (0,0,0)    

BGColor = (96,128,56)    
ZColor = (221,194,131)    
PColor = (0,0,255)    

MOVE = 2.5    

size = (1200, 620)    
screen = pygame.display.set_mode(size)    
pygame.display.set_caption("Zombie Game")    

class Char(pygame.sprite.Sprite):    
    def __init__(self, color, pos, radius, width):    
        super().__init__()    
        self.image = pygame.Surface([radius*2, radius*2])    
        self.image.fill(WHITE)    
        self.image.set_colorkey(WHITE)    
        pygame.draw.circle(self.image, color, [radius, radius], radius, width)    
        self.rect = self.image.get_rect()    

    def moveRight(self, pixels):    
        self.rect.x += pixels    
        pass    

    def moveLeft(self, pixels):    
        self.rect.x -= pixels    
        pass    

    def moveUp(self, pixels):    
        self.rect.y -= pixels    
        pass    

    def moveDown(self, pixels):    
        self.rect.y += pixels    
        pass    

class Zombie(pygame.sprite.Sprite):    
    def __init__(self2, color, pos, radius, width):    
        super().__init__()    
        self2.image = pygame.Surface([radius*2, radius*2])    
        self2.image.fill(WHITE)    
        self2.image.set_colorkey(WHITE)    
        pygame.draw.circle(self2.image, color, [radius, radius], radius, width)    
        self2.rect = self2.image.get_rect()    

    def moveRight(self2, pixels):    
        self2.rect.x += pixels    
        pass    

    def moveLeft(self2, pixels):    
        self2.rect.x -= pixels    
        pass    

    def moveUp(self2, pixels):    
        self2.rect.y -= pixels    
        pass    

    def moveDown(self2, pixels):    
        self2.rect.y += pixels    
        pass    


all_sprites_list = pygame.sprite.Group()    

playerChar = Char(PColor, [0, 0], 15, 0)    
playerChar = Char(PColor, [0, 0], 15, 0)    
playerChar.rect.x = 0    
playerChar.rect.y = 0    

all_sprites_list.add(playerChar)    

carryOn = True    
clock = pygame.time.Clock()    

while carryOn:    
    for event in pygame.event.get():    
        if event.type==pygame.QUIT:    
            carryOn=False    
        elif event.type==pygame.KEYDOWN:    
            if event.key==pygame.K_x:    
                carryOn=False    

    keys = pygame.key.get_pressed()    
    if keys[pygame.K_a]:    
        playerChar.moveLeft(MOVE)    
    if keys[pygame.K_d]:    
        playerChar.moveRight(MOVE)    
    if keys[pygame.K_w]:    
        playerChar.moveUp(MOVE)    
    if keys[pygame.K_s]:    
        playerChar.moveDown(MOVE)    

    screen.fill(BGColor)    
    screen.blit(playerChar.image,playerChar.rect)    
    pygame.display.flip()    
    clock.tick(60)    
pygame.quit()    

Я пока не мог ничего попробовать, потому чтоЯ понятия не имел, с чего начать.

1 Ответ

0 голосов
/ 16 февраля 2019

Мне нужно, чтобы зомби появлялись вдали от игрока на определенном расстоянии.

В конструкторе класса Zombie центральная позиция атрибута rect должнабыть установлено:

class Zombie(pygame.sprite.Sprite):    
    def __init__(self2, color, pos, radius, width):    
        super().__init__()    
        self2.image = pygame.Surface([radius*2, radius*2])    
        self2.image.fill(WHITE)    
        self2.image.set_colorkey(WHITE)    
        pygame.draw.circle(self2.image, color, [radius, radius], radius, width)    
        self2.rect = self2.image.get_rect()

        self2.rect.center = pos # <-------- add this

Определить список, который содержит зомби (zombie_list), размер (радиус) zombie_rad зомби.Далее диапазон (zombie_dist) для расстояния появления зомби (минимальное и максимальное расстояние) и промежуток времени в миллисекундах, когда появляется первый зомби (next_zombie_time).

zombie_list = []
zombie_rad = 10   
zombie_dist = (65, 150)
next_zombie_time = pygame.time.get_ticks() + 3000 # first zombie after 3 seconds

Использование pygame.time.get_ticks() для получения количества миллисекунд с момента запуска программы.Если время превышает next_zombie_time, охватите зомби и установите время появления следующего зомби:

current_time = pygame.time.get_ticks()
if current_time > next_zombie_time:
    next_zombie_time = current_time + 1000 # 1 second interval to the next zombie

    # [...] spawn the zombie

Создайте прямоугольник внешнего предела для позиции зомби.Этот прямоугольник является прямоугольником экрана, уменьшенным на радиус зомби с каждой стороны.Каждая позиция внутри этого прямоугольника является действительной центральной позицией зомби, так что зомби полностью включен в пределах границ экрана.
Используйте pygame.Rect.collidepoint, чтобы проверить, находится ли позиция внутри прямоугольника,Повторяйте создание случайной позиции, пока не найдете позицию внутри прямоугольника:

on_screen_rect = pygame.Rect(zombie_rad, zombie_rad, size[0]-2*zombie_rad, size[1]-2*zombie_rad)
    zombi_pos = (-1, -1)
    while not on_screen_rect.collidepoint(zombi_pos):

        # [...] create random zombie pos 

Чтобы получить случайную позицию вокруг игрока, установите случайное расстояние до игрока на random.randint(a,b) и случайный угол вокруг игрока врадиант по random.random() * math.pi * 2:

dist  = random.randint(*zombie_dist)
angle = random.random() * math.pi * 2

Окончательно вычислите положение путем преобразования полярной координаты (dist, angle) в декартову координату :

p_pos = (playerChar.rect.centerx, playerChar.rect.centery)
zombi_pos = (p_pos[0] + dist * math.sin(angle), p_pos[1] + dist * math.cos(angle))

См. Изменения в основном цикле программы:

zombie_list = []
zombie_rad = 10   
zombie_dist = (65, 150)
next_zombie_time = 3000

while carryOn:
    for event in pygame.event.get():
        if event.type==pygame.QUIT:
            carryOn=False
        elif event.type==pygame.KEYDOWN:
            if event.key==pygame.K_x:
                carryOn=False

    keys = pygame.key.get_pressed()
    if keys[pygame.K_a]:
        playerChar.moveLeft(MOVE)
    if keys[pygame.K_d]:
        playerChar.moveRight(MOVE)
    if keys[pygame.K_w]:
        playerChar.moveUp(MOVE)
    if keys[pygame.K_s]:
        playerChar.moveDown(MOVE)

    current_time = pygame.time.get_ticks()
    if current_time > next_zombie_time:
        next_zombie_time = current_time + 1000 # 1 second interval to the next zombie

        on_screen_rect = pygame.Rect(zombie_rad, zombie_rad, size[0]-2*zombie_rad, size[1]-2*zombie_rad)
        zombi_pos = (-1, -1)
        while not on_screen_rect.collidepoint(zombi_pos):
            dist  = random.randint(*zombie_dist)
            angle = random.random() * math.pi * 2 
            p_pos = (playerChar.rect.centerx, playerChar.rect.centery)
            zombi_pos = (p_pos[0] + dist * math.sin(angle), p_pos[1] + dist * math.cos(angle))

        new_pos = (random.randrange(0, size[0]), random.randrange(0, size[1]))
        new_zomby = Zombie(RED, zombi_pos, zombie_rad, 0)
        zombie_list.append(new_zomby)

    screen.fill(BGColor)    
    screen.blit(playerChar.image,playerChar.rect)   
    for zombie in zombie_list:
        screen.blit(zombie.image,zombie.rect)      

    pygame.display.flip()    
    clock.tick(60)    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...