3
3

More than 3 years have passed since last update.

Pygameでクラス化してアプリケーションを作る

Last updated at Posted at 2019-12-25

pythonとは

システムソフトウェア(組み込み系ソフトウェア)でなければ大体何でもできる汎用性の高い言語。GUIのアプリケーションやAIなどがとても得意だといわれている。

クラス化とは

classという雛形を作りインスタンスというリアルな物を作る方法。C++,C#,Java,Pythonなどたくさんの言語で実装されており、見やすくアプリケーションなどを作ることができる。詳しくはオブジェクト指向を読んでください。

pygameとは

ビデオゲームを製作するために設計されたクロスプラットフォームのPythonモジュール集であり、Pythonでコンピュータグラフィクスと音声を扱うためのライブラリを含んでいる。pygameは、SDL ライブラリの上に構築されており、C言語のような低水準の機構を使わずにリアルタイムのコンピュータゲームを開発できるようにするための配慮がなされている。これは、計算量の多い関数(主にグラフィクス処理)のほとんどはゲームロジック自体から切り離せるという想定にもとづいており、それがPythonのような高水準言語をゲーム開発に使用することを可能にしている。詳しくはPYGAMEを読んでください。

サンプルスクリプト

skeleton.pyw
import pygame,main,apng,OpenGL as lse,OpenGL.GL as lily 
from pygame.locals import * 

class CVak:
    #アンダーバー*2でプライベート 
    #__RenderName = None
    #__Scene = None
    #__FULLNESS = (22222,)定数宣言(大文字タプル)アクセスはthis.__FULLNESS[0]

    #コンストラクタ(クラス初期化)
    def __init__(this):#thisの部分はselfやthisといわれるものが一般的
        #Render対象作成
        #exp/this(self).__RenderName = main.CvRender("Data\\name.png",posx,posy)
        #this.__Scene = CvScene()
        pass#何もしないCの様な無名関数は不要<-インタプリタが読み飛ばしてくれる。

    #初期化処理(毎回)
    def init(this):
        return

    #キーの入力時の更新処理
    def UpdDwKey(this,key):
        #if key == K_Up:
        return

    #キーの出力時の更新処理
    def UpdUpKey(this,key):
        return

    #マウス座標取得
    def MousePos(this,x,y):
        return

    #更新処理
    def Update(this):
        return

    #描画処理
    def Draw(this):
        #exp/this.__RenderName.Draw()
        return

    #音楽再生処理pygame.mixer系
    def Music(this):
        return

    #ゲームループ
    def GameLoop(this):
        if(False):#発動しない
            this.init()
        this.Update()
        #スクリーンに色出力
        main.Main.Drawwnd(main.Clist.Red.get())
        this.Draw()
        this.Music()
        pass

    #終了処理
    def finGame(this):
        return
main.pyw
import pygame ,sys,OpenGL as GL
from OpenGL.GL import *
from OpenGL.GLU import *
import skeleton as sk

class Main:
    #静的変数
    #__SCRFLG = ((pygame.OPENGL|pygame.DOUBLEBUF),)3Dが必要な時
    __SCRFLG = (0,)#2D
    __ScreenHeight:int = 810
    __ScreenWidth:int = 931
    __GameFPS:int = 60
    __GameName:str = "Vgame"
    pygame.init()
    __wnd = pygame.display.set_mode((__ScreenWidth,__ScreenHeight),__SCRFLG[0]) 
    pygame.display.set_caption(__GameName)
    pygame.time.Clock()
    __wnd.fill((0,0,255))
    __game = None

    def quit():
        Main.__game.finGame()
        pygame.quit()
        sys.exit(None)

    def Eventloop(event):
        if(event.type == pygame.QUIT):
            Main.quit()
        if(event.type == pygame.KEYDOWN):
            if(event.key == pygame.K_ESCAPE):
                Main.quit()
            else:
                Main.__game.UpdDwKey(event.key)
                return
        if(event.type == pygame.KEYUP):
            Main.__game.UpdUpKey(event.key)
        if(event.type == pygame.MOUSEMOTION):
            (x, y) = event.pos
            Main.__game.MousePos(x,y)
        else:
            return

    def GameMain():
        Main.__game = sk.CVak()
        while(True):
            for event in pygame.event.get():
                Main.Eventloop(event)
            Main.__game.GameLoop()
            pygame.display.update()
        return

    def Drawwnd(color):
        Main.__wnd.fill(color)

    def getWndGet():
        return Main.__wnd

#main関数
def main():
    Main.GameMain()

class CvRender:
    x:int
    y:int
    path:str
    surf:int

    def __init__(this,path,x,y):
        this.path = path
        this.x = x
        this.y = y
        this.surf = pygame.image.load(this.path).convert_alpha()

    def getSizeGet(this):
        return (-this.surf.get_width(),-this.surf.get_height())

    def Draw(this):
        Main.getWndGet().blit(this.surf,(this.x,this.y))

    def DrawMiddle(this):
        Main.getWndGet().blit(this.surf,(this.x-this.surf.get_width()/2
                                         ,this.y-this.surf.get_height()/2))

    def CutDraw(this,startx,starty,cutx,cuty):
        Main.getWndGet().blit(this.surf,(this.x,this.y),(startx,starty,cutx,cuty))

    def Rev(this,bx,by):
        this.surf = pygame.transform.flip(this.surf,bx,by)

    def Scale(this,sx,sy):
        this.surf = pygame.transform.scale(this.surf,(sx,sy))

    def Rot(this,angle):
        this.surf = pygame.transform.rotate(this.surf.convert(),angle)

