Python Forum
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Rotating a rectangle
#9
Example
import pygame

def main():
    # Basic Pygame Setup
    pygame.display.set_caption("Rotating Sailing Ship")
    surface = pygame.display.set_mode((400, 300))
    clock = pygame.time.Clock()
    rect = surface.get_rect()
    running = True
    delta = 0
    fps = 30

    # Ship
    ship = pygame.sprite.Sprite()
    # Keep orignal image. For it doesn't get distorted.
    # pygame.SRCALPHA for transparency
    ship.orignal_image = pygame.Surface((100, 10), pygame.SRCALPHA)
    ship.image = ship.orignal_image
    ship.image.fill("white")
    ship.rect = ship.image.get_rect(center=rect.center)
    # Hold are floats
    ship.position = pygame.Vector2(ship.rect.center)
    # Hold are heading
    ship.vector = pygame.Vector2(1, 0)
    ship.rotate_velocity = 60
    ship.velocity = 80

    # Main Loop
    while running:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False

        # Move and Rotate
        rotate = 0
        key_state = pygame.key.get_pressed()
        if key_state[pygame.K_UP] or key_state[pygame.K_w]:
            ship.position += ship.vector * ship.velocity * delta
            ship.rect.center = ship.position

        if key_state[pygame.K_LEFT] or key_state[pygame.K_a]:
            rotate = -ship.rotate_velocity * delta

        if key_state[pygame.K_RIGHT] or key_state[pygame.K_d]:
            rotate = ship.rotate_velocity * delta

        if rotate != 0:
            ship.vector.rotate_ip(rotate)
            angle = ship.vector.as_polar()[1]
            ship.image = pygame.transform.rotate(ship.orignal_image, -angle)
            # Keep ship in center
            ship.rect = ship.image.get_rect(center=ship.rect.center)

        # Draw
        surface.fill("blue")
        surface.blit(ship.image, ship.rect)

        # Render To Screen
        pygame.display.flip()

        # Delta for smooth movement
        delta = clock.tick(fps) * 0.001

if __name__ == "__main__":
    pygame.init()
    main()
    pygame.quit()
99 percent of computer problems exists between chair and keyboard.
Reply


Messages In This Thread
Rotating a rectangle - by CompleteNewb - Aug-23-2021, 09:20 PM
RE: Rotating a rectangle - by deanhystad - Aug-24-2021, 09:54 AM
RE: Rotating a rectangle - by CompleteNewb - Aug-24-2021, 04:15 PM
RE: Rotating a rectangle - by deanhystad - Aug-24-2021, 05:49 PM
RE: Rotating a rectangle - by CompleteNewb - Aug-24-2021, 06:19 PM
RE: Rotating a rectangle - by deanhystad - Aug-24-2021, 08:22 PM
RE: Rotating a rectangle - by BashBedlam - Aug-24-2021, 09:46 PM
RE: Rotating a rectangle - by CompleteNewb - Aug-24-2021, 11:30 PM
RE: Rotating a rectangle - by Windspar - Aug-25-2021, 04:15 AM
RE: Rotating a rectangle - by deanhystad - Aug-25-2021, 03:47 PM
RE: Rotating a rectangle - by CompleteNewb - Aug-25-2021, 03:55 PM
RE: Rotating a rectangle - by deanhystad - Aug-25-2021, 04:34 PM
RE: Rotating a rectangle - by CompleteNewb - Aug-25-2021, 05:27 PM
RE: Rotating a rectangle - by deanhystad - Aug-25-2021, 06:44 PM
RE: Rotating a rectangle - by CompleteNewb - Aug-25-2021, 07:13 PM
RE: Rotating a rectangle - by deanhystad - Aug-25-2021, 07:32 PM
RE: Rotating a rectangle - by deanhystad - Aug-27-2021, 09:39 AM
RE: Rotating a rectangle - by deanhystad - Aug-27-2021, 11:42 AM
RE: Rotating a rectangle - by Windspar - Aug-27-2021, 05:18 PM
RE: Rotating a rectangle - by CompleteNewb - Aug-28-2021, 03:23 PM

Possibly Related Threads…
Thread Author Replies Views Last Post
  [PyGame] Surface and rectangle in pygame Fabrizio_fg 6 2,510 May-27-2023, 09:15 AM
Last Post: Fabrizio_fg
  Make rectangle snap to other rectangle corners Pedroski55 2 4,434 Aug-13-2021, 09:59 PM
Last Post: Pedroski55
  [PyGame] Rotating image issue Evoluxman 8 6,303 Oct-12-2019, 12:54 PM
Last Post: Evoluxman
  [PyGame] Rectangle keeps teleporting? keyfive 1 3,255 Jun-27-2018, 11:49 PM
Last Post: sonnekrieger7

Forum Jump:

User Panel Messages

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