My Pygame Game Engine
1## Imports
2
3import pygame, pyautogui
4from src.scripts.modules.gui import *
5import webbrowser
6
7## Class for making you unable to register a non screen
8
9class Screen:
10 pass
11
12## A Camera that pans around and moves object that has the Camera_Relative_Component component
13
14class Camera:
15 def __init__(self) -> None:
16 self.x = 0
17 self.y = 0
18
19## Main Renderer Handler
20
21class renderer:
22
23 ## Functions
24
25 # Getter for screen size to Vector2 Tuple
26
27 def get_screen_size(self):
28 return (self.screen.get_width(), self.screen.get_height())
29
30 # Initializes a screen to be able to be used in renderer
31
32 def load_screen(self, screen: Screen, screen_id):
33 screen_add = screen
34 self.screens[screen_id] = screen_add
35
36 # Switches to a initialized screen
37
38 def switch_screen(self, screen_id):
39 self.current_screen = screen_id
40
41 ## Initialize
42
43 def __init__(self, game):
44
45 self.game = game
46
47 ## Initialize camera for renderer
48
49 self.camera = Camera()
50
51 ## Create variables
52
53 self.screens = {}
54 self.current_screen = ''
55
56 ## Sizes
57
58 self.original_size = (1280, 720)
59
60 ## Start Surfaces
61
62 self.screen_rect = gui_rect(game)
63 self.screen_rect.set_x_constraint(center_constraint())
64 self.screen_rect.set_y_constraint(center_constraint())
65 self.screen_rect.set_width_constraint(percentage_constraint(1))
66 self.screen_rect.set_height_constraint(percentage_constraint(1))
67 self.screen_rect.visible = False
68 #self.screen = pygame.display.set_mode((1280, 720), pygame.RESIZABLE)
69 self.screen = pygame.display.set_mode((1280, 720))
70 self.main_surface = pygame.Surface((self.screen.get_width(), self.screen.get_height()), pygame.SRCALPHA)
71
72 ## Load Fallback Screen
73
74 self.load_screen(fallback_screen(game), 'fallback')
75
76 ## Update Method
77
78 def update(self):
79
80 # Update Screen Rect
81
82 self.screen_rect.update()
83 self.screen_rect.x = 0
84 self.screen_rect.y = 0
85 self.screen_rect.width = self.get_screen_size()[0]
86 self.screen_rect.height = self.get_screen_size()[1]
87
88 # Clear main surface for drawing
89
90 self.main_surface = pygame.Surface((self.screen.get_width(), self.screen.get_height()), pygame.SRCALPHA)
91
92 # Update the currently selected screen or fallback if screen is invalid
93
94 if self.current_screen in self.screens:
95 self.screens[self.current_screen].update()
96 else:
97 self.screens['fallback'].update()
98
99
100 ## Render Method
101
102 def render(self):
103
104 # Render the currently selected screen or fallback if screen is invalid
105
106 if self.current_screen in self.screens:
107 self.screens[self.current_screen].render()
108 else:
109 self.screens['fallback'].render()
110
111 # Render the debug view
112
113 self.screen_rect.render()
114
115 self.game.debug.render()
116
117 # Update the screen
118
119 self.screen.blit(self.main_surface, (0, 0))
120 pygame.display.update()
121
122## Fallback screen
123
124class fallback_screen(Screen):
125 def __init__(self, game):
126 self.game = game
127
128 ## Define rect for text
129
130 self.rect = gui_rect(game)
131 self.rect.set_x_constraint(pixel_constraint(0))
132 self.rect.set_y_constraint(pixel_constraint(0))
133 self.rect.set_width_constraint(percentage_constraint(1))
134 self.rect.set_height_constraint(percentage_constraint(1))
135 self.rect.visible = False
136
137 ## Define text
138
139 self.text = gui_text(game)
140 self.text.parent = self.rect
141 self.text.set_x_constraint(center_constraint())
142 self.text.set_y_constraint(percentage_constraint(0.35))
143 self.text.set_size_constraint(percentage_constraint(0.1))
144 self.text.size = 62
145 self.text.text = "Fallback Screen"
146
147 self.text2 = gui_text(game)
148 self.text2.parent = self.rect
149 self.text2.set_x_constraint(center_constraint())
150 self.text2.set_y_constraint(center_constraint())
151 self.text2.set_size_constraint(percentage_constraint(0.1))
152 self.text2.text = "This screen either appeared because you put in a \ninvalid name for a screen switch or you have no screen loaded.\nIf you think this is a bug create a issue on the Github page."
153
154 ## Redirect button
155
156 self.button = gui_press_button(game)
157 self.button.rect.set_x_constraint(center_constraint())
158 self.button.rect.set_y_constraint(percentage_constraint(0.65))
159 self.button.rect.set_width_constraint(percentage_constraint(0.2))
160 self.button.rect.set_height_constraint(percentage_constraint(0.1))
161 self.button.rect.set_draw_color(self.game.color_handler.get_rgb('main_menu.bright_bg_2'))
162 self.button.rect.set_border_radius(10)
163
164 ## Redirect Button Image
165
166 self.image = gui_rect(game, self.button.rect)
167 self.image.image = self.game.image.load('github.png')
168 self.image.set_x_constraint(center_constraint())
169 self.image.set_y_constraint(center_constraint())
170 self.image.set_width_constraint(aspect_constraint(1))
171 self.image.set_height_constraint(percentage_constraint(0.8))
172 self.image.show_rect = False
173
174 ## Update
175
176 def update(self):
177 self.rect.update()
178 self.text.update()
179 self.text2.update()
180 self.button.update()
181 self.image.update()
182
183 self.button.rect.tween_color(self.game.color_handler.get_rgb('main_menu.bright_bg_2'), 12)
184 self.button.rect.tween_size(percentage_constraint(0.2), percentage_constraint(0.1), 12)
185 if self.button.hover:
186 self.button.rect.tween_color(self.game.color_handler.get_rgb('main_menu.bright_bg'), 3)
187 self.button.rect.tween_size(percentage_constraint(0.21), percentage_constraint(0.11), 3)
188
189 if self.button.pressed:
190 webbrowser.open('https://github.com/willmexe/Game-Engine')
191
192 ## Render
193
194 def render(self):
195 self.game.renderer.screen.fill(self.game.color_handler.get_rgb('main_menu.background'))
196 self.rect.render()
197 self.text.render()
198 self.text2.render()
199 self.button.render()
200 self.image.render()