Exemple #1
0
def main():
    # Initializes pygame, window
    pygame.init()
    window = pygame.display.set_mode(
        (globals.SCREEN_WIDTH, globals.SCREEN_HEIGHT))
    input_params = Inputs()
    clock = pygame.time.Clock()
    app = QApplication(sys.argv)
    param_win = Window()
    param_win.show()

    # Polygon to be controlled by arrows
    polygon = Polygon(np.array([800, 500]), 30, 3, 10, (255, 255, 255))
    space = Space(polygon)
    while globals.RUN:
        # Drawing shapes
        space.draw(window)
        # Adding force to main polygon
        if input_params.is_left():
            polygon.add_force(np.array([-globals.KEY_FORCE, 0.]))
        elif input_params.is_right():
            polygon.add_force(np.array([globals.KEY_FORCE, 0.]))
        if input_params.is_up():
            polygon.add_force(np.array([0., -globals.KEY_FORCE]))
        elif input_params.is_down():
            polygon.add_force(np.array([0., globals.KEY_FORCE]))

        # Add shape on left click
        if input_params.mouse_left_click():
            space.add_shape(globals.NEW_SHAPE_TYPE, input_params.mouse_pos,
                            globals.NEW_SHAPE_RADIUS, globals.NEW_SHAPE_MASS,
                            globals.NEW_SHAPE_DEGREE)
        # Remove shape on right click
        if input_params.mouse_right_click():
            space.remove_shape(input_params.mouse_pos)

        if input_params.is_clear():
            space.shapes = []

        clock.tick(globals.FPS)
        elapsed_time = clock.get_time()
        # Update shapes in space class for movement, rotarion...
        space.update(window, elapsed_time)
        # Check for mouse of keyboard click
        input_params.update()
        pygame.display.update()
        pygame.display.set_caption(str(clock.get_fps()))

    sys.exit(app.exec_())
Exemple #2
0
class Scene(object):
    def __init__(self):
        self.screen = None
        self.inputs = Inputs()
        # The list of components in the scene. Components are drawn in order in
        # the list
        self.background = []
        self.foreground = []
        self.midground = []
        # The scene manager that this scene sits in.
        self.manager = None
        # The settings for the game.
        self.settings = None

    # Build the scene components.
    def build(self):
        pass

    # Informs the scene of the screen.
    def set_screen(self, screen):
        self.screen = screen

    # Informs the scene of the game settings.
    def set_settings(self, settings):
        self.settings = settings

    # Add components to a specific layer. Only Display componetns can be added
    # to a Scene.
    def add_component_background(self, component):
        if util.check_type(component, "DisplayObject"):
            self.background.append(component)

    def add_component_midground(self, component):
        if util.check_type(component, "DisplayObject"):
            self.midground.append(component)

    def add_component_foreground(self, component):
        if util.check_type(component, "DisplayObject"):
            self.foreground.append(component)

    def update(self):
        # Update inputs.
        self.inputs.update(pygame.event.get([pygame.KEYDOWN, pygame.KEYUP]))
        # Update the game components.
        for component in self.background + self.midground + self.foreground:
            component.update()
        # Re-Shuffle each layer of components.
        self.background.sort(key=lambda x: x.z)
        self.midground.sort(key=lambda x: x.z)
        self.foreground.sort(key=lambda x: x.z)

    def draw(self):
        # Draw background components.
        for component in self.background:
            component.draw(self.screen.get_display())

        # Draw middle ground components.
        for component in self.midground:
            component.draw(self.screen.get_display())

        # Draw foreground components.
        for component in self.foreground:
            component.draw(self.screen.get_display())
Exemple #3
0
class App():
    STATES = {'menu': MenuState, 'draw': DrawState}

    def __init__(self, init_state='menu'):
        # Init pygame
        pygame.init()

        # Get clock
        self.clock = pygame.time.Clock()

        # Create screen
        self.__screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))

        # Main app font
        self.font = pygame.font.SysFont("Arial", 16, False, False)

        # Input pipeline (instance gets replaced by each state init())
        self.inputs = Inputs()

        # Persistent data dictionary, for data to persist across state change
        self.__data = {}

        # Current state
        self.__state = None
        # Next state name
        self.__next_state = init_state

        # Main game loop escape bool
        self.running = True

    @property
    def data(self):
        return self.__data

    @property
    def state(self):
        return self.__state

    @state.setter
    def state(self, name):
        """
        State change setter function
        """
        self.__next_state = name

    @property
    def screen(self):
        return self.__screen

    def run(self):
        """
        Main run method
        - Main game loop
        """
        # Set window title
        pygame.display.set_caption(WINDOW_TITLE)

        # Main game loop
        while self.running:

            # Get events
            events = pygame.event.get()
            for event in events:
                # Handle Quit
                if event.type == pygame.QUIT:
                    pygame.quit()
                    return 0

            # Send events to input pipeline
            self.inputs.handle_events(events)

            # Set FPS and get frame time
            delta_time = self.clock.tick(FPS_CAP)

            # Update input pipeline
            self.inputs.update(delta_time)

            # Update the system
            self.update(delta_time)

            # Draw next frame
            self.draw_frame()

    def update(self, delta_time):
        """
        Update state of the system
        """
        if self.__next_state:
            self.__state = self.STATES[self.__next_state.lower()](self)
            self.__next_state = ''
        else:
            self.__state.update(delta_time)

    def draw_frame(self):
        """
        Draw Next Frame
        """
        # # Fill screen with background color
        # bg_color = self.__state.scene_bg
        # self.__screen.fill(bg_color)

        # Call .draw() func of state
        self.__state.draw()  # For transient drawing to the screen, (arrows)

        # Draw fps to screen
        self.__draw_fps()

        # Update the display
        pygame.display.update()

    def __draw_fps(self):
        """
        Draw fps to screen
        """
        txt = f'{round(self.clock.get_fps())} FPS'
        rtxt = self.font.render(txt, False, pygame.Color('black'))
        rsiz = self.font.size(txt)
        self.__screen.blit(rtxt, (SCREEN_WIDTH - rsiz[0] - 5, 5))