Функция съемки в pygame w /2 Players

Я пытаюсь запрограммировать функцию съемки в своей игре, используя pygame. Процесс:

  • Игрок один нажимает «Пробел» и снимает свой тип снаряда.
  • Игрок два нажимал 'E' и стрелял в своего типа снаряда.
  • Игровой снаряд столкнется с игроком два, но не с игроком (и наоборот).

Я не уверен, как правильно закодировать эту функцию. Вот мой код:

Initalize
import pygame, math
WHITE = (255, 255, 255)
#Creating sprites

class Player(pygame.sprite.Sprite):

    def __init__(self, color, width, height):

        super().__init__()
        #Config
        self.image = pygame.Surface([width, height])
        self.image.fill(WHITE)
        self.image.set_colorkey(WHITE)

        # Draw
        pygame.draw.rect(self.image, color, [0, 0, width, height])

        # Fetch
        self.rect = self.image.get_rect()

    def right(self, pixels):
        self.rect.x += pixels
    def left(self, pixels):
        self.rect.x -= pixels
    def up(self, pixels):
        self.rect.y -= pixels
    def down(self, pixels):
        self.rect.y += pixels

pygame.init()
# Config
RED = ( 255, 0, 0)
BLUE = ( 43, 255, 230)
ORANGE = ( 255, 170, 0)
BLACK = (0, 0, 0)

SCREENWIDTH = 400
SCREENHEIGHT = 500

size = (SCREENWIDTH, SCREENHEIGHT)
screen = pygame.display.set_mode(size)
pygame.display.set_caption("Squares Fight")

group1 = pygame.sprite.Group()

player1 = Player(BLUE, 50, 50)
player2 = Player(ORANGE, 50, 50)
player1.rect.x = 5
player1.rect.y = 5
player2.rect.x = 345
player2.rect.y = 445

group1.add(player1, player2)

loop = True
startend = False
startanew = True
clock = pygame.time.Clock()
font = pygame.font.SysFont("berlinsansfb", 72)
text = font.render("Fight!", True, WHITE)

# Game Loop
while loop:
        for event in pygame.event.get():
                if event.type == pygame.QUIT:
                        loop = False

        #Logic
        keys = pygame.key.get_pressed()
        if keys[pygame.K_LEFT]:
                player1.left(3)
        if keys[pygame.K_RIGHT]:
                player1.right(3)
        if keys[pygame.K_UP]:
                player1.up(3)
        if keys[pygame.K_DOWN]:
                player1.down(3)
        if keys[pygame.K_a]:
                player2.left(3)
        if keys[pygame.K_d]:
                player2.right(3)
        if keys[pygame.K_w]:
               player2.up(3)
        if keys[pygame.K_s]:
               player2.down(3)

    collision = pygame.sprite.collide_rect(player1, player2)
    if collision == True:
            group1.remove(player1, player2)
            startend = True
    group1.update()
    if startend == True:
            pygame.display.set_caption("They destroyed eachother! Press space to do it again")
            startanew = True
    if startanew == True and keys[pygame.K_SPACE]:
            group1.add(player1, player2)
            pygame.display.set_caption("Squares Fight")
            startend = False
    # Drawing
    screen.fill(BLACK)
    screen.blit(text,
                (200 - text.get_width() // 2, 240 - text.get_height() // 2))
    group1.draw(screen)

    # Closing
    pygame.display.flip()
    clock.tick(60)
    #Indentation isnt right because how i needed to format this
 pygame.quit()

Что еще мне нужно добавить для выполнения этой задачи?

4 голоса | спросил Pygasm 31 +03002017-10-31T20:00:15+03:00312017bEurope/MoscowTue, 31 Oct 2017 20:00:15 +0300 2017, 20:00:15

1 ответ


1

Как вы обрабатываете несколько объектов, которые выполняют одну и ту же вещь (например, пулю) в Pygame, используются группы. Группы - эффективный способ запуска одного и того же кода для группы объектов. Например:

class Bullet():
    def move(self):
        self.x += 1

bullet1 = Bullet()
bullet2 = Bullet()
bullet3 = Bullet()

bullet_group = pygame.sprite.Group() #Make new group
bullet_group.add(bullet1, bullet2, bullet3) #Add objects to group

bullet_group.move() #Execute move() method for all objects in group

Итак, скажем, вы хотели сделать пули из Player 2 только для игрока 1. Прежде всего, лучший способ сделать два разных типа пуль, которые будут двигаться одинаково, - создать родительский класс, BulletParent . Затем, чтобы получить правильные коллизии, вы, скорее всего, захотите сделать класс BulletParent дочерним по отношению к классу pygame.sprite.Sprite .

class BulletParent(pygame.sprite.Sprite):

Затем вы можете сделать какой-то метод move () внутри класса BulletParent для перемещения маркера.

class BulletParent(pygame.sprite.Sprite):
    def __init__(self, direction):
        super().__init__()
        self.direction = direction

    def move(self):
        #add moving code here
        pass

Теперь вы можете создать два дочерних класса класса BulletParent , скажем Bullet1 (для игрока 1) и Bullet2 (для игрока 2). Это важно, потому что нам нужен способ узнать, какая пуля принадлежит игроку. После того, как вы сделали эти занятия, вам нужно проверить, нажал ли каждый игрок свою кнопку съемки. Давайте сделаем одну функцию для проверки нажатия клавиш и сделаем bullet1_group и bullet2_group :

bullet1_group = pygame.sprite.Group()
bullet2_group = pygame.sprite.Group()

def check_keys():
    keys = pygame.keys.get_pressed()

    #Arrows keys and WASD presses

    if key[pygame.K_SPACE]:
        bullet1 = Bullet1(player1.direction) #may need to add direction variable for player1
        bullet1_group.add(bullet1)

    if key[pygame.K_a]:
        bullet2 = Bullet2(player2.direction) #may need to add direction variable for player2
        bullet2_group.add(bullet2)

Это приведет к появлению новых пуль каждый раз, когда нажимается одна из клавиш съемки. Теперь мы можем сделать функцию, которая возвращается, если игрок 1 попал и сделать другого, чтобы сделать то же самое для Player 2. Мы можем использовать функцию pygame.sprite.spritecollideany () , чтобы увидеть, столкнулось ли что-то с наших игроков. Он вернет Sprite, если что-то столкнулось, а None, если нет.

def player1_hit():
    collide = pygame.sprite.spritecollideany(player1, bullet2_group)
    if collide == None: return False
    else: return True

def player2_hit():
    collide = pygame.sprite.spritecollideany(player2, bullet1_group)
    if collide == None: return False
    else: return True

Мы можем создать функцию, которая перемещает обе группы маркеров:

def move_bullets():
    bullet1_group.move()
    bullet2_group.move()

Наконец, вы можете добавить функции check_keys и move_bullets в основной цикл и добавить некоторую логику для использования с player1_hit и player2_hit .

Надеюсь, это помогло, и я надеюсь, что вы продолжите программирование независимо от проблемы!

ответил ModernIndieDev 13 Jam1000000amSat, 13 Jan 2018 08:29:57 +030018 2018, 08:29:57

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132