1 多继承
1.1 多继承
多继承:让一个类同时继承多个类。
实际开发的时候,一般不使用多继承。
多继承时,所有父类的字段、方法都能继承;但对象的属性只能继承第一个类的对象属性。
1.2 多态
类的特点:封装、继承、多态
封装(函数、模块、类,多态):
封装:可以对多条数据(属性)和多个功能(方法)封装在一起。
继承:可以让一个类拥有另外一个类的属性和方法
多态:有继承就有多态(一个事物的多种形态)
2 运算符重载
python中的函数不支持重载;因为重载函数,函数名相同,前面声明的函数在python中会被后面的覆盖。
2.1 运算符重载
1.python中使用运算符的时候,实质是在调用相应的魔法方法。(python中每个运算符都对应一个魔法方法);
2.运算符重载:在不同的类中,实现同一个运算符对应的魔法方法,来让类的对象支持相应的运算。
class Student(object):
def __init__(self,name='',score=0,age=0):
self.name=name
self.score=score
self.age=age
# + 重载
def __add__(self, other):
# self+other
return self.score+other.score # 加成绩
# -减法重载
def __sub__(self, other):
return self.score-other
# <重载 >和<一般情况下只需要重载一个,另外一个会自带支持
# 比较成绩
def __lt__(self, other):
return self.score运算:比较年龄
def __gt__(self, other):
return self.age>other.age
3 内存管理机制
3.1 堆和栈
内存区域中分堆区间和栈区间;栈区间的内存的开辟和释放是自动的,堆区间的内存是手动释放的;
内存管理管理的是堆区间的内存;
3.2 数据的存储
1.python中所有的数据都是对象,都是保存在堆中的
2.python中所有的变量存储的都是存在堆中的数据的地址。存了对象的地址的变量又叫对象的引用
3.默认情况下创建对象就会在堆中去开辟空间存储数据,并且将地址返回;
如果对象是数字或者字符串会做缓存,而且使用的时候会先去看缓存中看之前有没有存过,如果有就直接返回之前的数据的地址,没有才开辟新的空间存储数据.
3.3数据的销毁
python中通过'垃圾回收机制'来管理内存的释放
原理:看一个对象是否销毁,就看这个对象的引用计数是否为0。为0就销毁,不为0就不销毁。
引用计数:对象的引用个数
注意:垃圾回收其实就是回收引用计数是0的对象,但是系统不会时时刻刻的检测对象的引用计数是否是0;而是隔一段时间检测一次,如果检测到垃圾就回收。
getrefcount(对象):获取指定对象的引用计数;由于在获取时,会用对象传参,故会比实际的引用多一次。
增加引用计数:使用变量存对象的地址。
删除引用:让当前对象的引用成为别的引用
4 游戏最小系统
4.1 游戏最小系统
import pygame
pygame.init()
window=pygame.display.set_mode((400,600))
window.fill((200,200,50))
pygame.display.flip()
while True:
for event in pygame.event.get():
if event.type==pygame.QUIT:
exit()
4.2 各个语句的意义
1.pygame.init() # 1.游戏初始化
2.window=pygame.display.set_mode((400,600)) #2.创建游戏窗口
说明:display:访问显示器
set_mode(窗口大小)- 窗口大小是一个元祖,有两个元素:width,height
set_mode((宽度,高度))
宽度和高度的单位是像素
3.window.fill((200,200,50)) # 将窗口填充成指定的颜色。
fill(颜色) - fill((r,g,b))
计算机颜色:计算机三原色 - 红,绿,蓝(RGB)
颜色值就是由三个数字组成,分别代表红,绿,蓝,数字范围是:0~255
python中的颜色是一个元祖,元祖中有三个颜色,颜色分别是r,g,b
(255,255,255) - 白色
(0,0,0) - 黑色
(255,0,0)-红色
(0,255,0)- 绿
4.pygame.display.flip() # 将窗口展示到显示设备上,窗口每做一次调整,就需要重新显示一次。
5.while True: # 3.创建游戏循环
6.for event in pygame.event.get(): # 4.检测事件
7.if event.type==pygame.QUIT:# 判断关闭按钮点击事件是否发生
- exit() # 退出游戏界面。
5 窗口上显示图片
5.1 加载图片
pygame.image.load(图片地址) - 加载指定路径下的图片,返回一个图片对象
image_obj=pygame.image.load('file/pic.jpg')
window.blit(image_obj,(0,0))
5.2 渲染图片
blit(渲染对象,渲染位置)
渲染对象 - 图片对象(显示什么)
位置 - 元祖,(x,y) 图片的位置都是左上角的坐标。
5.3 获取图片的大小
图片对象.get_size()- 获取图片大小,返回值是一个元祖:(width,height)
image_w,image_h=image_obj.get_size()
window.blit(image_obj, ((400-image_w)/2, (600-image_h)/2)) # 图片放到正中位置
print(image_obj.get_size()) # 查看原图片的大小
5.4 图片缩放和旋转
5.4.1缩放
pygame.transform.scale(图片对象,大小) - 将指定的图片缩放到指定的大小
new_image=pygame.transform.scale(image_obj,(50,150))
window.blit(new_image,(0,110))
5.4.2 旋转缩放
pygame.transform.rotozoom(图片对象,旋转角度,缩放比例)。
new_image2=pygame.transform.rotozoom(image_obj,0,0.5)
window.blit(new_image2,(0,270))
new_image3=pygame.transform.rotozoom(image_obj,45,1.5)
window.blit(new_image3,(0,330))
5.4.3旋转
rotate(Surface, angle) Surface:旋转对象, angle:旋转角度
new_image = pygame.transform.rotate(image, 270)
6 在窗口上显示文字
6.1 创建字体对象(选笔)
6.1.1系统字体
pygame.font.SysFont(字体名,字体大小,是否加粗=False,是否倾斜=False)- 返回字体对象
font=pygame.font.SysFont('Times',20,italic=True) # 系统字体
6.1.2自定义字体
pygame.font.Font(字体文件路劲,字体大小)
font1=pygame.font.Font('file/aa.ttf',40) # 自定义文字
6.2 根据字体创建文字对象
render(文字内容,是否平滑,文字颜色)
text1=font1.render('hello pygame 你好',True,(255,0,0))
6.3 将文字渲染到窗口上
window.blit(text1,(50,300))
7显示图像
所有线宽可以为0的,表示都可以对其进行填充颜色。
7.1 画直线
7.1.1 line
line(画在哪儿,线的颜色,起点,终点,线宽)
pygame.draw.line(window,(0,255,0),(0,0),(100,100),10)#绿色线条
pygame.draw.line(window,Color.green,(0,0),(100,100)) # 从color模块中导入绿色字段
7.1.2 lines
lines(画在哪儿,线的颜色,是否闭合,点列表,线宽=1)
依次连接点列表中所有的点(是否闭合决定是否连接起点和终点)
points=[(10,10),(100,70),(100,170),(40,230),(40,320)]
pygame.draw.lines(window,Color.red,True,points)
7.2 画圆
circle(画在哪儿,颜色,圆心坐标,半径,线宽=0)
注意:线宽为0的时候画实心圆
pygame.draw.circle(window,Color.yellow,(100,100),80,3)
7.3 画弧线
arc(画在哪儿,颜色,矩形,起始弧度,终止弧度,线宽=1)
矩形 - (x,y,width,height)x,y是矩形左上角的坐标,width,height是矩形的宽高
pygame.draw.arc(window,Color.blue,(150,300,200,100),math.pi/4*5,math.pi/4*7,2)
7.4画椭圆
ellipse(画在哪儿,颜色,矩形,线宽)
pygame.draw.ellipse(window,Color.green,(200,350,150,100),0)
7.5 画多边形
polygon(画在哪儿,颜色,点,线宽)
list1=[(100,100),(230,250),(350,400),(120,300),(200,500)]
pygame.draw.polygon(window,Color.green,list1,0)
7.6 画矩形
rect(画在哪儿,颜色,(x,y,宽,高),线宽)
pygame.draw.rect(window,Color.green,(100,500,50,80),0)
8事件和动画
动画效果都是通过覆盖原来的效果,并向下移动实现的。
如将一个矩形向下移动,实现方式为:
while True:
y+=1 # 移动的速度
window.fill(Color.white) # 覆盖原来的状态
pygame.draw.rect(window,Color.green,(x,y,width,height))
pygame.display.update() # 重新显示。每次改变了页面的状态,都要重新显示
8.1事件
所有的事件处理的入口就是这个for循环,for循环中代码只有游戏事件发生后才会执行。
不同的type值对应不同类型的事件。
QUIT事件-关闭按钮被点击事件。
8.1.1.鼠标相关事件
MOUSEMOTION-鼠标移动
MOUSEBUTTONDOWN-鼠标按下
MOUSEBUTTONUP-鼠标弹起
event.pos-获取鼠标事件产生的位置.
8.1.2键盘事件 - 按的是哪个键
KEYDOWN-键盘按下
KEYUP-按键弹起
event.key - 被按的键对应的字符的编码值
if event.type == pygame.QUIT:
exit()
elif event.type==pygame.MOUSEMOTION:
print('鼠标移动',event.pos)
pygame.draw.circle(window, Color.rand_color(), event.pos, 30) # 鼠标移动的地方画圆
pygame.display.flip()
elif event.type==pygame.MOUSEBUTTONDOWN:
print('鼠标按下',event.pos)
pygame.draw.circle(window, Color.rand_color(), event.pos, 30)
pygame.display.flip()
elif event.type==pygame.MOUSEBUTTONUP:
print('鼠标弹起',event.pos)
elif event.type==pygame.KEYDOWN:
print('按键按下')
print(event.key,chr(event.key)) # 打印按下的字符
elif event.type==pygame.KEYUP:
print('按键弹起',chr(event.key))# 打印弹起的字符