赞
踩
本文所用到的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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。