Pygame游戏开发射击功能

时间:2019-05-06 18:51:27

标签: python pygame

我的问题是我该如何改善游戏的射击功能。我正在尝试使其达到玩家可以沿其移动方向射击的位置(例如,向上,向下,向左,向右射击),以及在移动时射击和在空闲时射击。

玩家和导弹都是使用pygame形状的矩形,这使我更容易理解游戏开发背后的逻辑。

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])

以下是游戏的代码,可帮助您更好地理解我在说什么。我注释掉的一小部分是我尝试过的。我目前仅将其设置为从其初始起点向左移动x方向。

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 个答案:

答案 0 :(得分:4)

我建议您为播放器和导弹使用不同的对象。您目前的设置方式只能是1个玩家和1个导弹。仅拥有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 :(得分:1)

仅当您按下空格键时才应设置Missille,而不要使用其他键来更改它。播放器可能具有变量direction,因此您将在停留时知道它向哪个方向移动,以及向哪个方向移动misille。

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,mypygame.Rect()-它可以用于draw()blit(),并且具有检查冲突的方法。