繁体   English   中英

Pygame游戏开发射击功能

[英]Pygame Game Development shoot functionality

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

玩家和导弹都是使用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()

我建议您为播放器和导弹使用不同的对象。 您目前的设置方式只能是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()

在这里使用类还有更多优点,但这只是一个开始。 如果您通读了此书并进行了一些更改,您的游戏将更像您想要的那样工作。

您仅应在按下KEYKEY键的空间时设置Missille,而不能使用其他键进行更改。 播放器的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()

mx,my应该使用pygame.Rect()代替px, pymx,my它可以用于draw()blit() ,并且具有检查冲突的方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM