本文所用到的ship.bmp和alien.bmp的下载 链接: https://pan.baidu.com/s/1Dn5yaQGZLIsN0BohM8PzoA 密码: 38ie
第一部分:认识pygame的简单的一些函数,利用命令简单地构造画面
我用我个人的理解逐渐剖析如何在python3中建一个窗口,里面放置一个飞船。
首先我们先来分析一些事情:
事情1:用python3,创建游戏窗口需要以下代码:
导入pygame,就是执行import pygame
导入sys,就是执行import sys,这个主要是一会调用sys.exit()结束游戏用的
首先是执行pygame.init() 这个语句会初始化pygame,使得pygame可用,里面初始化了很多组建,大约9个以内,具体什么也忘记了
其次是设置窗口大小,执行pygame.display.set_mode((1000,800)),这个执行完毕后,以后入职建立无限循环,那么就可以把它画进去。
然后值设置窗口说明,执行pygame.display.set_caption("some caption like.....")
如果要设置窗口的背景颜色,那么还需要定义一个颜色,例如(255,0,255)
接下来建立一个无限循环,就可以画出刚才定义好的窗口,代码如下:
import sys
import pygame
pygame.init()
screen = pygame.display.set_mode((1000,900))
pygame.display.set_caption("alien invasion")
color = (0,255,255)
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
screen.fill(color)
pygame.display.flip()
事情2:
画一个飞船,并且显示在事情1定义的screen中:
import sys
import pygame
pygame.init()
screen = pygame.display.set_mode((1000,900))
#create ship
screen_rect = screen.get_rect()
ship_image = pygame.image.load('image/ship.bmp')
ship_rect = ship_image.get_rect()
ship_rect.centerx = screen_rect.centerx
ship_rect.bottom = screen_rect.bottom
pygame.display.set_caption("alien invasion")
color = (0,255,255)
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
#这里一定注意,先执行填充颜色,再执行填充位图,很好理解,否则飞船会被颜色覆盖
#先执行screen.fill(color)
screen.fill(color)
#后执行填充位图screen.blit(....)
screen.blit(ship_image,ship_rect)
pygame.display.flip()
执行结果:
其实,代码可以简写为如下形式:
import sys
import pygame
pygame.init()
screen = pygame.display.set_mode((1000,900))
#create ship
screen_rect = screen.get_rect()
ship_image = pygame.image.load('image/ship.bmp')
ship_rect = ship_image.get_rect()
#以下两句是改变飞船位置的,如果不改变位置,则使用默认位置,也就是左上角
#ship_rect.centerx = screen_rect.centerx
#ship_rect.bottom = screen_rect.bottom
pygame.display.set_caption("alien invasion")
color = (0,255,255)
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
screen.fill(color)
screen.blit(ship_image,ship_rect)
pygame.display.flip()
执行结果如下:
更简单的情况,画一个飞船,直接传给screen去显示:
import sys
import pygame
pygame.init()
screen = pygame.display.set_mode((1000,800))
ship = pygame.image.load('ship.bmp')
ship_rect = ship.get_rect()
pygame.display.set_caption("alien invasion")
while True:
screen.fill((255,4,245))
screen.blit(ship,ship_rect)
pygame.display.flip()
个人看法:在一个screen内建ship,其实只要建screen和ship,并且直接把ship的图像和位置传给screen即可。screen.blit(图片,图片位置)
接下来,心血来潮,再在screen底部中央画一个alien.bmp,先把alien.bmp放置在python3代码文件同一个文件夹下,然后编写如下代码:
import sys
import pygame
pygame.init()
screen = pygame.display.set_mode((1000,800))
pygame.display.set_caption("alien invasion")
photo = pygame.image.load('alien.bmp')
photo_rect = photo.get_rect()
screen_rect = screen.get_rect()
#set the ship on the center of the screen
photo_rect.centerx = screen_rect.centerx
photo_rect.bottom = screen_rect.bottom
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
#screen.blit(photo,photo_rect)
screen.fill((255,34,54))
screen.blit(photo,photo_rect)
pygame.display.flip()
执行结果:
第二部分:进阶
接下来,我们熟悉pygame的简单构造过程后,把上述代码放在类和函数中实现,实现模块化编程,如下:
ship.py文件:
#ship.py
import pygame
class Ship():
"""创建ship"""
def __init__(self,screen):
self.screen = screen
self.screen_rect = screen.get_rect()
self.image = pygame.image.load('image/ship.bmp')
self.image_rect = self.image.get_rect()
self.image_rect.centerx = self.screen_rect.centerx
self.image_rect.bottom = self.screen_rect.bottom
def blitme(self):
"""在screen中画创建出的ship"""
self.screen.blit(self.image,self.image_rect)
~
下面是文件3.py
#文件3.py
import sys
import pygame
from ship import Ship
def run_game():
"""创建动画"""
pygame.init()
screen = pygame.display.set_mode((1000,800))
pygame.display.set_caption("ship is come here")
#create a example
ship = Ship(screen)
color = (255,255,255)
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
screen.fill(color)
#screen.blit(ship.image,ship.image_rect)
ship.blitme()
pygame.display.flip()
run_game()
然后把ship.bmp,放在当前文件夹的image文件夹下 ,准备运行
在ubuntu中执行命令(在windows中执行命令是python 3.py)
python3 3.py
运行结果:
接下来,继续优化程序,把颜色,caption,screen的宽度和高度等信息单独放在一个设置文件中,那么现在我们一共有3个程序文件了,还有一个图片文件,所以要运行程序共需要4个程序,
文件ship.py
#文件ship.py
import pygame
class Ship():
"""创建ship"""
def __init__(self,screen):
self.screen = screen
self.screen_rect = screen.get_rect()
self.image = pygame.image.load('image/ship.bmp')
self.image_rect = self.image.get_rect()
self.image_rect.centerx = self.screen_rect.centerx
self.image_rect.bottom = self.screen_rect.bottom
def blitme(self):
"""在screen中画ship"""
self.screen.blit(self.image,self.image_rect)
文件settings.py
class Settings():
def __init__(self):
self.color = (255,255,255)
self.set_width = 1000
self.set_height = 800
self.caption = "alien ship"
文件ship_game.py
#文件ship_game.py
#它的功能是:构造动画的主程序
import sys
import pygame
from settings import Settings
from ship import Ship
def run_game():
pygame.init()
myset = Settings()
screen = pygame.display.set_mode((myset.set_width,myset.set_height))
pygame.display.set_caption(myset.caption)
#create a example
ship = Ship(screen)
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
screen.fill(myset.color)
#screen.blit(ship.image,ship.image_rect)
ship.blitme()
pygame.display.flip()
run_game()
文件ship.bmp放在当前文件夹image下,
接下来运行文件,ubuntu中是:
python3 ship_game.py
windows中是(注意windows中如果相对路径找不到ship.bmp文件,那就使用绝对路径):
python ship_game.py