美文网首页
面向对象和pygame

面向对象和pygame

作者: L丶Y1122 | 来源:发表于2018-11-26 10:08 被阅读0次

1.多继承

  • 多继承就是让一个类同时继承多个类

  • 注意:实际开发一般不使用多继承

class Animal:
    num=61
    def __init__(self,name='小红',age=0,color='黑色'):
        self.name = name
        self.age = age
        self.color = color
    def show_info(self):
        print('名字:%s 年龄:%s 颜色:%s'%(self.name,self.age,self.color))



class Fly:
    info = '飞'
    def __init__(self,distance=0,speed=0):
        self.distance = distance
        self.speed = speed
    @staticmethod
    def show():
        print('飞')
#让birds同时继承Animal,Fly
class Birds(Animal,Fly):
    pass
#两个类的字段都会继承
print(Birds.num,Birds.info)
Birds.show()

#两个类的方法都能继承,对象属性只能继承第一个类的对象属性
b1 = Birds()
print(b1.name)

2.多态

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

封装:可以对多条数据(属性)和多个功能(方法)进行封装
继承:可以让一个类拥有另一个类的属性和方法
多态:有继承就有多态(一个事物的多种形态)

3.运算符重载

3.1.python中函数不支持重载,

3.2.运算符重载

  • python中使用运算符的时候实质实在调用相应的魔法方法(python中每一个运算符都对应一个魔法方法)
    运算符重载:在不同的类中实现同一个运算符对应的魔法方法,来让类的对象支持相应的运算
class Student(object):
    def __init__(self,name='',score=0,age=0):
        self.name=name
        self.score=score
        self.age = age

    #  +  重载
    '''
    数据1 + 数据2 -- 数据1或传给self,数据2会传给other
    '''
    def __add__(self, other):
        #self是+前面的,other是+后面的
        return self.score + other.score
    # - 运算
    def __sub__(self, other):
        #self - other
        return self.score - other.score

    #注意 大于和小雨一般情况下只需要重载一个,另外一个自动支持
    # < 运算
    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('小红',99,18)
stu2 = Student('小花',95,19)
stu3 = Student('小黄',96,18)
stu4 = Student('小蓝',97,19)
print(stu1 + stu2)
print(stu1 - stu2)
all_student = [stu1,stu2,stu3,stu4]
print(all_student)

print(max(all_student))

4.内存管理机制

4.1.堆和栈

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

4.2.数据的存储

a.python中所有的数据都是对象,都是存在堆中的
b.python中所有的变量存储的都是存在堆中的数据的地址。(存了对象地址的变量,又叫对象的引用)
c.默认情况下,创建对象就会在堆中去开辟空间存储数据,并且将地址返回,如果对象是数字或字符串会先做缓存,而且使用的时候会先去缓存中看之前有没有存过,如果有就直接返回之前的数据的地址,如果没有才会开辟新的空间储存

4.3.数据的销毁

python中通过‘垃圾回收机制’来管理内存的释放
原理:看一个对象是否销毁,就看这个对象的引用计数是否为0,为0就销毁,不为0就不销毁
引用计数:对象的引用个数

  • 注意:垃圾回收其实是回收引用计数是0的对象,但系统不会时时刻刻的检测对象的引用计数是否为0
    而是隔一段时间检测一次
from sys import getrefcount
'''
getrefcount(对象)- 获取指定对象的引用计数

4.3.1.增加引用计数 : 使用变量存对象的地址

list1 = [1]   #d对象[1]的引用计数是1
list2 = list1 # 对象[1]的引用计数是2
list3 = [list1,100] #对象[1]的引用计数是3
print(getrefcount(list1))

4.3.2.减少引用计数

a.删除引用
b.让当前对象的引用成为别的对象的引用

5.pygame

5.1游戏的最小系统

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

#创建游戏窗口
'''
set_mode(窗口大小)- 窗口大小是一个元祖。有两个元素:width,height
set_mode((宽度,高度))
宽度和高度的单位是像素
'''
window = pygame.display.set_mode((600,800))
#将窗口填充成指定的颜色
'''
fill(颜色)- fill((r,g,b))
 计算机颜色- 计算机三原色 -红,绿,蓝(RGB)
        颜色值就是由三个数字组成,分别代表红、绿、蓝 数字范围(0-255)
        
