pygameを利用したGame用クラスの検討

pygameを利用したGame用クラスの検討

gameobj.py

import sys
import math
import pygame # http://westplain.sakuraweb.com/translate/pygame
from pygame import QUIT, KEYDOWN, KEYUP, MOUSEBUTTONDOWN, MOUSEBUTTONUP ,MOUSEMOTION, \
    K_LEFT, K_RIGHT, K_UP, K_DOWN, K_SPACE, K_w, K_a, K_d, K_s


class GameObj:
    map = {} # 全てのGameObjを名前で管理する辞書
    def __init__(self, name,path="",x=0,y=0,z=0,angle=0,active=True):#コンストラクタ
        self.name=name
        self.x=float(x) # 座標設定
        self.y=float(y)
        self.z=float(z)
        self.path=path # 画像のパス設定
        self.image=pygame.image.load(path)# イメージオブジェクト設定
        GameObj.map[name] = self
        self.angle = angle
        self.active = active
    #
    def __str__(self): # 確認表示文字列の取得
        s="name:{:8},x={:10.5f},y={:10.5f}"
        return s.format(self.name, self.x,self.y)
    #
    def getImage(self): # 描画に使うイメージを取得  
        image2 = pygame.transform.rotate(self.image, self.angle)
        center = self.image.get_rect(topleft = (self.x, self.y)).center
        rect = image2.get_rect(center = center)
        return image2, rect
    #
    def changeSize( self, size ):
        self.scalse=(size[0],size[1]) # インスタンス変数scalseを作っている
        img = pygame.transform.scale(self.image,self.scalse)
        self.image = img
    #
    def Update(self):
        pass
    #
    def goforward(self, step):
        rad= math.radians(self.angle)
        self.dx = step * math.cos(rad)
        self.dy = -step * math.sin(rad)
    #
    @classmethod
    def distance(cls, a, b):
        center_a = a.image.get_rect(topleft=(a.x, a.y)).center
        center_b = a.image.get_rect(topleft=(b.x, b.y)).center
        x = center_a[0]-center_b[0]
        y = center_a[1]-center_b[1]
        return math.sqrt( x*x + y*y)


pygame.init() # pygameモジュールの初期化


SURFACE = pygame.display.set_mode((800,800)) # このサイズの描画面空間作成


FPSCLOCK = pygame.time.Clock()# 時間管理のオブジェクト取得


pressed_key_set = set() # 押されているキーコードを記憶する集合


manipulate=lambda keys: keys # 引数を返すだけのダミーの関数を登録


mouselist =[] #  マウスボタンを押した位置を記憶させる


loop_flag=True # これをFalseすると、main_loopが終了


def main_loop():
    while loop_flag:
        # イベント取得処理部
        for event in pygame.event.get():
            if event.type == QUIT: # 閉じるイベント?
                pygame.quit()
                return #sys.exit() # プログラム終了
            elif event.type == KEYDOWN:
                pressed_key_set.add(event.key) # 押されたキーを記憶
            elif event.type == KEYUP:
                pressed_key_set.remove(event.key) # 放したキー情報を除く
            elif event.type == MOUSEBUTTONDOWN:#
                mouselist.append(event.pos)#
        #
        # オペレータの操作処理部
        #print( manipulate( pressed_key_set )) # 実験
        manipulate( pressed_key_set )


        # キャラクタのAI動作処理部
        lst = GameObj.map.keys()
        for k in lst:
            if not GameObj.map[k].active : continue
            GameObj.map[k].Update()


        # 描画処理処理部
        lst = list(GameObj.map.values())
        lst = sorted(lst, key=lambda x: x.z, reverse=True)
        for obj in lst:# 辞書内のキャラクタを描画する。
            if not obj.active : continue
            img,rect = obj.getImage() # イメージとその描画区画を取得
            SURFACE.blit(img,rect) # 描画
        #
        if len(mouselist)>1: pygame.draw.lines(SURFACE,(255,0,0),
            False,mouselist, width=5)


        pygame.display.update() # 画面更新
        FPSCLOCK.tick(20) # 1秒間のフレーム数を指定


    print("終了")


if __name__=='__main__':
    back0=GameObj("BACK0", "back00.gif")
    tank0=GameObj("TANK0", "tank0.gif",100,50)
    back0.changeSize((500,500))
    main_loop()