class HitsFlg():

    #widthをposzに入れる
    def tri(pos1,pos2,h2):
        if(pos1.posx + pos1.posz <= pos2.posx 
           or pos1.posx >= pos2.posx + pos2.posz):
            return False
        elif(pos2.posy + h2 >= pos1.posy 
             or pos1.posy <= pos2.posy + h2):
            return False
        else:
            return True

    def yen(pos0,pos1):
        posx = pos1.x - pos0.x
        posy = pos1.y - pos0.y
        rad = pos1.z + pos0.z
        if(pow(posx,2) + pow(posy,2) 
           <= pow(rad,2)):
            return True
        else:
            return False
        pass

class CvPos():
    x:int
    y:int
    z:int
    def __init__(this,posx,posy,Btwn):
        this.x = posx
        this.y = posy
        this.z = Btwn

class Cv3DPos():
    pos:CvPos
    size:CvPos

    def __init__(this,posx:int,posy:int,posz:int,sizex = 0,sizey = 0):
        this.pos = (posx,posy,posz)
        this.size = (sizex,sizey,0)
        return 

    def location_in_view(this,adj_x, adj_y):
        """ 3D座標から2D上の座標算出 """
        x2 = int((this.pos.x + adj_x * this.pos.y) / (this.pos.z/10 + 1)) + 200 - int(this.size.x * 0.5 / (this.pos.z/10 + 1))
        y2 = int((this.pos.y + adj_y * this.pos.z) / (this.pos.z/10 + 1)) + 150 - int(this.size.y * 0.5 / (this.pos.z/10 + 1)) 
        return (x2, y2)

    def size_in_view(this):
        """ 3D座標から2D上のサイズ算出 """
        s_x2 = int(this.size.x / (this.pos.z/10 + 1))
        s_y2 = int(this.size.y / (this.pos.z/10 + 1))
        return (s_x2, s_y2)

#色定義
class CvCollor():
    __red:int
    __green:int
    __blue:int
    def __init__(this,r,g,b):
        this.__red = r
        this.__green = g
        this.__blue = b
    def get(this):
        return(this.__red,this.__green,this.__blue) 

#色リスト(自分で好きな色拡張してね)
class Clist():
    #色 = CvCollor(紅, 緑, 青)
    White = CvCollor(255, 255, 255)
    Black = CvCollor(0, 0, 0)
    Green = CvCollor(0, 255, 0)
    Blue = CvCollor(0, 0, 255)
    Red = CvCollor(255, 0, 0) 
    Yellow = CvCollor(255, 255, 0)
    Purple = CvCollor(255, 0, 255)
    Skyblue = CvCollor(0, 255, 255)
    Orange = CvCollor(255, 180, 105)
    Blown = CvCollor(165, 42, 42)
    Pink = CvCollor(255, 0, 165)
    Silver = CvCollor(192, 192, 192)
    Lime = CvCollor(50, 205, 50)
    Virid = CvCollor(0, 137, 107)
    Coblue = CvCollor(0, 71, 171)
    Dblown = CvCollor(81, 31, 9)
    Greeny = CvCollor(17, 69, 20)

class Cvmoveflg():
    up:bool
    down:bool
    left:bool
    right:bool
    def __init__(this,upflg,dwflg,ltflg,rtflg):
        this.up = upflg
        this.down = dwflg
        this.left = ltflg
        this.right = rtflg

class CvFont():
    font:int
    collor:CvCollor
    def __init__(this,name,size,collor):
        this.font = pygame.font.Font(name,size)
        this.collor = collor

    def UpdColor(this,collor):
        this.collor = collor

    def show(this,string,sd,x,y):
        Main.getWndGet().blit(this.font.render(string,sd,this.collor.get()),(x,y))

    def bcshow(this,string,sd,bc,x,y):
        Main.getWndGet().blit(this.font.render(string,sd,this.collor.get(),bc.get()),(x,y))

    def Font(this,collor):
        this.collor = collor

if __name__ == "__main__":
    main()


これを丸々コピペすると

x=931,y=810のタイトル"vgame"の赤い画面が出てくると思う。これから作成していくと楽に音楽付きのアプリケーションやゲームなんかも作れますよ。プログラム初心者はコピペすることをお勧めします。今からプログラムを始めてください。アプリケーションを作るスクリプトが出来上がれば次を読んでください。

アプリケーション化の手っ取り早い方法

cmd.exeを開き

[cmd.exeパス]>> cd [pipのパス]
[pipのパス]>> pip install pyinstaller

と打つ
pyinstallerなどが有名まず最初にpyinstaller.exeを目的のアプリケーションのパスにコピー
cmd.exeを開き

[cmd.exeパス]>> cd [目的のアプリケーションのパス(以下G)]

と打ち,

[G]>> pyinstaller [main.pywから名前を変えたもの].pyw [skeleton.pywから名前を変えたもの].pyw --onefile --noconsole (--exclude pandas --exclude numpy)

と打つ
そうすると[main.pywから名前を変えたもの].specができていると思うので、aのexcludesの項目に"pygame"を追加

a.datas += Tree("[Pythonのパス]/Lib/site-packages/pygame/", prefix= "pygame")
a.datas += Tree("[Pythonのパス]/lib/xml/", prefix= "xml")

__pycache__やbuildやdistのフォルダを消した後cmd.exeに戻り

[G]>> pyinstaller [main.pywから名前を変えたもの].spec [skeleton.pywから名前を変えたもの].spec

と打つと外部データを読み込んでいなければdist下のexeは起動が成功する。読み込んでいた場合、distの上に持っていくと成功する。

最後に

PyOpenGLを使ってみたい。それでもたくさん記事を書いてみたい。

3
3
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3