Skip to content

Instantly share code, notes, and snippets.

@sugarflower
Created July 3, 2019 11:37
Show Gist options
  • Save sugarflower/b8fae32c9527bf0116cfc089fd494fde to your computer and use it in GitHub Desktop.
Save sugarflower/b8fae32c9527bf0116cfc089fd494fde to your computer and use it in GitHub Desktop.

前ポスト2件を踏まえ、pygを改修

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

だいぶスッキリしたのではないだろうかー。

@sugarflower
Copy link
Author

_initDisplay()が二度呼ばれる構造とか、なんとなく気持ち悪いのだけれどタマヒヨ問題があって致し方がなく。
またスコープの関係もあってsetupとloopの間でデータを共有するにはglobal宣言とかが必要なので果たしてこれで本当に良いのか、という点なくもない。
色々難儀である。

@sugarflower
Copy link
Author

parentの取得。moduleなら良いというわけでもなかった。
むずかしい。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment