1#!/usr/bin/env python 2""" pg.examples.video 3 4Experimental! 5 6* dialog message boxes with messagebox. 7* multiple windows with Window 8* driver selection 9* Renderer, Texture, and Image classes 10* Drawing lines, rects, and such onto Renderers. 11""" 12import os 13import pygame as pg 14 15if pg.get_sdl_version()[0] < 2: 16 raise SystemExit( 17 "This example requires pygame 2 and SDL2. _sdl2 is experimental and will change." 18 ) 19from pygame._sdl2 import Window, Texture, Image, Renderer, get_drivers, messagebox 20 21data_dir = os.path.join(os.path.split(os.path.abspath(__file__))[0], "data") 22 23 24def load_img(file): 25 return pg.image.load(os.path.join(data_dir, file)) 26 27 28pg.display.init() 29pg.key.set_repeat(1000, 10) 30 31for driver in get_drivers(): 32 print(driver) 33 34import random 35 36answer = messagebox( 37 "I will open two windows! Continue?", 38 "Hello!", 39 info=True, 40 buttons=("Yes", "No", "Chance"), 41 return_button=0, 42 escape_button=1, 43) 44if answer == 1 or (answer == 2 and random.random() < 0.5): 45 import sys 46 47 sys.exit(0) 48 49win = Window("asdf", resizable=True) 50renderer = Renderer(win) 51tex = Texture.from_surface(renderer, load_img("alien1.gif")) 52 53running = True 54 55x, y = 250, 50 56clock = pg.time.Clock() 57 58backgrounds = [(255, 0, 0, 255), (0, 255, 0, 255), (0, 0, 255, 255)] 59bg_index = 0 60 61renderer.draw_color = backgrounds[bg_index] 62 63win2 = Window("2nd window", size=(256, 256), always_on_top=True) 64win2.opacity = 0.5 65win2.set_icon(load_img("bomb.gif")) 66renderer2 = Renderer(win2) 67tex2 = Texture.from_surface(renderer2, load_img("asprite.bmp")) 68renderer2.clear() 69tex2.draw() 70renderer2.present() 71del tex2 72 73full = 0 74 75tex = Image(tex) 76 77 78surf = pg.Surface((64, 64)) 79streamtex = Texture(renderer, (64, 64), streaming=True) 80tex_update_interval = 1000 81next_tex_update = pg.time.get_ticks() 82 83 84while running: 85 for event in pg.event.get(): 86 if event.type == pg.QUIT: 87 running = False 88 elif getattr(event, "window", None) == win2: 89 if ( 90 event.type == pg.KEYDOWN 91 and event.key == pg.K_ESCAPE 92 or event.type == pg.WINDOWCLOSE 93 ): 94 win2.destroy() 95 elif event.type == pg.KEYDOWN: 96 if event.key == pg.K_ESCAPE: 97 running = False 98 elif event.key == pg.K_LEFT: 99 x -= 5 100 elif event.key == pg.K_RIGHT: 101 x += 5 102 elif event.key == pg.K_DOWN: 103 y += 5 104 elif event.key == pg.K_UP: 105 y -= 5 106 elif event.key == pg.K_f: 107 if full == 0: 108 win.set_fullscreen(True) 109 full = 1 110 else: 111 win.set_windowed() 112 full = 0 113 elif event.key == pg.K_s: 114 readsurf = renderer.to_surface() 115 pg.image.save(readsurf, "test.png") 116 117 elif event.key == pg.K_SPACE: 118 bg_index = (bg_index + 1) % len(backgrounds) 119 renderer.draw_color = backgrounds[bg_index] 120 121 renderer.clear() 122 123 # update texture 124 curtime = pg.time.get_ticks() 125 if curtime >= next_tex_update: 126 for x_ in range(streamtex.width // 4): 127 for y_ in range(streamtex.height // 4): 128 newcol = ( 129 random.randint(0, 255), 130 random.randint(0, 255), 131 random.randint(0, 255), 132 255, 133 ) 134 area = (4 * x_, 4 * y_, 4, 4) 135 surf.fill(newcol, area) 136 streamtex.update(surf) 137 next_tex_update = curtime + tex_update_interval 138 streamtex.draw(dstrect=pg.Rect(64, 128, 64, 64)) 139 140 tex.draw(dstrect=(x, y)) 141 142 # TODO: should these be? 143 # - line instead of draw_line 144 # - point instead of draw_point 145 # - rect(rect, width=1)->draw 1 pixel, instead of draw_rect 146 # - rect(rect, width=0)->filled ? , instead of fill_rect 147 # 148 # TODO: should these work with pg.draw.line(renderer, ...) functions? 149 renderer.draw_color = (255, 255, 255, 255) 150 renderer.draw_line((0, 0), (64, 64)) 151 renderer.draw_line((64, 64), (128, 0)) 152 renderer.draw_point((72, 32)) 153 renderer.draw_rect(pg.Rect(0, 64, 64, 64)) 154 renderer.fill_rect(pg.Rect(0, 128, 64, 64)) 155 renderer.draw_color = backgrounds[bg_index] 156 157 renderer.present() 158 159 clock.tick(60) 160 win.title = str("FPS: {}".format(clock.get_fps())) 161 162pg.quit() 163