Benutzer-Werkzeuge

Webseiten-Werkzeuge


Seitenleiste

ss19:pygame_beispielprogramm_mit_hitbox_eric
#! /usr/bin/env python

import os
import random
import pygame

# Class for the orange dude
class Player(object):
    
    def __init__(self):
        self.rect = pygame.Rect(32, 32, 16, 16)

    def move(self, dx, dy):
        
        # Move each axis separately. Note that this checks for collisions both times.
        if dx != 0:
            self.move_single_axis(dx, 0)
        if dy != 0:
            self.move_single_axis(0, dy)
    
    def move_single_axis(self, dx, dy):
        
        # Move the rect
        self.rect.x += dx
        self.rect.y += dy

        # If you collide with a wall, move out based on velocity
        for w in range(len(walls)):
            for wall in range(len(walls)):
                if self.rect.colliderect(walls[wall].rect):
                    if dx > 0: # Moving right; Hit the left side of the wall
                        self.rect.right = walls[wall].rect.left
                    if dx < 0: # Moving left; Hit the right side of the wall
                        self.rect.left = walls[wall].rect.right
                    if dy > 0: # Moving down; Hit the top side of the wall
                        self.rect.bottom = walls[wall].rect.top
                    if dy < 0: # Moving up; Hit the bottom side of the wall
                        self.rect.top = walls[wall].rect.bottom
                     #deletes walls   
                    #del walls[wall]
                    #break
# Nice class to hold a wall rect
class Wall(object):
    
    def __init__(self, pos):
        walls.append(self)
        self.rect = pygame.Rect(pos[0], pos[1], 16, 16)

# Initialise pygame
os.environ["SDL_VIDEO_CENTERED"] = "1"
pygame.init()

# Set up the display
pygame.display.set_caption("Get to the red square!")
screen = pygame.display.set_mode((500,500))

clock = pygame.time.Clock()
walls = [] # List to hold the walls
player = Player() # Create the player

# Holds the level layout in a list of strings.
level = [
"WWWWWWWWWWWWWWWWWWWW",
"W                  W",
"W         WWWWWW   W",
"W   WWWW       W   W",
"W   W        WWWW  W",
"W WWW  WWWW        W",
"W   W     W W      W",
"W   W     W   WWW WW",
"W   WWW WWW   W W  W",
"W     W   W   W W  W",
"WWW   W   WWWWW W  W",
"W W      WW        W",
"W W   WWWW   WWW   W",
"W     W    E   W   W",
"WWWWWWWWWWWWWWWWWWWW",
]
#Generates random level
#levelsize = 30

#x = y = 0
#for e in range(levelsize):
#    for i in range(levelsize):
#        if random.randint(0,10)<=5:
#            Wall((x, y))
#        else:
#            end_rect = pygame.Rect(x, y, 16, 16)
#        x += 16
#    y += 16
#    x = 0
    
# Parse the level string above. W = wall, E = exit
x = y = 0
for row in level:
    for col in row:
        if col == "W":
            Wall((x, y))
        if col == "E":
            end_rect = pygame.Rect(x, y, 16, 16)
        x += 16
    y += 16
    x = 0

running = True
while running:
    
    clock.tick(60)
    
    for e in pygame.event.get():
        if e.type == pygame.QUIT:
            running = False
        if e.type == pygame.KEYDOWN and e.key == pygame.K_ESCAPE:
            running = False
    
    # Move the player if an arrow key is pressed
    key = pygame.key.get_pressed()
    if key[pygame.K_LEFT]:
        player.move(-10, 0)
    if key[pygame.K_RIGHT]:
        player.move(10, 0)
    if key[pygame.K_UP]:
        player.move(0, -10)
    if key[pygame.K_DOWN]:
        player.move(0, 10)
    
    # Just added this to make it slightly fun ;)
    if player.rect.colliderect(end_rect):
        print("You win!")
        break
    
    # Draw the scene
    screen.fill((0, 0, 0))
    for wall in walls:
        pygame.draw.rect(screen, (255, 0, 255), wall.rect)
    pygame.draw.rect(screen, (255, 0, 0), end_rect)
    pygame.draw.rect(screen, (255, 200, 0), player.rect)
    pygame.display.flip()
    
    #print ("Size: ",len(walls))
 
ss19/pygame_beispielprogramm_mit_hitbox_eric.txt · Zuletzt geändert: 2019/05/28 14:14 von leanderh