Pygame: Difference between revisions

From ICO wiki
Jump to navigationJump to search
Lvosandi (talk | contribs)
No edit summary
Lvosandi (talk | contribs)
Line 68: Line 68:
     bird = pygame.image.load("img/bird.png")
     bird = pygame.image.load("img/bird.png")
     background = pygame.image.load("img/bg.png")
     background = pygame.image.load("img/bg.png")
 
   
     screen = pygame.display.set_mode((800,600))
     screen = pygame.display.set_mode((800,600))
     pygame.display.set_caption('Floppy Bird')
     pygame.display.set_caption('Floppy Bird')
     pygame.mouse.set_visible(0)
     pygame.mouse.set_visible(0)
 
     print "Pipe dimensions:", pipe.get_size()     
     print "Pipe dimensions:", pipe.get_size()     
     print "Background dimensions:", background.get_size()
     print "Background dimensions:", background.get_size()
   
     y = 0
     y = 0
     vy = 0
     vy = 0
   
     level = [0, 1, 0, 0, 2, 0, 0, 3,0, 1, 0, 0, 2, 0, 0, 3,0, 1, 0, 0, 2, 0, 0, 3,]
     level = [0, 1, 0, 0, 2, 0, 0, 3,0, 1, 0, 0, 2, 0, 0, 3,0, 1, 0, 0, 2, 0, 0, 3,]
   
   
Line 93: Line 93:
                 return
                 return
             elif event.type == KEYDOWN and event.key == K_SPACE:
             elif event.type == KEYDOWN and event.key == K_SPACE:
                 vy -= 5
                 vy -= 0.02
                 print "Space was pressed!"
                 print "Space was pressed!"
         if frames % 100 == 0:
 
            vy += 1
         vy += 0.0001
            y += vy
        y += vy
         for i in range(0, 3):
         for i in range(0, 3):
             scene.blit(background, (i*148 - (frames/10) % 148, 0), (0, 0, 200, 300))
             scene.blit(background, (i*148 - (frames/10) % 148, 0), (0, 0, 200, 300))
         frames += 1
         frames += 1
       
         for offset, pipe_height in enumerate(level):
         for offset, pipe_height in enumerate(level):
             if pipe_height == 0: continue # Skip pipes whose height is 0
             if pipe_height == 0: continue # Skip pipes whose height is 0
             scene.blit(pipe, (400-frames/2 + offset * 32, 180 - pipe_height * 32), (0, 0, 100,160))
             scene.blit(pipe, (400-frames/2 + offset * 32, 180 - pipe_height * 32), (0, 0, 100,160))
             scene.blit(antipipe, (400-frames/2 + offset * 32, 180 - pipe_height * 32 - 250), (0, 0, 100,160))
             scene.blit(antipipe, (400-frames/2 + offset * 32, 180 - pipe_height * 32 - 250), (0, 0, 100,160))
 
         scene.blit(bird, (100, 100+y), (18 * (int(frames/100) % 3), 0, 18, 13))
         scene.blit(bird, (100, 100+int(y)), (18 * (int(frames/100) % 3), 0, 18, 13))
         pygame.transform.scale(scene, screen.get_size(), screen) # Here we scale it up and paste to screen
         pygame.transform.scale(scene, screen.get_size(), screen) # Here we scale it up and paste to screen
 
         pygame.display.flip()
         pygame.display.flip()
   
   

Revision as of 16:20, 13 March 2016

Pygame is a library for programming games with Python. It handles event loop and simplifies drawing the scene.

Installation

Ubuntu users can simply apt-get the package:

 apt-get install python-pygame

Windows users should download pygame .whl file corresponding to their Python runtime version. On Python 3.5 use following to install the module:

 pip3 install pygame-1.9.2a0-cp35-none-win_amd64.whl

Code example

An example pygame code:

import os, sys
import pygame
from pygame.locals import *

def __main__():
    pygame.init()
    pipe = pygame.image.load("img/pipe.png")
    bird = pygame.image.load("img/bird.png")
    background = pygame.image.load("img/bg.png")
    screen = pygame.display.set_mode((640,480))
    pygame.display.set_caption('Floppy Bird')
    pygame.mouse.set_visible(0)

    while True:
        for event in pygame.event.get():
            if event.type == QUIT:
                return
            elif event.type == KEYDOWN and event.key == K_ESCAPE:
                return
        screen.blit(background, (50, 50), (0, 0, 200, 300))
        screen.blit(bird, (100, 100), (0, 0, 17, 18))
        pygame.display.flip()

if __name__ == "__main__":
    __main__()

Download graphics:

wget http://enos.itcollege.ee/~lvosandi/floppy-gfx.zip
unzip floppy-gfx.zip


Execrises:

  • Implement panning of background
  • Draw the pipes on the screen, use pygame.transform.flip to flip the pipe image


Improved example

import os, sys
import pygame
from pygame.locals import *
 
def __main__():
    pygame.init()
    pipe = pygame.image.load("img/pipe.png")
    bird = pygame.image.load("img/bird.png")
    background = pygame.image.load("img/bg.png")
 
 
    screen = pygame.display.set_mode((800,600))
    pygame.display.set_caption('Floppy Bird')
    pygame.mouse.set_visible(0)
 
    print "Pipe dimensions:", pipe.get_size()    
    print "Background dimensions:", background.get_size()
 
    y = 0
    vy = 0
 
    level = [0, 1, 0, 0, 2, 0, 0, 3,0, 1, 0, 0, 2, 0, 0, 3,0, 1, 0, 0, 2, 0, 0, 3,]
 
    antipipe = pygame.transform.flip(pipe, 0, 1)
    frames = 0 # Here we count frames
    scene = pygame.Surface((240,180)) # This is where we compose the scene
    while True:
        scene.fill(0) # This fills the buffer with black pixels
        for event in pygame.event.get():
            if event.type == QUIT:
                return
            elif event.type == KEYDOWN and event.key == K_ESCAPE:
                return
            elif event.type == KEYDOWN and event.key == K_SPACE:
                vy -= 0.02
                print "Space was pressed!"

        vy += 0.0001
        y += vy
        for i in range(0, 3):
            scene.blit(background, (i*148 - (frames/10) % 148, 0), (0, 0, 200, 300))
        frames += 1
 
        for offset, pipe_height in enumerate(level):
            if pipe_height == 0: continue # Skip pipes whose height is 0
            scene.blit(pipe, (400-frames/2 + offset * 32, 180 - pipe_height * 32), (0, 0, 100,160))
            scene.blit(antipipe, (400-frames/2 + offset * 32, 180 - pipe_height * 32 - 250), (0, 0, 100,160))
 
        scene.blit(bird, (100, 100+int(y)), (18 * (int(frames/100) % 3), 0, 18, 13))
        pygame.transform.scale(scene, screen.get_size(), screen) # Here we scale it up and paste to screen
 
        pygame.display.flip()
 
if __name__ == "__main__":
    __main__()

Exercises:

  • Add collision detection
  • Add text overlays and scoring using pygame.font
  • Attempt to get fixed FPS