パーソナルブログメモリ

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

俺は一日でどこまでF-ZEROに近づけるか?

2018-11-04 | pygame
文化の日ということでなにか作ってみることにする。


(最終的にできたものです。)
補足説明
適当なpng画像をmg.pngリネームしてみてください。jpegだと透明設定がないので修正が必要です)
ubuntu18.04のnotoフォントを使っています。56行目(56,130,131をコメントアウトでなくても動きます。)
元々は100行ぐらいですが。コメントの追加と少し形を整えています。

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
import sys
import math
import time
import pygame
from pygame.locals import *
from PIL import Image

def inCk(n, s, e):
    return e >= n >= s

class Plate:
    def __init__(sf, x, y, z, col, size):
        sf.x, sf.y, sf.z = x, y, z    #プレートの隅の座標
        sf.col  = col                 #色
        sf.size = size                #サイズ
        sf.zb   = 0                   #表示順のソート用
        sf.polyList = []              #ポリゴンの表示座標
    def on(sf, x, y, z):
        #乗れているか、位置によっては機体の高さも変動
        if 400 > abs(sf.y - y):
            if inCk(x, sf.x, sf.x+sf.size*1.1) and inCk(z, sf.z, sf.z+sf.size*1.1):
                return sf.y
        return -10000
    def calc(sf, sx, sy, sz, d1, d2):
        #プレートの表示位置を計算
        #視点による回転等もt1は平面座標回転t2は上下回転(今回未使用)
        #4点の設定とシフト
        x=[sf.x-sx,     sf.x-sx+sf.size,    sf.x-sx+sf.size,    sf.x-sx]
        ty=[sf.y-sy,    sf.y-sy,            sf.y-sy,            sf.y-sy]
        z=[sf.z-sz,     sf.z-sz,            sf.z-sz+sf.size,    sf.z-sz+sf.size]
        #4点の回転
        tx = [0,0,0,0]
        tz = [0,0,0,0]
        c = math.cos(d1 * 3.14 / 180)
        s = math.sin(d1 * 3.14 / 180)
        for i in range(4):
            tx[i] = x[i]*c - z[i]*s
            tz[i] = x[i]*s + z[i]*c
        sf.zb = (tz[0] + tz[2]) / 2
        if 300 > sf.zb:return
        #表示用に3変換
        sf.polyList=[]
        d=300
        for i in range(4):
            sf.polyList += [( int(tx[i] * d/tz[i] + 400), int(ty[i] * d/tz[i] + 300) )]
    def write(sf):
        if 300 > sf.zb:return
        pygame.draw.polygon(screen, sf.col, sf.polyList)

#pygameの初期化
pygame.init()
pygame.display.set_caption("TARGET F")
SCREEN_SIZE = (800, 600)
screen = pygame.display.set_mode(SCREEN_SIZE)

font = pygame.font.SysFont("notosansmonocjkjp", 16)

#プレートの色用
imgbase = Image.open("./mg.png")
img     = imgbase.resize((100,100))

#表示プレートの初期設定1万枚
plate=[]
size = 400
for x in range(100):
    for z in range(100):
        r, g, b, a = img.getpixel( (x,z) )
        plate += [Plate(x*size-size*50, math.sin(x/5)*500+math.sin(z/5)*500, z*size-size*50, (r, g, b), size)]

#メイン処理
def main():
    global plate
    lasttime = 0
    cx, cy, cz = 0, 0, -500   #車の座標(表示ないけど)
    t1  = 0                   #車の向いている方向
    cdy = 0                   #落下時の加速度用
    sp  = 0                   #速度
    dt  = 0                   #車の回転用角度
    dsp = 0                   #車の速度増加
    a   = 0                   #加速度
    while True:
        startime = time.perf_counter()

        #キー操作
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.mixer.music.stop()
                sys.exit()
            if event.type == KEYDOWN:
                if event.key == K_LEFT: dt   =-15
                if event.key == K_RIGHT:dt   = 15
                if event.key == K_DOWN: dsp -= 15
                if event.key == K_UP:   dsp += 15
            if event.type == KEYUP:
                dt = 0
                dsp = 0

        #移動
        a += dsp
        t1 += dt
        sp += a
        sp = sp * 0.9
        dsp = dsp * 0.95
        a = a * 0.9
        sp = max( 0, min(sp, 2000) )
        cx += math.sin(t1 * 3.14 / 180) * sp
        cz += math.cos(t1 * 3.14 / 180) * sp
        #pygame.time.wait(100)

        #プレートの表示用変換
        oy = -10000
        for i in plate:
            o = i.on(cx, cy, cz)
            if o > oy: oy = o
        if oy == -10000:
            cy += cdy
            cdy += 10
        else:
            cy = oy - 100
        for i in plate:
            i.calc(0+cx, -800+cy, -5000+cz, t1, 0)

        #プレートの前後によりソート
        plate = sorted(plate, key=lambda x:x.zb, reverse = True)

        #画面表示
        screen.fill((0, 20, 0))
        for i in plate:
            i.write()
        text = font.render("SPEED:"+str(int(sp))+" "+str(int(a)) + " time:"+str(lasttime) + " on:"+str(int(oy))+" "+str(int(cy)), True, (255,255,255))
        screen.blit(text, [50, 50])
        pygame.display.flip()

        lasttime = int( (time.perf_counter() - startime) * 1000)

