Python Forum
[PyGame] Terrible Sprite controls, need help.
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
[PyGame] Terrible Sprite controls, need help.
#2
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.
Reply


Messages In This Thread
RE: Terrible Sprite controls, need help. - by Windspar - Dec-14-2019, 06:14 AM

Possibly Related Threads…
Thread Author Replies Views Last Post
  [PyGame] Sprite image.get_rect() moves sprite to 0, 0 michael1789 2 4,711 Dec-13-2019, 08:37 PM
Last Post: michael1789
  Sprite not rendering Clunk_Head 2 2,277 Oct-03-2019, 11:27 AM
Last Post: Clunk_Head
  Need help making a sprite GalaxyCoyote 4 3,390 Aug-11-2019, 09:12 PM
Last Post: metulburr
  moving a sprite pfaber11 3 2,688 May-15-2019, 12:52 PM
Last Post: pfaber11
  [PyGame] Need Help With Sprite ghost0fkarma 2 3,373 Jan-09-2018, 02:14 PM
Last Post: ghost0fkarma
  [PyGame] Snake controls not working jakegold98 5 6,627 Dec-12-2017, 01:45 AM
Last Post: Windspar

Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020