0.说在前面
1.pygame入坑
2.奥运五环
3.美国队长盾牌
4.作者的话
前两天上老板课,任务:一个月贪吃蛇,不限语言。
于是乎,今日入坑小游戏,开始学习pygame的开发。
本节主要介绍pygame的初级教程,以及如何用pygame去绘制奥运五环及美国队长盾牌。
先来看几个直观的结果~~
五环图
盾牌图
哈哈,绘制就这样了,接下来看如何使用初中数学知识以及pygame去开发。
【安装】
pip install pygame
【HelloWorld】
# 该模块包含pygame使用的各种常量。它的内容自动放在pygame模块命名空间中
from pygame.locals import *
import pygame
pygame.display.init() l# 初始化页面布局
width,height = 600,500 # 设置窗口的宽度与高度
screen = pygame.display.set_mode((width,height)) # 初始化窗口或屏幕以进行显示
'''
set_mode(resolution =(0,0),flags = 0,depth = 0) - > Surface
此功能将创建一个显示Surface。传入的参数是对显示类型的请求。实际创建的显示将是系统支持的最佳匹配。
resolution参数是一对表示宽度和高度的数字。flags参数是其他选项的集合。depth参数表示用于颜色的位数。
'''
pygame.display.set_caption('Hello,World') # 设置窗口标题
bg_filename = 'bg.jpg' # 设置背景图片
mouse_image_filename = 'mouse.png' # 设置鼠标图片
# Surface.convert()不带参数调用,以创建一个可以在屏幕上更快地绘制的副本
bg = pygame.image.load(bg_filename).convert()
# convert_alpha() 在加载后使用该方法,以使图像具有每像素透明度
mouse_curse = pygame.image.load(mouse_image_filename).convert_alpha()
while True:
for event in pygame.event.get():
# QUIT来自上述locals中的常量
if event.type == 'QUIT':
sys.exit()
screen.blit(bg, (0,0)) # 设置背景图
x,y = pygame.mouse.get_pos()
x -= mouse_curse.get_width()/2
y -= mouse_curse.get_height()/2
screen.blit(mouse_curse,(x,y)) # 设置鼠标的图
pygame.display.update()
【展示】
HelloWorld图
图形构成:5个圆,上三圆各自有间距,下两圆与上三圆相交叉。
上三圆之间宽度设为10,那么以此为标准下三圆变会绘制的很有规则。
具体看下面代码:
import pygame
import sys
import math
from pygame.locals import *
pygame.display.init()
# 定义五环颜色常量RGB
WHITE = (255,255,255)
BLACK = (0,0,0)
RED = (255,0,0)
BLUE = (0, 0, 255)
GREEN = (0, 255, 0)
YELLOW = (255,255,0)
width,height = 600,500
screen = pygame.display.set_mode((width,height))
pygame.display.set_caption('奥运五环')
clock = pygame.time.Clock()
while True:
clock.tick(10)
for event in pygame.event.get():
if event.type == QUIT:
sys.exit()
screen.fill(WHITE)
'''
左上角坐标(0,0)
在(100,100)位置绘制弧线,这里用的弧线方式绘制圆,
最直接的绘制圆在后面的盾牌会讲解。
arc里面(100,100,100,100)前面两个表示图形中心的位置,后面两个表示椭圆的a与b
那么最大为100,只要稍微缩小点,就不圆了,想绘制一个圆,则只需要范围为(0,2*pi)即可,
后面的数字10表示线宽。
'''
pygame.draw.arc(screen,RED,(100,100,100,100),0,2*math.pi,10)
pygame.draw.arc(screen,BLUE,(210,100,100,100),0,2*math.pi,10)
pygame.draw.arc(screen,BLACK,(320,100,100,100),0,2*math.pi,10)
pygame.draw.arc(screen, YELLOW, (155, 150, 100, 100), 0, 2*math.pi, 10)
pygame.draw.arc(screen, GREEN, (265, 150, 100, 100), 0, 2*math.pi, 10)
# 将图形完整更新到屏幕
pygame.display.flip()
最后就得到了下面的五环图形。
五环图
这个对数学要求略高点,就是在最后计算五角星绘制时候,需要确定如何在圆内绘制五角星呢?
针对这个问题,实际上是先在圆中绘制正五边形的五个顶点,然后这五个顶点进行连线即可得到相应的五角星。
那么如何寻找这五个顶点呢,在pygame中暂时没有找到操作旋转角的方法,这样的话就得用数学公式去推导相应的顶点坐标。
我们按照顺时针假设正五边形的五个顶点,分别为(A,B,C,D,E),那么我们现在的目的很明确,计算五个顶点坐标即可。
对于正五边形放在圆内,它又是有特点的,顶点(五边形的最高点)为上述的A,这个点的横坐标与圆的半径是在同一条竖线上的,那么它的横坐标计算为:圆心距离y坐标轴的距离。纵坐标为A距离x轴的距离。
对于B点与E点,横坐标分别为圆心+上一段距离与圆心减去一段距离。纵坐标一致。
对于C点与D点,方法同B点与E点。
那么怎么来具体计算顶点的不确定坐标,就是通过三角函数及圆半径来计算的,具体的公式会在代码中体现,上述便是本次盾牌绘制中最大难点五角星的绘制思路。
下面来看一下代码实现:
import pygame
import sys
import math
from pygame.locals import *
pygame.display.init()
WHITE = (255,255,255)
BLACK = (0,0,0)
RED = (224,73,70)
BLUE = (17, 90, 153)
GREEN = (0, 255, 0)
YELLOW = (255,255,0)
YIN_WHITE = (224,225,225)
width,height = 600,600
screen = pygame.display.set_mode((width,height))
pygame.display.set_caption('美国队长盾牌')
clock = pygame.time.Clock()
while True:
clock.tick(10)
for event in pygame.event.get():
if event.type == QUIT:
sys.exit()
screen.fill(WHITE)
# 圆绘制
pygame.draw.circle(screen,RED,(300,300),150,20)
pygame.draw.circle(screen,YIN_WHITE,(300,300),130,20)
pygame.draw.circle(screen, RED, (300, 300), 110, 20)
pygame.draw.circle(screen, BLUE, (300, 300), 90, 90)
r=90
A = [300, 210]
B = [300+r*math.sin(2*math.pi/5), 210+r-r*math.cos(2*math.pi/5)]
C = [300+r*math.sin(math.pi/5), 300+r*math.cos(math.pi/5)]
D = [300-r*math.sin(math.pi/5), 300+r*math.cos(math.pi/5)]
E = [300-r*math.sin(2*math.pi/5), 210 + r - r * math.cos(2 * math.pi / 5)]
# 圆内正五变形
# pygame.draw.line(screen, GREEN, A, B, 6)
# pygame.draw.line(screen, GREEN, B, C, 6)
# pygame.draw.line(screen, GREEN, C, D, 6)
# pygame.draw.line(screen, GREEN, D, E, 6)
# pygame.draw.line(screen, GREEN, E, A, 6)
# 绘制五角星
pygame.draw.line(screen, WHITE, A, C, 3)
pygame.draw.line(screen, WHITE, C, E, 3)
pygame.draw.line(screen, WHITE, E, B, 3)
pygame.draw.line(screen, WHITE, B, D, 3)
pygame.draw.line(screen, WHITE, D, A, 3)
pygame.display.flip()
最终结果为:
盾牌图
最后,您如果觉得本公众号对您有帮助,欢迎您多多支持,转发,谢谢! 更多小游戏,请关注本公众号小游戏系列!