python中的颜色是一个元祖,元祖中有三个颜色,分别是 r,g,b
(255.255.255)-白色
(255.0.0)-红色
(0.0.0)-黑色
(0.255.0)-绿色
'''
window.fill((random.randint(0,255)))
#将窗口展示到显示设备上
pygame.display.flip()
#3.创建游戏循环
while True:
    #4.检测事件
    for event in pygame.event.get():
        #区分不同事件,做出不同反应
        pass
        #判断关闭按钮点击事件是否发生
        if event.type == pygame.QUIT:
            exit()#窗口关闭

5.2在窗口显示图片

import pygame
import random

pygame.init()
window = pygame.display.set_mode((1500,800))
window.fill((random.randint(0,255)))

#--========显示图片==========
#1.加载图片
'''
pygame.image.load(图片地址)- 加载指定路径下的图片,返回一个图片对象
'''

image_obj = pygame.image.load('files/27r58PICkj7_1024.jpg')
#2.渲染图片
'''
blit(渲染对象,位置)
渲染对象:图片对象(显示对象)
位置:元祖,(x坐标,y坐标)
'''
# window.blit(new_image2,(100,200))


#3.获取图片大小
'''
图片对象.get_size()- 获取图片大小,返回值是元祖(width,height)
'''
im_w,im_h = image_obj.get_size()

#4.图片缩放和旋转
'''
a.缩放
pygame.transform.scale(图片对象,大小)-将指定图片缩放之指定大小
'''
new_image = pygame.transform.scale(image_obj,(50,20))
# window.blit(new_image,(500,200))

'''
b.旋转缩放
pygame.transform.rotozoom(图片对象,旋转角度,缩放比例)
'''
new_image2 = pygame.transform.rotozoom(image_obj,180,0.5)



window.blit(new_image2,(100,200))

#将窗口展示到显示设备上
pygame.display.flip()
#3.创建游戏循环
while True:
    #4.检测事件
    for event in pygame.event.get():
        #区分不同事件,做出不同反应
        pass
        #判断关闭按钮点击事件是否发生
        if event.type == pygame.QUIT:
            exit()#窗口关闭

5.3显示文字

import pygame
import random

pygame.init()
window = pygame.display.set_mode((800,500))
window.fill((255,255,255))

#--========显示文字==========
#1.创建字体对象(选笔)
'''
a.系统字体
pygame.font.SysFont(字体名,字体大小,是否加粗=False,是否倾斜=False)-返回字体对象
b.自定义字体
'''
font = pygame.font.SysFont('Times',20,True,True)

font1 = pygame.font.Font('files/aa.ttf',20)

#2.根据字体常见文字对象
'''
render(文字内容,是否平滑,文字颜色)
'''
text = font.render('hello pygame',True,(255,0,0))
text1 = font1.render('李毅猪皮',True,(255,0,0))
#3.将文字渲染到窗口上
window.blit(text,(100,100))
window.blit(text1,(300,100))


#将窗口展示到显示设备上
pygame.display.flip()
#3.创建游戏循环
while True:
    #4.检测事件
    for event in pygame.event.get():
        #区分不同事件,做出不同反应
        pass
        #判断关闭按钮点击事件是否发生
        if event.type == pygame.QUIT:
            exit()#窗口关闭

5.4显示图形

import pygame
from color import Color
import math

# 游戏最小系统
pygame.init()
window = pygame.display.set_mode((400, 600))
window.fill((255, 255, 255))

# ======显示图形=========
# 1.画直线
"""
line(画在哪儿, 线的颜色, 起点, 终点, 线宽=1)
"""
pygame.draw.line(window, Color.green, (0, 0), (100, 100), 10)

"""
lines(画在哪儿, 线的颜色, 是否闭合, 点列表, 线宽=1)
依次连接点列表中所有的点(是否闭合决定是否连接起点和终点)
"""
points = [(10, 10), (100, 70), (100, 170), (40, 230), (40, 320)]
pygame.draw.lines(window, Color.red, True, points, 5)

# 2.画圆
"""
circle(画在哪儿, 颜色, 圆心坐标, 半径, 线宽=0)
注意:线宽为0的时候画实心圆
"""
pygame.draw.circle(window, Color.yellow, (100, 100), 80, 3)

# 3.画弧线
"""
arc(画在哪儿,颜色,矩形(Rect),起始弧度,终止弧度,线宽=1)
矩形 - (x, y, width, height); x,y是矩形坐上角的坐标,width,height是矩形的宽高
"""
pygame.draw.arc(window, Color.blue, (150, 300, 50, 100), 0, math.pi, 10)


pygame.display.flip()

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            exit()

5.5事件和动画

import pygame
from color import Color

pygame.init()
window = pygame.display.set_mode((400, 600))
window.fill((255, 255, 255))

# 在这儿写的代码是静态的(界面上的内容)
x = 100
y = 100
width = 100
height = 80
pygame.draw.rect(window, Color.green, (x, y, width, height))

pygame.display.flip()

while True:

    y += 3
    # width -= 2
    window.fill(Color.white)  # 覆盖原来的状态
    pygame.draw.rect(window, Color.rand_color(), (x, y, width, height))
    pygame.display.update()   # 重新显示

    # 有事件产生的时候才会进入for循环
    for event in pygame.event.get():
        # 1.type属性
        """
        不同的type值对应不同类型的事件
        QUIT - 关闭按钮被点击事件
        
        a.鼠标相关事件  -  按的位置
        MOUSEMOTION - 鼠标移动
        MOUSEBUTTONDOWN - 鼠标按下
        MOUSEBUTTOUP - 鼠标弹起
        
        event.pos - 获取鼠标事件产生的位置
        
        b.键盘事件 - 按的是哪个键
        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()
            pass
        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('按键弹起')
            print(event.key, chr(event.key))

相关文章

  • 面向对象和pygame

    一.类的继承 python中类支持继承,并且支持多继承 1.什么是继承 父类(超类):被继承的类子类:去继承父类的...

  • 面向对象和pygame

    类的继承 类的继承 重写 添加属性 运算符的重载 内存机制 认识pygame

  • 面向对象和pygame

    1.多继承 多继承就是让一个类同时继承多个类 注意:实际开发一般不使用多继承 2.多态 类的特点:封装,继承,多态...

  • python 面向对象和pygame

    一、类的继承 python中类支持继承,并且支持多继承 1.什么是继承父类(超类):被继承的类子类:去继承父类的类...

  • pygame 模块进行简单游戏开发-----飞机大战

    学习目标 强化 面向对象 程序设计 体验使用 pygame 模块进行 游戏开发 安装 pygame 验证安装 1....

  • 16总 面向对象和pygame

    1.复习: 1.静态方法和类方法、对象方法: 对象方法: a.直接声明在类中b.自带的self参数c.对象来调用d...

  • Python基础 - 面向对象和pygame

    知识回顾 1.静态方法和类方法、对象方法 对象方法:直接声明在类中自带的self参数对象来调用实现函数的功能需要用...

  • Python:飞机大战游戏1:前期准备

    一、目标 强化 面向对象 程序设计 体验使用 pygame 模块进行 游戏开发 二、pygame 模块介绍以及的安...

  • 046_wz_hm_项目实战——飞机大战之游戏窗口

    目标 强化面向对象程序设计 体验使用pygame模块进行游戏开发 实战步骤 pygame快速体验 飞机大战实战 p...

  • Day16-面向对象和pygame

    02-类的继承 python中类支持继承,并且支持多继承 1.什么是继承 父类(超类):被继承的类子类:去继承父类...

网友评论

      本文标题:面向对象和pygame

      本文链接:https://www.haomeiwen.com/subject/sbmvqqtx.html