day15 面向对象操作和pygame

2018-11-23  本文已影响0人  遇见那天的雨真大

1. 面向对象

1.多继承.

多继承:让一个类继承多个类
对象属性只能继承第一个类的对象属性,实际开发中不用

class Aianmal:
    num = 00000
    def __init__(self,name,age,color):
        self.name = name
        self.age = age
        self.color = color
    def show_info(self):
        print("=====")
        print("名字:%s,年龄:%s,颜色:%s"%(self.name,self.age,self.color))

class Fly:
    info= 00
    def __init__(self,distance = 0,speed = 0):
        self.distance = distance
        self.speed = speed

    @staticmethod
    def show():
        print("会飞")

class Bird(Aianmal,Fly):
    pass
print(Bird.num,Bird.info)
Bird.show()
bird1 = Bird("lorry",20,"yellow")
print(bird1.age)
bird1.show_info()
bird1.show()

2.多态:封装,继承,多态

类的特点:封装,继承,多态

3.重载

1.别的语言重载
c++/java声明函数的语法

返回值类型 函数名(参数类型1,参数名1,参数类型2,参数名2){
            函数体
            }
int func1{  
}
void func1(int a){
}
void func1(chart a){
}
void func1(int a,int b){
}

上面这四个函数是不同的函数(可以同时存在)

def func1()
    pass
def func2()
    pass
def func3()
    pass

python中最终只保留最后一个func1,前面的会覆盖
2.运算符重载
python中使用运算符的时候,实质是在调用相应的魔法方法(python中每个运算符都对应一个魔法方法)
运算符重载:在不同的数据类中,实现同一个运算符对应的魔法方法,来让相应的类的对象支持相应的运算
注意>和<一般只是需要重载一个,另外一个会自动取反

class Student:
    def __init__(self,name,score,age):
        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.age - other.age
    def __lt__(self, other):
        return self.score < other.score
    def __gt__(self, other):
        return self.age < other.age
    def __repr__(self):
        return ">"+str(self.__dict__)[1:-1] +"<"
    
stu1 = Student("小花",90,218)
stu2 = Student("小狗",50,22)
stu3 = Student("啊啊啊啊",72,23)
stu4 = Student("mlxg",00,22)
print(stu1+stu2)
print(stu1-stu2)
all_student = [stu1,stu2,stu3,stu4]   #比较大小
all_student2 = [stu1,stu2,stu3,stu4]
print(all_student)
print(all_student2)

4.内存管理

1.堆和栈

内存区中分堆区间和栈区间:栈区间的内存的开辟和释放是自动的,堆区间的内存是手动释放和开辟。内存管理是堆区间的内存

2.数据的存储
3.数据的销毁

python通过垃圾回收机制来管理内存的释放,java,c++等语言也是使用的垃圾回收机制
原理:看一个对象是否销毁,就看这个对象的引用计数是否为0,为0就销毁,不为0就不销毁。
引用计数:对象引用的引用个数(几个变量在村)
导入模块:from sys impot getrefcount
注意:垃圾回收其实就是回收引用计数为0的对象,但是系统不会时时刻刻的检测对象的引用计数是否为0,而是每隔一段时间检测一次,如果检测到垃圾就回收

from sys import getrefcount
# 1.增加引用计数:使用变量存对象的地址
list1 = [1]  #对象[1]引用计数是1.
print(getrefcount(list1))
list2 = list1  #对象[1]引用计数是2
print(getrefcount(list1))
list3= [list1,100] #对象[1]引用计数是3
print(getrefcount(list1))
# 2.减少引用计数:
"""
a.删除引用
b.让当前对象的引用成为别的对象引用
"""
del list3[0]
print(getrefcount(list1))
list2 = 100
print(getrefcount(list1))
print(getrefcount(100))

2.pygame

1.pygame最小系统

import pygame
# 1.游戏初始化
pygame.init()

# 2.创建游戏窗口
"""
set_model(窗口的大小) - 值是元组 (分别是宽度和高度的)
宽度和高度的单位是像素(px)
"""
window = pygame.display.set_mode((400,600))
#将窗口填充成颜色fill(颜色)
window.fill((255,199,206))
pygame.display.flip()  #将窗口展示到屏幕上
"""
计算机的三原色:红绿蓝(rgb)(r,g,b)
颜色值就是三个数字组成(0-255)
python中的颜色是一个元组,元组中是有三个颜色,分别是r,g,b
白色:(255,255,255)
黑色:(0,0,0)
红色  (255,0,0)
绿色  (0,255,0)
"""
# 3.创建循环
while True:
    #4.不断的检测事件的发生
    for event in pygame.event.get():
        #区分不同的事件,做出不一样的反应
        #判断关闭按钮是否被关机
        if event.type == pygame.QUIT:
            exit()

2.pygame图片操作

操作方法:
1.pygame.image.load("1407836432.jpg")
2.inmage_obj.get_size() 获取图片像素
3.pygame.transform.scale(inmage_obj,(200,350)) 调整图片大小
4.pygame.transform.rotozoom(inmage_obj,180,1.1)
a.缩放
pygame.transform.scale(图片对象,大小) - 将指定的图片缩放到指定的大小
返回新的图片对象
b.pygame.transform.rotozoom(图片对象,旋转角度,缩放比例)

