プログラミング言語「Python」で制作 Part85 | Photoshop CC Tutorials

今回はプログラミング言語の「Python」を使って作成しました。

 

全方位弾と追尾弾が2秒ごとに同時に発射するように下記の本のサンプルを改造してみました。

 

■ プログラム

from game import *
from crash import *
import math
import random
import time
import datetime
import re

image_player = image('player_spaceship.png')
image_enemy = image('enemy_spaceship.png')
image_bullet = image('bullet.png')

SW, SH = 1, 9/16

def player(p):
    v = 0.01
    if key(LEFT):
        p.x -= v
    if key(RIGHT):
        p.x += v
    if key(UP):
        p.y += v
    if key(DOWN):
        p.y -= v
    p.x = max(-SW+p.sx, min(SW-p.sx, p.x))
    p.y = max(-SH+p.sy, min(SH-p.sy, p.y))
    for b in group(bullet):
        d = math.dist((p.x, p.y), (b.x, b.y))
        if d < p.sx*0.5:
            #---------------------------------------------------------
            # new_crashへ
            #---------------------------------------------------------
            new_crash(p.x, p.y, 0.01, 20, 0.98)
            p.life = 0

def bullet(b):
    b.x += b.vx
    b.y += b.vy
    b.r += 0.01
    if abs(b.x) > SW+b.sx or abs(b.y) > SH+b.sy:
        b.life = 0

def new_dir(x, y, v, dir):
    rad = dir*math.pi*2
    vx = math.cos(rad)*v
    vy = math.sin(rad)*v
    #---------------------------------------------------------
    # ④弾生成
    #---------------------------------------------------------
    add(bullet, image_bullet, 0.03, x, y, vx, vy)

def new_nway(x, y, v, dir, n, angle):
    if n > 1:
        for i in range(n):
            #---------------------------------------------------------
            # ③new_dirへ
            #---------------------------------------------------------
            new_dir(x, y, v, dir+angle/(n-1)*(i-(n-1)/2))

def new_circle(x, y, v, dir, n):
    rad = dir*math.pi*2
    vx = math.cos(rad)*v
    vy = math.sin(rad)*v
    add(bullet, image_bullet, 0.03, x, y, vx, vy)
    #---------------------------------------------------------
    # ②new_nwayへ
    #---------------------------------------------------------
    new_nway(x, y, v, dir, n, 1-1/n)

bulletFlag = False
cnt = 0
def enemy(e):
    global bulletFlag, cnt

    now = datetime.datetime.now()
    text = str(int(time.mktime(now.timetuple()) * 1000) + int(now.microsecond / 1000))
    t = re.findall("\d{4}",text[-4:])
    t = int(t[0])
    t //= 1000
    
    cnt += 1
    #print('カウントは{0}'.format(cnt))

    #if random.random() < 0.05:
    if t% 1 == 0 and bulletFlag == False:
        cnt = 0
        bulletFlag = True
        #---------------------------------------------------------
        # ①new_circleへ
        #---------------------------------------------------------
        new_circle(e.x, e.y, 0.01, random.random(), 20)
    elif cnt > 60:
        bulletFlag = False

def start():
    add(player, image_player, 0.08, -0.9, 0)
    add(enemy, image_enemy, 0.08, 0, 0)

run(start, 640, 360)

 

■ 参考書

「Pythonでつくる ゲームプログラミング入門」

 

■ ゲーム用ライブラリ

「pyglet」

 

■ プログラミング言語

「Python」