My Pygame Game Engine
at main 6.3 kB view raw
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()