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()