1
0
mirror of https://github.com/abakh/nbsdgames.git synced 2025-02-02 15:07:27 -05:00
nbsdgames/display/dpy_pygame.py.bak
2022-02-03 13:46:22 +03:30

207 lines
6.4 KiB
Python

################################################
## pygame-based implementation of xshm ##
################################################
import os
import pygame
from pygame.locals import *
from modes import KeyPressed, KeyReleased
class Display:
musthidemouse = 0
mousevisible = 1
def __init__(self, width, height, title, transparency='yes', fullscreen='no'):
self.use_transparency = not transparency.startswith('n')
self.use_fullscreen = fullscreen.startswith('y')
# Initialize pygame
pygame.init()
# Set the display mode
winstyle = HWSURFACE
if self.use_fullscreen:
winstyle |= FULLSCREEN
bestdepth = pygame.display.mode_ok((width, height), winstyle, 32)
self.screen = pygame.display.set_mode((width, height),
winstyle, bestdepth)
self.offscreen = pygame.Surface((width, height))
#decorate the game window
pygame.display.set_caption(title)
#pygame.mouse.set_visible(0)
self.tbcache = None, None
self.events_key = []
self.events_mouse = []
self.prevposition = None
EVENT_HANDLERS[KEYDOWN] = self.keydown_handler
EVENT_HANDLERS[KEYUP] = self.keyup_handler
EVENT_HANDLERS[MOUSEBUTTONDOWN] = self.mousebuttondown_handler
def keydown_handler(self, e):
if e.key == K_ESCAPE and self.use_fullscreen:
raise SystemExit # ESC to exit the game if full-screen
self.showmouse(not self.musthidemouse)
self.events_key.append((e.key, KeyPressed))
del self.events_key[:-16]
def keyup_handler(self, e):
self.events_key.append((e.key, KeyReleased))
del self.events_key[:-16]
def mousebuttondown_handler(self, e):
self.showmouse(1)
self.events_mouse.append(e.pos)
del self.events_mouse[:-8]
def pixmap(self, w, h, data, colorkey=-1):
img = pygame.image.fromstring(data, (w, h), "RGB")
if colorkey >= 0:
r = colorkey & 0xFF
g = (colorkey >> 8) & 0xFF
b = (colorkey >> 16) & 0xFF
img.set_colorkey([r, g, b])
return img # not optimized -- must use getopticon()
def getopticon(self, pixmap, rect, alpha=255):
if not self.use_transparency:
alpha = 255
img = pixmap.subsurface(rect)
colorkey = pixmap.get_colorkey()
if alpha == 255 and not colorkey:
return img.convert(self.offscreen)
else:
if colorkey:
img.set_colorkey(colorkey, RLEACCEL)
if alpha < 255:
img.set_alpha(alpha, RLEACCEL)
img = img.convert_alpha(self.offscreen)
img.set_alpha(255, RLEACCEL)
return img
## def vflipppm(self, img):
## w, h = img.get_size()
## colorkey = img.get_colorkey()
## data = pygame.image.tostring(img, "RGB", 1)
## flipimg = pygame.image.fromstring(data, (w, h), "RGB")
## flipimg.set_colorkey(colorkey, RLEACCEL)
## return flipimg, h
def getppm(self, rect):
bkgnd = pygame.Surface(rect[2:])
bkgnd.blit(self.offscreen, (0, 0), rect)
return bkgnd
def putppm(self, x, y, bitmap, rect=None):
if rect:
self.offscreen.blit(bitmap, (x, y), rect)
else:
self.offscreen.blit(bitmap, (x, y))
def flip(self):
self.screen.blit(self.offscreen, (0, 0))
pygame.display.flip()
events_dispatch()
def close(self):
self.showmouse(1)
pygame.display.quit()
def clear(self):
self.offscreen.fill([0,0,0,])
def events_poll(self):
while 1:
e = pygame.event.poll()
if e.type == NOEVENT:
break
elif e.type == KEYDOWN:
self.events_key.append((e.key, KeyPressed))
del self.events_key[:-16]
elif e.type == KEYUP:
self.events_key.append((e.key, KeyReleased))
del self.events_key[:-16]
elif e.type == MOUSEBUTTONDOWN:
self.events_mouse.append(e.pos)
del self.events_mouse[:-8]
elif e.type == ENDMUSICEVENT:
self.next_music()
elif e.type == QUIT:
raise SystemExit
def keyevents(self):
events_dispatch()
events = self.events_key
self.events_key = []
return events
def pointermotion(self):
position = pygame.mouse.get_pos()
if position != self.prevposition:
self.showmouse(1)
self.prevposition = position
return position
else:
return None
def mouseevents(self):
events_dispatch()
events = self.events_mouse
self.events_mouse = []
return events
def selectlist(self):
return []
def taskbar(self, (x, y, w, h)):
tbs, tbh = self.tbcache
if tbh != h:
tbs = pygame.Surface((32, h)).convert_alpha(self.offscreen)
alpha_f = 256.0 / h
for j in range(h):
tbs.fill((128, 128, 255, int(j*alpha_f)),
(0, j, 32, 1))
self.tbcache = tbs, h
for i in range(x, x+w, 32):
dw = x+w-i
if dw < 32:
self.offscreen.blit(tbs, (i, y), (0, 0, dw, h))
else:
self.offscreen.blit(tbs, (i, y))
def settaskbar(self, tb_visible):
self.showmouse(1)
self.musthidemouse = not tb_visible # and self.use_fullscreen
def showmouse(self, v):
if v != self.mousevisible:
self.mousevisible = v
pygame.mouse.set_visible(v)
def quit_handler(e):
raise SystemExit
EVENT_HANDLERS = {
QUIT: quit_handler,
}
def events_dispatch(handlers = EVENT_HANDLERS):
while 1:
e = pygame.event.poll()
if e.type == NOEVENT:
break
elif handlers.has_key(e.type):
handlers[e.type](e)
def htmloptionstext(nameval):
return '''
<%s> Full Screen (Esc key to exit)</input><%s><br>
<%s> Draw slightly transparent bubbles</input><%s><br>
''' % (nameval("checkbox", "fullscreen", "yes", default="no"),
nameval("hidden", "fullscreen", "no"),
nameval("checkbox", "transparency", "yes", default="yes"),
nameval("hidden", "transparency", "no"))