本文主要是介绍Pygame学习笔记5:位图图形和Orbiting Spaceship,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
使用位图
前面一直使用的如下代码:
screen = pygame.display.set_mode((600, 500))
screen是一个surface对象,在pygame中,一个位图就是一个surface
那么接下来就是慢慢开始使用位图。
加载位图
从网上找一张星空的图片,然后根据图片的大小进行加载,源代码如下:
import sys
import pygame
from pygame.locals import *pygame.init()
screen = pygame.display.set_mode((800, 600))
pygame.display.set_caption("Orbit Demo")space = pygame.image.load("space.png").convert()while True:for event in pygame.event.get():if event.type == QUIT:sys.exit()keys = pygame.key.get_pressed()if keys[K_ESCAPE]:sys.exit()screen.blit(space, (0, 0))pygame.display.update()
注意如下代码:
space = pygame.image.load("space.jpg").convert()
使用convert()函数将位图转换成程序窗口的本地颜色深度,以此作为一种优化,这基本是一种必需的做法,因为若在一开始加载的时候没有转换,则每次绘制的时候都要进行转换,代价比较大。
运行结果如下:
绘制行星
然后添加上如下代码:
planet = pygame.image.load("planet2.png").convert_alpha()width, height = planet.get_size()
screen.blit(planet, (400 - width / 2, 300 - height / 2))
其中,convert_alpha()函数的作用和前面的convert()类似,而前者的作用则是加载必须使用透明方式绘制的前景对象。Surface.get_size()可以获取位图的宽度和高度,也可以通过Surface.get_width()和Surface.get_height()来获取宽度和高度。
运行结果如下:
可以看到,中间已经出现了一个行星
绘制飞船
添加以下代码:
ship = pygame.image.load("freelance.png").convert_alpha()width, height = ship.get_size()
# //表示取整除法
ship = pygame.transform.scale(ship, (width // 2, height // 2))screen.blit(ship, (50, 50))
其中,因为飞船图片比较大,因此使用pygame.transform.scale()函数对其进行放缩,缩小了一半。当然,也可以用另一种更好的放缩函数:
ship = pygame.transform.smoothscale(ship, (width // 2, height // 2))
以上函数的放缩效果会更好一点。
运行结果如下:
可以看到飞船在左上角
环绕行星轨道
最终的代码如下:
import sys
import math
import pygame
from pygame.locals import *class Point(object):def __init__(self, x, y):self.__x = xself.__y = ydef getx(self):return self.__xdef setx(self, x):self.__x = xdef gety(self):return self.__ydef sety(self, y):self.__y = yy = property(gety, sety)x = property(getx, setx)def __str__(self):return "{X:" + "{:.0f}".format(self.__x) + ",Y:" + "{:.0f}".format(self.__y) + "}"def print_text(font, x, y, text, color=(255, 255, 255), shadow=True):imgText = font.render(text, True, color)screen.blit(imgText, (x, y))def wrap_angle(angle):return angle % 360if __name__ == "__main__":pygame.init()screen = pygame.display.set_mode((800, 600))pygame.display.set_caption("Orbit Demo")font = pygame.font.Font(None, 18)space = pygame.image.load("space.png").convert()planet = pygame.image.load("planet2.png").convert_alpha()ship = pygame.image.load("freelance.png").convert_alpha()width, height = ship.get_size()# //表示取整除法# ship = pygame.transform.scale(ship, (width // 2, height // 2))ship = pygame.transform.smoothscale(ship, (width // 2, height // 2))radius = 250angle = 0.0pos = Point(0, 0)old_pos = Point(0, 0)while True:for event in pygame.event.get():if event.type == QUIT:sys.exit()keys = pygame.key.get_pressed()if keys[K_ESCAPE]:sys.exit()# 填充星空背景screen.blit(space, (0, 0))# 填充行星width, height = planet.get_size()screen.blit(planet, (400 - width / 2, 300 - height / 2))# 确定旋转飞船的位置angle = wrap_angle(angle - 0.1)pos.x = radius * math.cos(math.radians(angle))pos.y = radius * math.sin(math.radians(angle))# 使用pygame.transform.rotate()函数将飞船旋转这么多角度delta_x = pos.x - old_pos.xdelta_y = pos.y - old_pos.yrangle = math.atan2(delta_y, delta_x)rangled = wrap_angle(-math.degrees(rangle))scratch_ship = pygame.transform.rotate(ship, rangled)# 绘制飞船width, height = scratch_ship.get_size()x = 400 + pos.x - width // 2y = 400 + pos.y - width // 2screen.blit(scratch_ship, (x, y))# 输出相关信息print_text(font, 0, 0, "Orbit:" + "{:.0f}".format(angle))print_text(font, 0, 20, "Rotation:" + "{:.2f}".format(rangle))print_text(font, 0, 40, "Position:" + str(pos))print_text(font, 0, 60, "Old Pos:" + str(old_pos))pygame.display.update()# 保留之前的位置old_pos.x = pos.xold_pos.y = pos.y
运行结果如下:
任务一:让程序可以通过按下向上键或者向下键实现飞船速度加快或者减慢
方法很简单,就是将原本的加一个常数改成加一个变量,然后根据按键更改变量的值即可:
# 加上这条语句方便可以一直按着键盘不松
pygame.key.set_repeat(10)# 用于控制速度变化
speed = 0.1
if keys[K_UP]:speed += 0.01
elif keys[K_DOWN]:speed -= 0.01
以上代码即可实现飞船速度的加快或减慢
这篇关于Pygame学习笔记5:位图图形和Orbiting Spaceship的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!