とりあえず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()
|