Dec-14-2019, 06:14 AM
Example.
import os import math import pygame from pygame.sprite import Sprite class Scene: def on_draw(self, surface): pass def on_event(self, event): pass def on_update(self, delta): pass class Manager: def __init__(self, caption, width, height, center=True): if center: os.environ['SDL_VIDEO_CENTERED'] = '1' # Basic pygame setup pygame.display.set_caption(caption) self.surface = pygame.display.set_mode((width, height)) self.rect = self.surface.get_rect() self.clock = pygame.time.Clock() self.running = False self.delta = 0 self.fps = 60 # Scene Interface self.scene = Scene() def mainloop(self): self.running = True while self.running: for event in pygame.event.get(): self.scene.on_event(event) self.scene.on_update(self.delta) self.scene.on_draw(self.surface) pygame.display.flip() self.delta = self.clock.tick(self.fps) def quit(self): self.running = False class Ship(Sprite): def __init__(self, image, position, anchor="center"): self.image = image self.original_image = image self.rect = image.get_rect(**{anchor: position}) self.position = pygame.Vector2(self.rect.center) self.angle = 0 self.speed = 0 self.max_speed = 0.1 self.thrust = 0.00005 self.rotate_speed = 0.08 self.friction = 0.99 self.drift = 0.01 self.calculate_direction() def calculate_direction(self): rads = math.radians(self.angle) self.direction = pygame.Vector2(math.sin(rads), math.cos(rads)) def draw(self, surface): surface.blit(self.image, self.rect) def movement(self, keys, delta): if keys[pygame.K_UP]: self.speed += self.thrust * delta if self.speed > self.max_speed: self.speed = self.max_speed elif keys[pygame.K_DOWN]: self.speed -= self.thrust * delta / 2 if self.speed < -self.max_speed / 2: self.speed = -self.max_speed / 2 else: self.speed = self.speed * self.friction if -self.drift < self.speed < self.drift: self.speed = 0 if keys[pygame.K_LEFT]: self.angle = (self.angle + self.rotate_speed * delta) % 360 self.update_rotation() elif keys[pygame.K_RIGHT]: self.angle = (self.angle - self.rotate_speed * delta) % 360 self.update_rotation() self.position += self.direction * self.speed * delta self.rect.center = self.position def update_rotation(self): self.image = pygame.transform.rotate(self.original_image, self.angle) self.rect = self.image.get_rect(center=self.rect.center) self.calculate_direction() class ShipScene(Scene): def __init__(self, manager): self.manager = manager self.create_ship() def create_ship(self): image = pygame.Surface((15, 10), pygame.SRCALPHA) image.fill(pygame.Color('red')) self.ship = Ship(image, self.manager.rect.center) def on_draw(self, surface): surface.fill(pygame.Color('black')) self.ship.draw(surface) def on_event(self, event): if event.type == pygame.QUIT: self.manager.quit() def on_update(self, delta): keys = pygame.key.get_pressed() self.ship.movement(keys, delta) def main(): pygame.init() manager = Manager("Ship Thrust Example", 800, 600) manager.scene = ShipScene(manager) manager.mainloop() if __name__ == "__main__": main()
99 percent of computer problems exists between chair and keyboard.