第2回 ゼロ戦登場
とりあえずUFOを滑らかに動かすことができました。次に何をするか?たぶんUFOとの戦闘にするのがゲーム作成の流れか? UFOと対決するのは何?F35などの戦闘機?なんか当たり前すぎる。そうだ日本にはかつて、
ゼロ戦
とい名機があった。これを使おう。画像の用意をしなければならない。面倒!幸いなことゼロ戦はだいたい直線を使って作れるのでInkscapeで作成したのがコレ。

案外簡単にできました。そしてゼロ戦をゲームに加えると、

まだ、戦闘の処理はありません。左右の矢印キーでゼロ戦を動かせるだけです。ゼロ戦でどんな攻撃をするのか? 案外難しいです。
ソースです。すでに別の記事で紹介した処理を使っているので、特に解説するようなところはないです。

import pygame
import pygame.sprite
import sys

SCREEN = pygame.Rect(0, 0, 640, 480) 

class ufo(pygame.sprite.Sprite):
    def __init__(self, x,y, vx, vy, angle=0):
        pygame.sprite.Sprite.__init__(self)
        self.vx = vx
        self.vy = vy
        self.angle = angle
        self.image = pygame.image.load('ufo.png').convert_alpha()
        if angle != 0: 
            self.image = pygame.transform.rotate(self.image, angle)
        w = self.image.get_width()
        h = self.image.get_height()
        self.rect = pygame.Rect(x, y, w, h)
        self.attacked = False

    def update(self):
        self.rect.move_ip(self.vx, self.vy)
        self.rect = self.rect.clamp(SCREEN)

  

def main():
    pygame.init()
    pygame.display.set_caption("Pygame インベーダー ゼロ戦登場")
    screen = pygame.display.set_mode(SCREEN.size)
    img_jet = pygame.image.load('zerosen.png')
    clock = pygame.time.Clock()
   #スプライトグループの作成
    group = pygame.sprite.RenderUpdates()
    # スプライトの追加
    #横8列、縦4行
    x = 16
    y = 16
    x_jet = 0
    y_jet = SCREEN.height - img_jet.get_height()
    ufos = []
    for i in range(4):
        for j in range(8):
            ufo1= ufo(x,y, 2, 0, 0)
            group.add(ufo1) 
            x += 64
            ufos.append(ufo1)
        y +=50
        x = 16
    # ufos[0].remove(group) #この方法で削除できる
    ufos[0]
    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                # 終了ボタンで終了
                pygame.quit()
                sys.exit()
       #キーの取得
        key = pygame.key.get_pressed()
        if key[pygame.K_LEFT] == True:
            x_jet -= 4
        elif key[pygame.K_RIGHT] == True:
            x_jet += 4
        if x_jet >= SCREEN.right - img_jet.get_width():
            x_jet = SCREEN.right - img_jet.get_width()
        elif x_jet < SCREEN.left:
             x_jet = SCREEN.left
            


        screen.fill((128, 128, 255)) # 画面の背景色
        # スプライトグループを更新
        # size = len(group)
        dir = 0
        for u  in group:
            if u.vx  + u.rect.right >= SCREEN.width:
                dir = 1
                break
            elif u.rect.left + u.vx < SCREEN.left:
                dir = -1
                break
        for u  in group:
            if dir == 1:
                u.vx = -abs(u.vx)
            elif  dir == -1:
                u.vx = abs(u.vx)

        group.update()
        # スプライトを描画
        group.draw(screen)
        screen.blit(img_jet, [x_jet,y_jet])

        pygame.display.update()
        clock.tick(30)

if __name__ == '__main__':
    main()