pyg.py
from pygame import *
from pygame.locals import *
import pygame.gfxdraw as gfx
import time, inspect, os
FLIP_H = 1
FLIP_V = 2
FLIP_BOTH = 3
_running = True
_keys = [False] * 512
_keyDownCnt = 0
_event = 0
_mouse = {"pos":[0,0], "button":[False]*3, "click":[False]*3 }
_size = {"real":[128,128],"disp":[256,256],"margin":[30,30]}
_screen = {"offset":[0,0]}
_waitTime = 0.016
_mode = HWSURFACE #| DOUBLEBUF
screen = None
surface = None
def setSize( real=None, disp=None, margin=None ):
if real != None:
_size["real"] = real
if disp != None:
_size["disp"] = disp
if margin != None:
_size["margin"] = margin
def dispMouseCursor(val):
mouse.set_visible(val)
def setTitle(val):
display.set_caption(val)
def setWaitTime(val=0.016):
global _waitTime
_waitTime = val
def isKeyDown(key):
return _keys[ord(key)]
def isKeySownCode(key):
return _keys[key]
def isAnyKeyDown():
return _keyDownCnt != 0
def getMousePos():
wa = _size["real"][0] / _size["disp"][0]
ha = _size["real"][1] / _size["disp"][1]
mx = _mouse["pos"][0] - _size["margin"][0]
my = _mouse["pos"][1] - _size["margin"][1]
return ( int(mx * wa), int(my * ha) )
def isClick(button=0):
return _mouse["click"][button]
def isPress(button=0):
return _mouse["button"][button]
def clear():
fill((0,0,0,0),surface)
fill((0,0,0),screen)
def fill( color=(0,0,0,0), surf=None ):
if surf == None:
surf = surface
surf.fill((color))
def loadImage(path):
return image.load(path).convert_alpha()
def createImage(size):
return Surface(size, _mode | SRCALPHA, 32)
def putImage(img, pos, rect=None, flip=None, rotate=None, surf=None, scale=None, center=False):
if surf == None:
surf = surface
if rect == None:
imgrect = ( img.get_width(), img.get_height())
else:
imgrect = (rect[2], rect[3])
surfTemp = Surface( imgrect, _mode | SRCALPHA, 32 )
surfTemp.blit(img,(0,0))
if flip != None:
if flip == FLIP_H:
surfTemp = transform.flip(surfTemp, True, False)
elif filp == FLIP_V:
surfTemp = transform.flip(surfTemp, False,True)
elif flip == FLIP_BOTH:
surfTemp = transform.flip(surfTemp, True,True)
if rotate != None:
rotate = (360 - rotate) % 360
st2 = transform.rotate(surfTemp, rotate)
w = surfTemp.get_width()
h = surfTemp.get_height()
dw = int((w - st2.get_width()))>>1
dh = int((h - st2.get_height()))>>1
else:
st2 = surfTemp
dw = surfTemp.get_width()
dh = surfTemp.get_height()
if scale != None:
sc = (int(st2.get_width()*scale[0]), int(st2.get_height()*scale[1]))
st3 = transform.scale(st2, sc)
else:
st3 = st2
if center:
surf.blit(st3,(pos[0]+dw-(w>>1), pos[1]+dh-(h>>1)))
else:
surf.blit(st3,(pos[0]+dw, pos[1]+dh))
def _init():
mixer.pre_init( 44100, -16, 2, 1024 )
mixer.init()
init()
os.environ["SDL_VIDEO_CENTERED"] = "1"
def _initDisplay():
global screen, surface
dispW = _size["disp"][0] + (_size["margin"][0] << 1)
dispH = _size["disp"][1] + (_size["margin"][1] << 1)
screen = display.set_mode( (dispW, dispH), _mode)
surface = Surface(_size["real"], _mode | SRCALPHA, 32 )
dispMouseCursor(False)
def _update():
us = Surface(_size["real"], _mode | SRCALPHA, 32)
us.blit(surface, _screen["offset"] )
screen.blit(transform.scale(us, _size["disp"]) , _size["margin"])
display.update()
def _process():
global _running, _mouse, _keys, _keyDownCnt
st = time.time()
_procWait = True
_mouse["click"] = [False] * 3
while _procWait:
time.sleep(0.001)
for e in event.get():
_event = e
_key = -1
if e.type == QUIT:
_running = False
if e.type == KEYDOWN:
_key = e.key
if _key < 512:
if _keys[_key] == False:
_keyDownCnt += 1
_keys[_key] = True
if e.type == KEYUP:
_key = e.key
if _key < 512:
if _keys[_key]:
_keyDownCnt -= 1
_keys[_key] = False
if e.type == MOUSEMOTION:
_mouse["pos"] = (e.pos[0], e.pos[1])
if e.type == MOUSEBUTTONDOWN:
_mouse["button"] = mouse.get_pressed()
if e.type == MOUSEBUTTONUP:
for i in range(3):
if _mouse["button"][i]:
_mouse["click"][i] = True
_mouse["button"] = [False] * 3
if time.time() - st > _waitTime:
_update()
_procWait = False
def run():
s = inspect.stack()
p = inspect.getmodule( s[ len(s)-1 ][0] )
d = set(dir(p))
if len(d & {"setup"} ) == 1:
_initDisplay()
p.setup()
if len(d & {"loop"} ) == 1:
while _running:
p.loop()
_process()
quit()
_init()
_initDisplay()
一気に書いたので動作チェックは甘い。
これを使って読み込んだ画像を描画するものを作る。
test.py
from pyg import *
img = loadImage("res/pic.png")
def setup():
setTitle("PYG2 Test")
setSize((64,64),(256,256))
def loop():
clear()
putImage(img,(0,0))
run()
だいぶスッキリしたのではないだろうかー。
_initDisplay()が二度呼ばれる構造とか、なんとなく気持ち悪いのだけれどタマヒヨ問題があって致し方がなく。
またスコープの関係もあってsetupとloopの間でデータを共有するにはglobal宣言とかが必要なので果たしてこれで本当に良いのか、という点なくもない。
色々難儀である。