Permalink
Cannot retrieve contributors at this time
Name already in use
A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
PyGame/2D Project.py
Go to fileThis commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
225 lines (196 sloc)
8.02 KB
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#! /usr/bin/python | |
import pygame | |
from pygame import * | |
WIN_WIDTH = 800 #Window Width and Height | |
WIN_HEIGHT = 640 | |
HALF_WIDTH = int(WIN_WIDTH / 2) #Used for camera later in script | |
HALF_HEIGHT = int(WIN_HEIGHT / 2) | |
DISPLAY = (WIN_WIDTH, WIN_HEIGHT) #Takes window variables | |
DEPTH = 32 | |
FLAGS = 0 #Depth and Flags are at pygame default | |
def main(): #First function that is called in script | |
pygame.init() #Initializes Pygame | |
screen = pygame.display.set_mode(DISPLAY, FLAGS, DEPTH) #otherwise would have to draw to a new window each time you move | |
pygame.display.set_caption("Use the arrow keys to move!") #caption at top of the window | |
timer = pygame.time.Clock() #clock function | |
up = down = left = right = running = False #Used Later | |
bg = Surface((32,32)) #32 pixels by 32 pixels | |
bg.convert() #convert to same pixel format as display | |
bg.fill(Color("#7C878E")) #Background (UCONN Grey) | |
entities = pygame.sprite.Group() | |
player = Player(32, 32) | |
platforms = [] | |
x = y = 0 | |
level = [ | |
"PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP", | |
"P P", | |
"P P", | |
"P P", | |
"P PPPPPPPPPPP P", | |
"P P", | |
"P P", | |
"P P", | |
"P PPPPPPPP P", | |
"P P", | |
"P PPPPPPP P", | |
"P PPPPPP P", | |
"P P", | |
"P PPPPPPP P", | |
"P P", | |
"P PPPPPP P", | |
"P P", | |
"P PPPPPPPPPPP P", | |
"P P", | |
"P PPPPPPPPPPPPPPPPP P", | |
"P P", | |
"P P", | |
"P P", | |
"P P", | |
"PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP",] | |
# build the level | |
for row in level: | |
for col in row: | |
if col == "P": | |
p = Platform(x, y) | |
platforms.append(p) | |
entities.add(p) | |
if col == "E": | |
e = ExitBlock(x, y) | |
platforms.append(e) | |
entities.add(e) | |
x += 32 | |
y += 32 | |
x = 0 | |
total_level_width = len(level[0])*32 | |
total_level_height = len(level)*32 | |
camera = Camera(complex_camera, total_level_width, total_level_height) | |
entities.add(player) | |
while 1: #Always True, sets fps at 60 | |
timer.tick(60) | |
for e in pygame.event.get(): | |
if e.type == QUIT: raise SystemExit | |
if e.type == KEYDOWN and e.key == K_ESCAPE: | |
raise SystemExit | |
if e.type == KEYDOWN and e.key == K_UP: | |
up = True | |
if e.type == KEYDOWN and e.key == K_DOWN: | |
down = True | |
if e.type == KEYDOWN and e.key == K_LEFT: | |
left = True | |
if e.type == KEYDOWN and e.key == K_RIGHT: | |
right = True | |
if e.type == KEYDOWN and e.key == K_SPACE: | |
running = True | |
if e.type == KEYUP and e.key == K_UP: | |
up = False | |
if e.type == KEYUP and e.key == K_DOWN: | |
down = False | |
if e.type == KEYUP and e.key == K_RIGHT: | |
right = False | |
if e.type == KEYUP and e.key == K_LEFT: | |
left = False | |
# draw background | |
for y in range(32): | |
for x in range(32): | |
screen.blit(bg, (x * 32, y * 32)) | |
camera.update(player) | |
# update player, draw everything else | |
player.update(up, down, left, right, running, platforms) | |
for e in entities: | |
screen.blit(e.image, camera.apply(e)) | |
pygame.display.update() | |
class Camera(object): | |
def __init__(self, camera_func, width, height): | |
self.camera_func = camera_func | |
self.state = Rect(0, 0, width, height) | |
def apply(self, target): | |
return target.rect.move(self.state.topleft) | |
def update(self, target): | |
self.state = self.camera_func(self.state, target.rect) | |
def simple_camera(camera, target_rect): | |
l, t, _, _ = target_rect | |
_, _, w, h = camera | |
return Rect(-l+HALF_WIDTH, -t+HALF_HEIGHT, w, h) | |
def complex_camera(camera, target_rect): | |
l, t, _, _ = target_rect | |
_, _, w, h = camera | |
l, t, _, _ = -l+HALF_WIDTH, -t+HALF_HEIGHT, w, h | |
l = min(0, l) # stop scrolling at the left edge | |
l = max(-(camera.width-WIN_WIDTH), l) # stop scrolling at the right edge | |
t = max(-(camera.height-WIN_HEIGHT), t) # stop scrolling at the bottom | |
t = min(0, t) # stop scrolling at the top | |
return Rect(l, t, w, h) | |
class Entity(pygame.sprite.Sprite): | |
def __init__(self): | |
pygame.sprite.Sprite.__init__(self) | |
class Player(Entity): | |
def __init__(self, x, y): | |
Entity.__init__(self) | |
self.xvel = 0 | |
self.yvel = 0 | |
self.onGround = False | |
self.image = Surface((32,32)) | |
self.image.fill(Color("#0000FF")) | |
self.image.convert() | |
self.rect = Rect(x, y, 32, 32) | |
def update(self, up, down, left, right, running, platforms): | |
if up: | |
# only jump if on the ground | |
if self.onGround: self.yvel -= 10 | |
if down: | |
pass | |
if running: | |
self.xvel = 12 | |
if left: | |
self.xvel = -8 | |
if right: | |
self.xvel = 8 | |
if not self.onGround: | |
# only accelerate with gravity if in the air | |
self.yvel += 0.3 | |
# max falling speed | |
if self.yvel > 100: self.yvel = 100 | |
if not(left or right): | |
self.xvel = 0 | |
# increment in x direction | |
self.rect.left += self.xvel | |
# do x-axis collisions | |
self.collide(self.xvel, 0, platforms) | |
# increment in y direction | |
self.rect.top += self.yvel | |
# assuming we're in the air | |
self.onGround = False; | |
# do y-axis collisions | |
self.collide(0, self.yvel, platforms) | |
def collide(self, xvel, yvel, platforms): | |
for p in platforms: | |
if pygame.sprite.collide_rect(self, p): | |
if isinstance(p, ExitBlock): | |
pygame.event.post(pygame.event.Event(QUIT)) | |
if xvel > 0: | |
self.rect.right = p.rect.left | |
print ("collide right") | |
if xvel < 0: | |
self.rect.left = p.rect.right | |
print ("collide left") | |
if yvel > 0: | |
self.rect.bottom = p.rect.top | |
self.onGround = True | |
self.yvel = 0 | |
if yvel < 0: | |
self.rect.top = p.rect.bottom | |
class Platform(Entity): | |
def __init__(self, x, y): | |
Entity.__init__(self) | |
self.image = Surface((32, 32)) | |
self.image.convert() | |
self.image.fill(Color("#DDDDDD")) | |
self.rect = Rect(x, y, 32, 32) | |
def update(self): | |
pass | |
class ExitBlock(Platform): | |
def __init__(self, x, y): | |
Platform.__init__(self, x, y) | |
self.image.fill(Color("#0033FF")) | |
if __name__ == "__main__": | |
main() |