import pygame
pygame.init()
window = pygame.display.set_mode((600,900))
window.fill((255,199,206))

#显示图片
#1.加载图片
inmage_obj = pygame.image.load("1407836432.jpg")
inmage_obj2 = pygame.image.load("1470198196.jpg")
# 打开指定位置的图片

#2.渲染图片
"""
blit(渲染对象,位置)
渲染对象 - 图片对象(显示什么)
"""
#3.获取图片代销
"""
图片对象。get_size - 获取图片大小
"""
image_w,image_h = inmage_obj.get_size()
inmage_obj = pygame.transform.rotozoom(inmage_obj,180,1.1)
window.blit(inmage_obj,((400-image_w)/2,(600-image_h)/2))
inmage_obj = pygame.transform.scale(inmage_obj,(200,350))
window.blit(inmage_obj,(100,200))

#4.图片缩放
"""
a.缩放
pygame.transform.scale(图片对象,大小) - 将指定的图片缩放到指定的大小
返回新的图片对象
b.pygame.transform.rotozoom(图片对象,旋转角度,缩放比例)
"""
pygame.display.flip()
while True:
    for event in  pygame.event.get():
        if event.type == pygame.QUIT:
            exit()

3.图形显示

几种形状的画法:
1.直线:line(画在哪儿,线的颜色,起点,终点,线宽)
pygame.draw.line(window,Color.red,(0,0),(200,200),10)
2.线段:lines(画在哪儿,线的颜色,是否闭合,点列表,线宽)
point = [(200,300),(150,350),(125,400),(150,450),(190,500)]
pygame.draw.lines(window,Color.black,False,point,20)
依次链接点列表中所有的点(是否闭合决定是否连接起点和终点)
3.圆:circle(画在哪儿,颜色,圆心坐标,半径,)
注意:线宽为0的时候画实心圆
pygame.draw.circle(window,Color.white,(150,200),80,3)
4.画弧线:arc(画在哪儿,颜色,矩形,起始弧度,终止弧度,线宽 = 1)
pygame.draw.arc(window,Color.blue,(150,300,200,350),0,math.pi,10)
矩形 - (x,y,width,heigth)x,y是矩形左上角的坐标,width,heigth是矩形的长宽
5.椭圆:ellipse(画在哪儿, 颜色,矩形, width=0)
pygame.draw.ellipse(window,Color.red,(10,250,200,350),10)
矩形 - (x,y,width,heigth)x,y是矩形左上角的坐标,width,heigth是矩形的长宽

# author_lorry   
# date: 2018/11/23
import pygame
import math
from color import Color
window = pygame.display.set_mode((500,600))
window.fill((255,199,206))
pygame.draw.line(window,Color.red,(0,0),(200,200),10)
point = [(200,300),(150,350),(125,400),(150,450),(190,500)]
pygame.draw.lines(window,Color.black,False,point,20)
pygame.draw.circle(window,Color.white,(150,200),80,3)
pygame.draw.circle(window,Color.red,(250,200),80,3)
pygame.draw.circle(window,Color.green,(350,200),80,3)
pygame.draw.circle(window,Color.white,(200,300),80,3)
pygame.draw.circle(window,Color.white,(300,300),80,3)
pygame.draw.arc(window,Color.blue,(150,300,200,350),0,math.pi,10)
pygame.draw.ellipse(window,Color.red,(10,250,200,350),10)
pygame.display.flip()
while True:
    for event in  pygame.event.get():
        if event.type == pygame.QUIT:
            exit()

4.显示文字

a.系统字体pygame.font.SysFont(字体名,字体大小,是否加粗 =False,是否倾斜 = False)``font = pygame.font.SysFont("Times",90)添加文字:font.render(文字内容,是否平滑,文字颜色)将文字渲染到窗口上window.blit(text,(300,300))```

b.自定义字体pygame.font.Font(字体文件路径,字体大小)
font1 = pygame.font.Font("aa.ttf",90)
text1 = font1.render("我爱❤你,亲爱的菇凉",True,(255,0,0))
将文字渲染到窗口上
window.blit(text1,(200,400))

import pygame
pygame.init()
window = pygame.display.set_mode((1400,750))
window.fill((255,199,206))
font = pygame.font.SysFont("Times",90)
font1 = pygame.font.Font("aa.ttf",90)
text = font.render("L'O'V U",True,(255,0,0))
window.blit(text,(300,300))
text1 = font1.render("我爱❤你,亲爱的菇凉",True,(255,0,0))
window.blit(text1,(200,400))
pygame.display.flip()
while True:
    for event in  pygame.event.get():
        if event.type == pygame.QUIT:
            exit()

5.游戏事件

不同的type值对应不同类型的事件
QUIT - 关闭按钮被点击
a.鼠标相关事件
MOUSEMOTION - (鼠标移动)
MOUSEBUTTONUP 鼠标弹起
MOUSEBUTTONDOWN - 鼠标按下
"鼠标弹起",event.pos
b.键盘事件 - 按得是哪个键
KEYDOWN 键盘按下
KEYUP 键盘弹起
event.key - 被按得键对应的字符的编码值

上一篇 下一篇

猜你喜欢

热点阅读