Как я могу сделать что-то случайное каждые X секунд? - PullRequest
0 голосов
/ 17 мая 2019

Я сделал некоторый Кодекс, который заставляет врага стрелять, когда игрок находится в определенном диапазоне, но мне не понравилось, как это работает. Теперь я пытаюсь сделать это случайно в диапазоне (1,10) /s.

Я знаю, что это связано с импортом времени. Но я застрял там. Кто-нибудь может помочь?

clock = pygame.time.Clock()
class Enemy1():
    global win
    def __init__(self,x,y,end,width = 30,height = 30,color = (220,100,100)):
        self.x = x
        self.y = y
        self.width = width
        self.height = height
        self.color = color
        self.end = end
        self.path = [self.x, self.end]
        self.speed = 2     
        self.hitbox = [self.x, self.y,self.width,self.height]
        self.health = 300
        self.alive = True


    def draw(self, win):
            self.movement()
            pygame.draw.rect(win,self.color,(self.hitbox))

    def movement(self):

        if self.speed > 0:
            if self.hitbox[0] < self.path[1]+ self.speed:
                self.hitbox[0] += self.speed
                self.x += self.speed
            else:
                self.speed = self.speed * -1
                self.hitbox[0] += self.speed
                self.x += self.speed
        else:
            if self.hitbox[0]> self.path[0] - self.speed:
                self.hitbox[0] += self.speed
                self.x += self.speed
            else:
                self.speed = self.speed * -1
                self.hitbox[0] += self.speed
                self.x += self.speed
    def hit(self):

        if self.health > 0:
            if self.health - 15 >= 0:
                self.health -= 15
            else:
                self.health = 0
        else:
            self.alive = False

    def enemyhealth(self):
        myfont = pygame.font.SysFont('Arial', 15)
        text = myfont.render('Enemy Health: {}'.format(str(round(self.health))), 0, (255, 255, 255))
        win.blit(text,(10,10))

class EnemyShots():
    def __init__(self,x,y,radius,color):
        self.x = x
        self.y = y
        self.radius = radius
        self.color = color
        self.speed = 30
    def draw(self,win):
        pygame.draw.circle(win,self.color, (self.x, self.y), self.radius)

вражеские пули = []

В основном цикле:

clock.tick(27)
    if enemy1.x >= player.x - 10 and enemy1.x <= player. x + 40:
        if len(enemybullets) < 1:
            enemybullets.append(EnemyShots(round(enemy1.x+ 15), round(enemy1.y + 35),3,(255,0,0)))

Ответы [ 2 ]

0 голосов
/ 17 мая 2019

Использование time.sleep() внутри игрового цикла сделает его невосприимчивым.

Вы можете вспомнить время следующего выстрела и стрелять, когда это время прошло, а затем создать новый:

from random import randint
from datetime import datetime, timedelta

def shoot(now):
    print("BOING:", now)


# demonstation purpose game loop, runs until 3 shots are fired
def gameloop():  
    next_shot = datetime.now()
    i = 3
    # runs until i == 0
    while i:
        # do stuff 
        # do more stuff 
        # check if we need to shoot again
        if datetime.now() > next_shot:
            shoot(next_shot)
            i -= 1
            # create next shoot time using now() + 1 to 10 seconds
            next_shot = datetime.now() + timedelta(seconds=randint(1,10))

gameloop() 

Выход:

BOING: 2019-05-17 15:12:03.074492
BOING: 2019-05-17 15:12:09.074579
BOING: 2019-05-17 15:12:18.074620

У этого шарма нет необходимости в постоянном FPS - как только будет пройдено следующее время съемки, будет произведен следующий выстрел.

0 голосов
/ 17 мая 2019

Вы можете добавить к своей update() подпрограмме в вашем Enemy классе вот так:

class Enemy():
    self.FramesUntilNextShot = random(1,10)
    def update():
        self.FramesUntilNextShot -=1
        if(self.FramesUntilNextShot <= 0):
            self.FramesUntilNextShot = random(1,10)
            self.ShootANewBullet()

Предполагая, что у вас постоянный FPS (вероятно, достаточно хороший для ваших целей), вы можете измерить время до следующего случайного выстрела в единицах 1/FPS в FramesUntilNextShot. Затем, когда он достигнет 0, вы стреляете и снова делаете его случайным числом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...