パーソナルブログメモリ

a = [1, 1]
for _ in "*" * 999: a += [sum(a[-2:])]
print(a)

pythonゲームコーディング16時間目 シューテングゲームの基盤

2017-09-01 | pygame
2時間ぐらいかけて作ってます。
まだキャラクターを色変えて表示ぐらいです。
ここから延々とキャラクターのAIと当たり判定などを作っていかないとシューティングにはなりません。

あと色を表示させる直前にピクセル単位で書き換えしているので遅いです。

今回つくるにあたってubuntuのテキストエディタで着手してしまって、tabとspaceの罠にはまって
IndentationError: expected an indented block
に15分以上悩まされ、atom使って修正してました。

あとpythonのandはビット演算してくれないので、&を使うようです。

field03.mp3はどこかからダウンロードしたものなので、手持ちの適当なmp3に変えてください。

作成時、2018年のワールドカップ予選をやっていたので主にテレビを見ながら
合間に作ってました。日本vsオーストラリア
ケーヒルってまだ代表なんだ。ちょっと驚きました。
スーケルとかケーヒルとか語呂的に日本サッカーの天敵感があります。

bg.png


#!/usr/bin/python
# -*- coding: utf-8 -*-
import pygame
from pygame.locals import *
import random
import numpy as np

pygame.init()
window_size = (640, 480)
clock = pygame.time.Clock()
screen = pygame.display.set_mode(window_size)
img_char = pygame.image.load('bg.png')

spimg = []

sx = 100
sy = 100

cmx = 100
ex = np.array([0 for i in range(cmx)])
ey = np.array([0 for i in range(cmx)])
et = np.array([0 for i in range(cmx)])
edx = np.array([0 for i in range(cmx)])
edy = np.array([0 for i in range(cmx)])
elv = np.array([0 for i in range(cmx)])

emx = np.array([0 for i in range(cmx)])
emy = np.array([0 for i in range(cmx)])
empw = np.array([0 for i in range(cmx)])
emdx = np.array([0 for i in range(cmx)])
emdy = np.array([0 for i in range(cmx)])
emlv = np.array([0 for i in range(cmx)])

mx = np.array([0 for i in range(cmx)])
my = np.array([0 for i in range(cmx)])
mpw = np.array([0 for i in range(cmx)])
mdx = np.array([0 for i in range(cmx)])
mdy = np.array([0 for i in range(cmx)])
mlv = np.array([0 for i in range(cmx)])

def rnd(n):
    return random.randrange(0, n)

def eset(n, t, x, y, dx, dy):
    et[n] = t
    ex[n] = x
    ey[n] = y
    edx[n] = dx
    edy[n] = dy
    elv[n] = 1

def emset(n, pw, x, y, dx, dy):
    empw[n] = pw
    emx[n] = x
    emy[n] = y
    emdx[n] = dx
    emdy[n] = dy
    emlv[n] = 1

def mset(n, pw, x, y, dx, dy):
    mpw[n] = pw
    mx[n] = x
    my[n] = y
    mdx[n] = dx
    mdy[n] = dy
    mlv[n] = 1

def randset():
    for n in range(cmx):
        if elv[n] == 0:
            eset(n, 1, rnd(640), rnd(480), rnd(5) - 2, rnd(5) - 2)
    for n in range(cmx):
        if emlv[n] == 0:
            emset(n, 1, rnd(640), rnd(480), rnd(5) - 2, rnd(5) - 2)
    for n in range(cmx):
        if mlv[n] == 0:
            mset(n, 1, rnd(640), rnd(480), rnd(5) - 2, rnd(5) - 2)

def write():
    bg_color = (0, 0, 0)
    screen.fill(bg_color)
    for n in range(cmx):
        if elv[n] > 0:
            spwrite2(21, ex[n], ey[n], 0, 2)
    for n in range(cmx):
        if emlv[n] > 0:
            spwrite2(22, emx[n], emy[n], 0, 2)
    for n in range(cmx):
        if mlv[n] > 0:
            spwrite2(22, mx[n], my[n], 0, 2)
    spwrite(20, sx, sy, 0, 2)
    pygame.display.flip()

def move():
    for n in range(cmx):
        if elv[n] > 0:
            ex[n] += edx[n]
            ey[n] += edy[n]
    for n in range(cmx):
        if emlv[n] > 0:
            emx[n] += emdx[n]
            emy[n] += emdy[n]
    for n in range(cmx):
       if mlv[n]>0:
           mx[n] += mdx[n]
           my[n] += mdy[n]

def spset():
    for y in range(10):
        for x in range(10):
            temp = pygame.Surface((16, 16), pygame.SRCALPHA)
            temp.blit(img_char, (0, 0), (x * 16, y * 16, 16, 16))
            spimg.append(temp)

def spwrite(cn, x, y, angle, scale):
    temp = pygame.transform.rotozoom(spimg[cn], angle, scale)
    screen.blit(temp, (x, y))

def spwrite2(cn, x, y, angle, scale):
    temp = pygame.transform.rotozoom(spcolor(spimg[cn],rnd(255),rnd(200),rnd(30)), angle, scale)
    screen.blit(temp, (x, y))

def spcolor(img,r,g,b):
    temp = pygame.Surface((16, 16), pygame.SRCALPHA)
    for x in range(16):
        for y in range(16):
            c=img.get_at((x,y))
            c.r=c.r & r
            c.g=c.g & g
            c.b=c.b & b
            temp.set_at((x,y),(c.r,c.g,c.b,c.a))
    return temp

def main():
    global sx
    global sy
    spset()
    randset()
    pygame.key.set_repeat (1, 1)
    pygame.mixer.music.load('field03.mp3')
    pygame.mixer.music.play(-1)
    end_game = False
    while not end_game:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                end_game = True
            if event.type == KEYDOWN:
                if event.key == K_LEFT:
                    if sx>0:
                        sx -= 5
                if event.key == K_RIGHT:
                    if sx<640-16:
                        sx += 5
                if event.key == K_UP:
                    if sy>0:
                        sy -= 5
                if event.key == K_DOWN:
                    if sy<480-16:
                        sy += 5
        move()
        write()
    pygame.quit()
    quit()

main()



のんびり動きます。

最新の画像もっと見る

コメントを投稿

ブログ作成者から承認されるまでコメントは反映されません。