main()

syntax2html




ーーーーーーーーーーー以下  構想というなの駄文ーーーーーーーーーーー

そもそも自分のことを俺とはほとんど言わないけどたまには勢いをつけないとということであえて俺としました。

以下はメモ書きより

11/3 12:05

俺は一日でどこまでF-ZEROに近づけるか?

初めて友達の家でスーパーファミコンを遊んだ時、俺は衝撃を受けた
F-ZEROそしてパイロットウィングスに、ほどなくしてスーパーファミコンを購入した。

入社試験と面接を受けに任天堂にもいった。残念ながら入社はしていない。
(しかし、残念ながらの報は受け取っていない。受かっていたのかもしれない(勝手な解釈です))

そしてCSKという当時SEGAの親会社に入った。AI事業部を希望したけど残念ながら違う場所へ。
(AI事業部は時代を先取りしすぎていて、すぐなくなりました。)

ということで一日でどこまでF-ZEROに挑戦できるかやってみる。


まずは構想から、
私はだいたい構想の半分ぐらいで力尽きる。
まあここまでやったという満足と破綻しかけているソースに対する疲れその両方だろう。
ということで構想をねってみる。

タイトル 正直どうでもいい
セレクト画面 正直どうでもいい
ゲームメイン
 今回はマウスで操作を検討してみる。
 3D画面の表現はポリゴンでいけるか?
 音楽なにか作ってみよう。
 敵車、できれば…
コースエディタ
 作れたらいいな
リザルト画面 いいことにする。

12:14

13:52 F-ZEROを見直していてすごすぎて萎える

まずPlateクラスから作ろう

16:33 安堂ロイドをみている。画像を緑に加工している
ーーーーーー追記↓ーーーーーーー
ドラマの中に東京タワーのナノブロックがでてきたのでダイソー100円のプチブロックで作ってみる
ブロックの高さがナノブロックより少し低いようなので数段足してます。
使ったのはパンダと消防車とプロペラ機の尾翼の一部(赤は少し足りない)


最近作ったプチブロックに、お話をつけているのでお話

2040年日本は再び都市開発を行っている。
新しい発想のアクチュエータが開発され超巨大な破壊専用の重機なども作られていた。
都会の空を少しでも取り戻すため、次々と老朽化している高層建築の中層建築への建て替え需要によって景気は回復基調である。
かつて東京のシンボルであった東京タワーもとうとう解体することになった。解体工事は3日の予定である。
ーーーーーー追記↑ーーーーーーー

19:30 スペースタンディをみている。まみたすとかループとか

19:58 散髪してシャワー浴びてスッキリ
コードは40ステップほど

22:39 よしこれで、ポリゴンが...これなに??


23:59 こんな感じに(真横からならんだポリゴンをみるとこれで正解だったりする)


2:07 マウスはどうにもうまくいかないのでキースキャンにしてそこそこの速度に

11:05 再開、プレートに乗っているか判定して上下に動くようにする

11:49 そこそこ調整終わる

結果
ゲームメイン
 今回はマウスで操作を検討してみる。→調整が難航してキーに
 3D画面の表現はポリゴンでいけるか?→いけるのではないか
 音楽なにか作ってみよう。→時間不足
 敵車、できれば…→時間不足
コースエディタ
 作れたらいいな→時間不足



最新の画像もっと見る

コメントを投稿

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