1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129
|
import math
import random
import moderngl_window
from moderngl_window.conf import settings
from moderngl_window.timers.clock import Timer
class CustomSetup:
"""
Custom setup using a class.
We create the window, main loop and register events.
"""
def __init__(self):
# Configure to use pyglet window
settings.WINDOW['class'] = 'moderngl_window.context.pyglet.Window'
self.wnd = moderngl_window.create_window_from_settings()
self.ctx = self.wnd.ctx
# register event methods
self.wnd.resize_func = self.resize
self.wnd.iconify_func = self.iconify
self.wnd.key_event_func = self.key_event
self.wnd.mouse_position_event_func = self.mouse_position_event
self.wnd.mouse_drag_event_func = self.mouse_drag_event
self.wnd.mouse_scroll_event_func = self.mouse_scroll_event
self.wnd.mouse_press_event_func = self.mouse_press_event
self.wnd.mouse_release_event_func = self.mouse_release_event
self.wnd.unicode_char_entered_func = self.unicode_char_entered
self.wnd.close_func = self.close
def render(self, time, frame_time):
self.ctx.clear(
(math.sin(time) + 1.0) / 2,
(math.sin(time + 2) + 1.0) / 2,
(math.sin(time + 3) + 1.0) / 2,
)
def run(self):
timer = Timer()
timer.start()
while not self.wnd.is_closing:
self.wnd.clear()
time, frame_time = timer.next_frame()
self.render(time, frame_time)
self.wnd.swap_buffers()
self.wnd.destroy()
def resize(self, width: int, height: int):
print("Window was resized. buffer size is {} x {}".format(width, height))
def iconify(self, iconify: bool):
"""Window hide/minimize and restore"""
print("Window was iconified:", iconify)
def key_event(self, key, action, modifiers):
keys = self.wnd.keys
# Key presses
if action == keys.ACTION_PRESS:
if key == keys.SPACE:
print("SPACE key was pressed")
# Using modifiers (shift and ctrl)
if key == keys.Z and modifiers.shift:
print("Shift + Z was pressed")
if key == keys.Z and modifiers.ctrl:
print("ctrl + Z was pressed")
# Key releases
elif action == self.wnd.keys.ACTION_RELEASE:
if key == keys.SPACE:
print("SPACE key was released")
# Move the window around with AWSD
if action == keys.ACTION_PRESS:
if key == keys.A:
self.wnd.position = self.wnd.position[0] - 10, self.wnd.position[1]
if key == keys.D:
self.wnd.position = self.wnd.position[0] + 10, self.wnd.position[1]
if key == keys.W:
self.wnd.position = self.wnd.position[0], self.wnd.position[1] - 10
if key == keys.S:
self.wnd.position = self.wnd.position[0], self.wnd.position[1] + 10
# toggle cursor
if key == keys.C:
self.wnd.cursor = not self.wnd.cursor
# Shuffle window tittle
if key == keys.T:
title = list(self.wnd.title)
random.shuffle(title)
self.wnd.title = ''.join(title)
# Toggle mouse exclusivity
if key == keys.M:
self.wnd.mouse_exclusivity = not self.wnd.mouse_exclusivity
def mouse_position_event(self, x, y, dx, dy):
print("Mouse position pos={} {} delta={} {}".format(x, y, dx, dy))
def mouse_drag_event(self, x, y, dx, dy):
print("Mouse drag pos={} {} delta={} {}".format(x, y, dx, dy))
def mouse_scroll_event(self, x_offset, y_offset):
print("mouse_scroll_event", x_offset, y_offset)
def mouse_press_event(self, x, y, button):
print("Mouse button {} pressed at {}, {}".format(button, x, y))
print("Mouse states:", self.wnd.mouse_states)
def mouse_release_event(self, x: int, y: int, button: int):
print("Mouse button {} released at {}, {}".format(button, x, y))
print("Mouse states:", self.wnd.mouse_states)
def unicode_char_entered(self, char):
print("unicode_char_entered:", char)
def close(self):
print("Window was closed")
if __name__ == '__main__':
app = CustomSetup()
app.run()
|