Pygame Game Development стрелять функциональность - PullRequest
0 голосов
/ 06 мая 2019

У меня вопрос, как я могу улучшить свои функции стрельбы в моей игре.Я пытаюсь сделать так, чтобы игрок мог стрелять в направлении, в котором он движется (например, стрелять вверх, вниз, влево, вправо), а также стрелять во время движения и стрелять в режиме ожидания.

Игрок и ракета имеют прямоугольную форму с использованием фигур пигмеев, чтобы мне было легче понять логику разработки игр.

def player(px,py):
    pygame.draw.rect(gameWindow,black,[px,py,30,30])

def missile(mx,my):
    pygame.draw.rect(gameWindow,black,[mx,my,10,10])

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

import pygame #####IMPORTING PYGAME MODULE###########################

pygame.init() #####INITIALIZING PYGAME##################################

gameWindow = pygame.display.set_mode((800,600)) ###Screen Width and Height###

clock = pygame.time.Clock() ## FRAMES PER SECOND ##

white = (255,255,255)
black = (0,0,0)
red = (255,0,0) 


def player(px,py):
    pygame.draw.rect(gameWindow,black,[px,py,30,30])

def missile(mx,my):
    pygame.draw.rect(gameWindow,black,[mx,my,10,10])

def enemies():
    return


def gameloop():
    px = 700
    py = 300

    mx = 700
    my = 300

    px_change = 0
    py_change = 0

    mx_change = 0
    my_change = 0

    gameExit = False

    while not gameExit:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                gameExit = True
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_LEFT:
                    mx_change = -10
                if event.key == pygame.K_RIGHT:
                    mx_change = 10
                if event.key == pygame.K_UP:
                    my_change = -10
                if event.key == pygame.K_DOWN:
                    my_change = 10

                if event.key == pygame.K_SPACE: 
                    mx_change = -6
                #if event.key == pygame.K_SPACE and pygame.K_RIGHT:
                    #mx_change = 6


                if event.key == pygame.K_LEFT:
                    px_change = -10
                if event.key == pygame.K_RIGHT:
                    px_change = 10
                if event.key == pygame.K_UP:
                    py_change = -10
                if event.key == pygame.K_DOWN:
                    py_change = 10

            if event.type == pygame.KEYUP:
                if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT:
                    px_change = 0
                if event.key == pygame.K_UP or event.key == pygame.K_DOWN:
                    py_change = 0

            if event.type == pygame.KEYUP:
                if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT:
                    mx_change = 0
                    mx = px
                if event.key == pygame.K_UP or event.key == pygame.K_DOWN:
                    my_change = 0
                    my = py
                if event.key == pygame.K_SPACE:
                    mx_change = 0
                    my_change = 0
                    mx = px
                    my = py


        px += px_change
        py += py_change

        mx += mx_change
        my += my_change

        gameWindow.fill(white)

        player(px,py)
        missile(mx,my)
        pygame.display.update()

        clock.tick(100)

    pygame.quit()
    quit()
gameloop()

Ответы [ 2 ]

4 голосов
/ 06 мая 2019

Я бы предложил использовать разные объекты для вашего игрока и ракеты.То, как у вас все настроено, может быть только 1 игроком и 1 ракетой.Хорошо иметь только одного игрока, но одна ракета делает игру скучной.Я предлагаю использовать класс, такой как этот простой пример:

class Projectile():
    def init(self,x,y,vx,vy):
        self.x = x
        self.y = y
        self.vx = vx
        self.vy = vy
    def update(self): 
        self.x += self.vx
        self.y += self.vy

Теперь, когда у вас есть класс, вы можете начать делать великие дела!Хотите, чтобы пробел выпустил новую ракету вместо перемещения одной ракеты на экране?EZPZ!Все, что вам нужно, это список объектов вашей ракеты, за которыми нужно следить, скажем, my_missile_list:

if event.key == pygame.K_SPACE: 
      my_missile_list.append(Projectile(px,py,missile_x_velocity,missile_y_velocity))

Это создает совершенно новый экземпляр класса Projectile, основанный на позиции и скоростях ввода.

Наконец, нам нужно заставить все эти ракеты двигаться!Здесь определение класса делает нашу жизнь проще!Раз в кадре нам просто нужно обновить маркеры:

for b in my_missile_list: 
    b.update()

Использование классов здесь дает больше преимуществ, но это только начало.Если вы прочитаете это и внесете несколько изменений, ваша игра будет работать намного больше, чем вы ищете.

1 голос
/ 06 мая 2019

Вы должны установить missille только тогда, когда у вас KEYDOWN пробел, и не использовать другие клавиши для его изменения.У игрока может быть переменная direction, так что вы будете знать, в каком направлении он смотрит, когда он останется, и вы будете знать, в каком направлении двигаете мисилле.

import pygame

# --- constants --- (UPPER_CASE_NAMES)

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

# --- classes --- (CamelCaseNames)

# empty

# --- functions ---- (lower_case_names_

def player(screen, x, y):
    pygame.draw.rect(screen, BLACK, (x, y, 30, 30))

def missile(screen, x, y):
    pygame.draw.rect(screen, RED, (x, y, 10, 10))

def enemies():
    pass

def gameloop(screen):
    px = 700
    py = 300

    mx = 700
    my = 300

    px_change = 0
    py_change = 0
    p_direction = 'left'

    mx_change = 0
    my_change = 0
    #m_direction = 'left'

    game_exit = False
    clock = pygame.time.Clock() ## FRAMES PER SECOND ##

    while not game_exit:

        # --- events ---

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                game_exit = True
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_LEFT:
                    px_change = -10
                    p_direction = 'left'
                if event.key == pygame.K_RIGHT:
                    px_change = 10
                    p_direction = 'right'
                if event.key == pygame.K_UP:
                    py_change = -10
                    p_direction = 'top'
                if event.key == pygame.K_DOWN:
                    py_change = 10
                    p_direction = 'down'

                if event.key == pygame.K_SPACE:
                    mx = px
                    my = py
                    if p_direction == 'left':
                        mx_change = -16
                        my_change = 0
                    elif p_direction == 'right':
                        mx_change = 16
                        my_change = 0
                    elif p_direction == 'top':
                        mx_change = 0
                        my_change = -16
                    elif p_direction == 'down':
                        mx_change = 0
                        my_change = 16

            if event.type == pygame.KEYUP:
                if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT:
                    px_change = 0
                if event.key == pygame.K_UP or event.key == pygame.K_DOWN:
                    py_change = 0

        # --- changes/updates ---

        px += px_change
        py += py_change

        mx += mx_change
        my += my_change

        # --- draws ----

        screen.fill(WHITE)

        player(screen, px, py)
        missile(screen, mx, my)
        pygame.display.update()

        # --- FPS ---

        clock.tick(30)

# --- main ---

pygame.init()

screen = pygame.display.set_mode((800,600))

gameloop(screen)

pygame.quit()
#quit()

Вместо px, py и mx,my вам следуетиспользуйте pygame.Rect() - его можно использовать для draw() и blit(), и у него есть методы для проверки столкновений.

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