Design de jogos 2D, desenvolvimento de jogos pygame

Esta tarefa é projetar um jogo 2D de forma independente usando o módulo pygame.

O jogo produzido desta vez foi inspirado em jumpKing, que é um jogo de alta tecnologia vendido no Steam.

Escolhemos seu método de operação: as teclas A e D são necessárias para controlar o movimento do personagem, e a barra de espaço faz o personagem pular, e quanto mais tempo a barra de espaço se acumula, mais alto é o salto

Vamos apresentar o processo de produção do nosso jogo.

Um, projete a lógica básica e a interface do jogo.
Esta é uma interface básica e julgamento de gatilho de evento desenhado no rascunho.

O design completo do jogo não é totalmente mostrado no interior.

Em segundo lugar, o design da classe no jogo
1, a classe player
Na classe Player, fornecemos as propriedades básicas de si mesma:

Rect é a posição inicial do personagem. Colocamos a posição inicial do personagem no topo do meio da primeira plataforma que aparece aleatoriamente, por isso precisa ser importada quando o personagem é criado para facilitar o desenho da posição inicial do personagem.

O atributo faceR determina a direção do movimento do personagem, 1 representa o movimento para a direita e 2 representa o movimento para a esquerda.

O atributo de velocidade é a velocidade de movimento do personagem no eixo x.

O atributo gravidade é a velocidade de pouso do personagem no eixo y.

O atributo live serve para determinar se o personagem está vivo.

Função de soltar para controlar o pouso do personagem.

A função Mover controla o movimento do personagem no eixo y. Você precisa inserir o tempo. Este é o momento em que o jogador pressiona a barra de espaço para controlar a duração do movimento do personagem no eixo y.

class Player ():
def init (self, pos):
self.rect = pos
self.faceR = 1 # 1 está à direita, 2 está à esquerda
self.speed = 2
self.gravity = 10
self.live = True #whether Survive

def Drop (self): 
    self.rect.top + = self.gravity 
def Move (self, time): 
    tmp = 0.2 * self.speed * time * time - self.gravity 
    if tmp <= 0: 
        tmp = 0 
    self. rect.top - = tmp 
    self.rect.left + = self.speed * time * self.faceR

2. Classe
de terreno Nesta classe, damos os atributos básicos da classe de terreno:

O atributo de imagem é usado para armazenar fotos de terrenos,

O atributo rect define o atributo Rect do terreno e gera diferentes valores à esquerda através da função aleatória posteriormente para controlar as diferentes posições do terreno.

rect.topleft recebe o valor init_pos fornecido pelo mundo exterior, que é o valor esquerdo da terra.

O atributo gravidade é a velocidade de pouso da terra no eixo y.

A função Mover controla o pouso da classe de terreno.

classe Land (pygame.sprite.Sprite):
def init (self, land_img, init_pos):
pygame.sprite.Sprite. init (self)
self.image = land_img
self.rect = pygame.Rect (0,0,100,20)
self .rect.topleft = init_pos
self.gravity = 4
def Move (self):
self.rect.top + = self.gravity
Terceiro, o código básico do programa
abaixo é baseado nas configurações básicas do pygame para definir a largura e altura da tela. E alguns valores de atributo que serão usados ​​a seguir. Deve ser descrito em detalhes abaixo quando for especificamente usado.

pygame.init ()
largura = 800
altura = 800

window = pygame.display.set_mode ((largura, altura))
pygame.display.set_caption ('jumpK')

pygame.font.init ()

tempo = 0

branco = 255, 255, 255
preto = 0, 0, 0

land_frequency = 0

land_width = 100


#Save todas as terras geradas = pygame.sprite.Group ()

#player = Player ()
create_player = True

player_rect = pygame.Rect (0,0,30,54,) #Judge criação de personagem

jk_begin = Verdadeiro
jk_space = Falso
jk_left = Falso
jk_right = Falso

max_time = 0

#fração

pontuação = 0

clock = pygame.time.Clock ()
Abaixo estão algumas fotos e efeitos sonoros que carregamos.

# 载入 图片
background = pygame.image.load ('tmp / images / back_img.png')
land = pygame.image.load ('tmp / images / land.png')
game_over = pygame.image.load ('tmp /images/gameover.png ')

player1 = pygame.image.load ('tmp / images / player_1.png')
player2 = pygame.image.load ('tmp / images / player_2.png')
player3 = pygame.image.load ('tmp / images / player_3 .png ')
player4 = pygame.image.load (' tmp / images / player_4.png ')
# 载入 游戏 音效
jump = pygame.mixer.Sound (' tmp / sons / jump.wav ')
jump.set_volume (15 )
game_over_sound = pygame.mixer.Sound ('tmp / sons / game_over.wav')
game_over_sound.set_volume (0,05)
pygame.mixer.music.load ('tmp / sons / background.mp3')
pygame.mixer.music.play (-1, 0,0)
pygame.mixer.music.set_volume (0,5)
接下来 , 就是 需要 不断 更新 的 信息。

running = True #Se o jogo terminar
durante a execução:
basta definir a taxa de quadros do jogo, plano de fundo ou algo assim.

clock.tick (30) 

window.blit (background, (0, 0)) 
pygame.draw.rect (window, white, [260, 740, 260, 50], 0)

Aqui está a barra de velocidade de exibição, o comprimento é exibido de acordo com o tempo e iremos zerar o tempo mais tarde.


#Exibir a barra de velocidade pygame.draw.rect (janela, preto, [260, 740, tempo / 20 * 260, 50], 0)

Aqui, a velocidade gerada pela plataforma é controlada pelo land_frequency definido por você.

