day15-面向对象和pygame

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:# 判断关闭按钮点击事件是否发生

  1. 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))# 打印弹起的字符

你可能感兴趣的:(day15-面向对象和pygame)