python pygame DIY街机游戏的源代码,还有一些小小的问题,有兴趣的话可以参考一下
1.[代码]config.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#picture
banana_image = 'image/banana.png'
weight_image = 'image/weight.png'
splash_image = 'image/weight.png'
#show setting
screen_size = 1366, 1024
background_color = 255, 255, 255
margin = 310
full_screen = 1
font_size = 48
#game behave
drop_speed = 1
banana_speed = 20
speed_increase = 1
weights_per_level = 10
banana_pad_top = 20
banana_pad_side = 40
2.[代码]objects.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import pygame, config, os
from random import randrange
class SquishSprite(pygame.sprite.Sprite):
def __init__(self, image):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.image.load(image).convert_alpha()
self.rect = self.image.get_rect()
screen = pygame.display.get_surface()
shrink = -config.margin * 2
self.area = screen.get_rect().inflate(shrink, shrink)
class Weight(SquishSprite):
def __init__(self, speed):
SquishSprite.__init__(self, config.weight_image)
self.speed = speed
self.reset()
def reset(self):
x = randrange(self.area.left, self.area.right)
self.rect.midbottom = x, 0
def update(self):
self.rect.top += self.speed
self.landed = self.rect.top >= self.area.bottom
class Banana(SquishSprite):
def __init__(self):
SquishSprite.__init__(self, config.banana_image)
#question here, why
self.rect.bottom = self.area.bottom
self.pad_top = config.banana_pad_top
self.pad_side = config.banana_pad_side
def update(self):
self.rect.centerx = pygame.mouse.get_pos()[0]
self.rect = self.rect.clamp(self.area)
def touches(self, other):
bounds = self.rect.inflate(-self.pad_side, -self.pad_top)
bounds.bottom = self.rect.bottom
return bounds.colliderect(other.rect)
3.[代码]squish.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os, sys, pygame
from pygame.locals import *
import objects, config
class State:
def handle(self, event):
if event.type == QUIT:
sys.exit()
if event.type == KEYDOWN and event.key == K_ESCAPE:
sys.exit()
def firstDisplay(self, screen):
screen.fill(config.background_color)
pygame.display.flip()
def display(self, screen):
pass
class Level(State):
def __init__(self, number = 1):
self.number = number
self.remaining = config.weights_per_level
speed = config.drop_speed
speed += (self.number - 1) * config.speed_increase
self.weight = objects.Weight(speed)
self.banana = objects.Banana()
both = self.weight, self.banana
self.sprites = pygame.sprite.RenderUpdates(both)
def update(self, game):
self.sprites.update()
if self.banana.touches(self.weight):
game.nextState = GameOver()
elif self.weight.landed:
self.weight.reset()
self.remaining -= 1
if self.remaining == 0:
game.nextState = LevelCleared(self.number)
def display(self, screen):
screen.fill(config.background_color)
updates = self.sprites.draw(screen)
pygame.display.update(updates)
class Paused(State):
finished = 0
image = None
text = ''
def handle(self, event):
State.handle(self, event)
if event.type in [MOUSEBUTTONDOWN, KEYDOWN]:
self.finished = 1
def update(self, game):
if self.finished:
game.nextState = self.nextState()
def firstDisplay(self, screen):
screen.fill(config.background_color)
font = pygame.font.Font(None, config.font_size)
lines = self.text.strip().splitlines()
height = len(lines) * font.get_linesize()
center, top = screen.get_rect().center
top -= height // 2
if self.image:
image = pygame.image.load(self.image).convert_alpha()
r = image.get_rect()
top += r.height // 2
r.midbottom = center, top - 20
screen.blit(image, r)
antialias = 1
black = 0, 0, 0
for line in lines:
text = font.render(line.strip(), antialias, black)
r = text.get_rect()
r.midtop = center, top
screen.blit(text, r)
top += font.get_linesize()
pygame.display.flip()
class Info(Paused):
nextState = Level
text = """
In this game you are a banana,
trying to survice a course in
self-defense against fruit, where the
participants will "defend" themselves
against you with a 10 kg weight.
"""
class StartUp(Paused):
nextState = Info
image = config.splash_image
text = """
Welcome to Squish, the game of Fruit Self-Defense.
"""
class LevelCleared(Paused):
def __init__(self, number):
self.number = number
self.text = """
Level %i cleared
Click to start the next level
""" % self.number
def nextState(self):
return Level(self.number + 1)
class GameOver(Paused):
nextState = Level
text = """
GameOver
Click to Restart, Esc to Quit
"""
class Game:
def __init__(self, *args):
path = os.path.abspath(args[0])
dir = os.path.split(path)[0]
os.chdir(dir)
self.state = None
self.nextState = StartUp()
def run(self):
pygame.init()
flag = 0
if config.full_screen:
flag = FULLSCREEN
screen_size = config.screen_size
screen = pygame.display.set_mode(screen_size)
#screen = pygame.display.set_mode(screen_size, flag)
pygame.display.set_caption('Fruit Self Defense')
pygame.mouse.set_visible(False)
while True:
if self.state != self.nextState:
self.state = self.nextState
self.state.firstDisplay(screen)
for event in pygame.event.get():
self.state.handle(event)
self.state.update(self)
self.state.display(screen)
if __name__ == '__main__':
game = Game(*sys.argv)
game.run()
4.[文件] code.zip ~ 29KB 下载(130)
5.[图片] Screenshot from 2014-09-17 19:34:00.png
6.[图片] Screenshot from 2014-09-17 19:34:11.png