# 产生 下落 的 平台
if land_frequency% 50 == 0: 
    land1_pos = [random.randint (0, width-land_width), 0] 
    land1 = Land (land, land1_pos) 
    lands.add (land1) 

land_frequency + = 1 
if land_frequency> = 100: 
    land_frequency = 0

O julgamento é usado aqui para garantir que o código seja executado apenas uma vez. Impedir o controle estranho de jogadores posteriores.


    #Create characters 
if create_player: 
    create_player = False player_rect.left = land1.rect.left + 40 
    player_rect.top = land1.rect.top-55 
    player = Player (player_rect) #Create 
    caracteres iniciais 
    window.blit (player1, player. Rect )

Vamos armazenar o terreno gerado a cada vez em um grupo posteriormente, para que possamos desenhar continuamente aqui, usando a função Mover terreno.

E aqui para julgar se existe uma colisão entre o personagem e o terreno, e definir a classe Booleana no início de "jk_", que controlará o programa posteriormente.

E quando a plataforma estiver abaixo de uma certa altura, vamos eliminar essa parte do terreno do grupo.

para tmp_land em terras: #Desenhe a 
    plataforma de queda 
    window.blit (land, tmp_land.rect) 
    #
    下落 tmp_land.Move () 
    if pygame.sprite.collide_circle (tmp_land, player): 
        #score + = 100 
        jk_right = False 
        jk_left = False 
        jk_space = False 
        jk_begin = True 
        player.gravity = 4 
    #Remova 

    a plataforma na parte inferior se tmp_land.rect.y> = 650: 
        lands.remove (tmp_land)

Quando o atributo ao vivo do jogador é True, aceitamos o valor do teclado,

Se for um espaço, altere os atributos relevantes do jogador.

adicione 0,5 ao tempo, desenhe a barra de velocidade,

Quando o tempo chega a 20, o tempo não aumentará.

Se houver um clique com o botão esquerdo ou com o botão direito ao mesmo tempo, mudaremos a propriedade faceR do jogador para controlar a direção do movimento do eixo x do personagem.

# 人物 空格 移动
if player.live: 
    if jk_begin: 
        key_pressed = pygame.key.get_pressed () 
        if key_pressed [pygame.K_SPACE]: 
            jump.play () 
            jk_space = True 
            jk_left = False 
            jk_right = False 
            window.blit (player2, player .rect) 
            player.faceR = 0 
            player.gravity = 10 
            time + = 0.5 
            player.Move (time) 
        else: 
            jump.stop () 
            jk_begin = False 
            time = 0 
        se time> = 20: 
            jump.stop () 
            time = 20 
            max_time + = 1 
            if max_time> = 10: 
                jk_begin = False 
                time = 0 


if key_pressed [pygame.K_LEFT] e key_pressed [pygame.K_SPACE]: 
        jk_space = False 
        jk_left = True 
        jk_right = False 
        window.blit (player3, player.rect) 
        player.faceR = -1 
        player.Move (tempo) 
se key_pressed [pygame.K_RIGHT] e key_pressed [pygame.K_SPACE]: 
        jk_space = False 
        jk_left = False 
        jk_right = True 
        window.blit (player4, player.rect) 
        player.faceR = 1 
        jogador. Movimento (tempo)

Precisamos fazer algumas correções nos personagens para evitar que a imagem dos personagens ultrapasse os limites da imagem.


    #Corrija o caractere sobre a borda 
se player.rect.y <= -54: 
    player.rect.y = -54 
se player.rect.x <= 0: player.rect.x = 
    0 
    tempo = 0 jk_begin = Falso 
se jogador. rect.x> = 770: player.rect.x 
    = 770

Ao mesmo tempo, quando a retidão do personagem ultrapassar 750, a imagem game over será exibida. Além disso, o atributo ao vivo do jogador é FALSE para que não continue a aceitar os comandos de teclado do jogador.


    #Jogo over 
if player.rect.y > = 750: game_over_sound.play () 
    player.live = False 
    window.blit (game_over, (0, 0))

No final, atualizamos uniformemente o desenho do personagem e quando o jogador digita diferentes teclas, as diferentes ações do personagem (incluindo ficar de pé normalmente, agachar, olhar para a esquerda, olhar para a direita)

# 更新 人物, 判断 人物 动作
if (not jk_right) e (not jk_left) e (not jk_space): 
    window.blit (player1, player.rect) 
if jk_space: 
    window.blit (player2, player.rect) 
if jk_left: 
    window .blit (player3, player.rect) 
if jk_right: 
    window.blit (player4, player.rect) 
player.Drop () 

para evento em pygame.event.get (): 
    if event.type == pygame.QUIT: 
        running = False 
pygame.display.update ()

4. Conclusão
Esta é a primeira vez que usamos o pygame para desenvolver nossos próprios jogos .

Aqui, excluímos a operação de pressionar as teclas esquerda, direita e A, D na plataforma para controlar o movimento dos personagens, e usar apenas as teclas esquerda, direita e A, D para controlar a maneira como os personagens se movem.

Ao mesmo tempo, não criamos um grande número de terrenos para enriquecer a riqueza e a diversão do jogo, mas apenas usamos uma plataforma em descida constante em vez de um terreno fixo.

Existem também desvantagens que a estranha trajetória de movimento, o personagem pode penetrar na plataforma por baixo, e o personagem vai flutuar no ar (isso deve estar relacionado ao julgamento do pygame)

Se houver outro momento, espero corrigir essas deficiências.

Acho que você gosta

Origin blog.51cto.com/14621511/2679147
Recomendado
Clasificación