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