day15-面向对象和pygame

1.多继承

多继承:就是让一个类同时继承多个类
两个类的字段都能继承
两个类的方法都能继承
对象属性只能继承第一个类的对象属性

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

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

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

2.运算符重载

1.别的语言的函数和函数的重载
C++/java声明函数的语法:
返回值类型 函数名(参数类型1 参数名1, 参数类型2 参数名2){
函数体
}

int func1(){

}
void func1(int a){

}
void func1(int a, int b){

}
int func1(int a, int b){

}
这四个函数时不同的函数(可以同时存在)
python中的函数不支持重载
def func1():
pass

def func1(a):
pass

def func1(a, b):
pass
最终只有最后这一个func1,前面的会被覆盖

2.运算符重载
python中使用运算符的时候,实质是在调用相应的魔法方法。
(python中每个运算符都对应一个魔法方法)
运算符重载:在不同的类中实现同一个运算符对应的魔法方法,来让类的对象支持相应的运算

class Student:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __add__(self, other):
        return self.age + other.age

    def __sub__(self, other):
        return self.age - other.age

    # >,<只需要重载一个,另外一个自动支持
    def __lt__(self, other):
        return self.age < self.age

    def __repr__(self):
        return str(self.__dict__)[1:-1]


stu1 = Student('小明', 18)
stu2 = Student('小红', 20)
print(stu1 + stu2)
print(stu1 - 5)
list_stu = [stu1, stu2]
list_stu.sort()
print(list_stu)

3.内存管理机制

1.堆和栈
内存区域分堆区间和栈区间;栈区间的内存的开辟和释放是自动的,堆区间的内存是手动开辟和释放
内存管理管理的是堆区间的内存

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

3.数据的销毁
python中通过垃圾回收机制来管理内存的释放
原理:看一个对象释放销毁就看这个对象的引用计数释放为0,为0就销毁
引用计数:对象的引用个数
getrefcount(对象) - 获取对象的引用计数
注意:垃圾回收机制其实就是回收引用计数是0的对象,但是系统不会时时刻刻的检测对象的引用计数释放为0,
而是隔一段时间检测一次,如果检测到垃圾就回收

循环引用:Python中会自动销毁,

from sys import getrefcount
# 1.增加引用计数:使用变量存对象的地址
list1 = [1]  # 对象[1]的引用计数是1
print(getrefcount(list1))
list2 = list1  # 对象[1]的引用计数是2
print(getrefcount(list1))
list3 = [list1, 10]  # 对象[1]的引用计数是3
print(getrefcount(list1))  # 这个函数引用时自动加1,结束后自动减1

2.减少引用计数

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

print('-----------')
del list3[0]
print(getrefcount(list1))

list2 = 100
print(getrefcount(list1))

print(getrefcount(100))

4.游戏的最小系统

import pygame

1.游戏初始化

pygame.init()

2.创建游戏窗口

set_mode(宽度,高度) - 窗口大小是一个元组,有两个元素:width,height
单位是像素

window = pygame.display.set_mode((400, 600))

将窗口填充成指定的颜色

fill(颜色) - fill((r, g, b)) - python中的颜色是一个元组
计算机颜色:计算机三原色 - 红、绿、蓝(rgb)
颜色值就是由三个数字组成,分别代表红、绿、蓝(rgb),数字范围是:0 - 255
(255, 255, 255) - 白色
(0, 0, 0) - 黑色
(255, 0, 0) - 红色
(0, 255, 0) - 绿色
(0, 0, 255) - 蓝色

window.fill((150, 50, 50))

将窗口展示到屏幕上

pygame.display.flip()

3.创建游戏循环(死循环)

while True:
    # 4.检测事件
    for event in pygame.event.get():
        # 1.区分不同的事件,做出不一样的反应
        # 判断关闭按钮点击事件是否发生
        if event.type == pygame.QUIT:
            exit()

5.在窗口上显示图片

import pygame
pygame.init()

显示图片

1.加载图片

pygame.image.load(图片地址) - 加载指定路径下的图片返回一个图片对象

image_obj = pygame.image.load('基洛夫.jpg')
image_w, image_h = image_obj.get_size()
window = pygame.display.set_mode((800, 600))
window.fill((255, 255, 255))

2.渲染图片

blit(渲染对象, 渲染位置)
渲染对象 - 图片对象(显示什么)
渲染位置 - 元组,(x, y)

window.blit(image_obj, (200, 200))

3.获取图片的大小

图片对象.get_size() - 获取图片大小,返回值是一个元组,(width,height)

4.图片缩放和旋转

a.缩放
pygame.transform.scale(图片对象. 大小) - 将指定的图片缩放到指定的大小

new_image = pygame.transform.scale(image_obj, (100, 250))
# window.blit(new_image, (10, 300))

b.旋转缩放
pygame.transform.rotozoom(图片对象, 旋转角度, 缩放比例)

new_image1 = pygame.transform.rotozoom(image_obj, 0, 0.5)
window.blit(new_image1, (0, 0))

pygame.display.flip()

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

6.在窗口上显示文字

import pygame
pygame.init()

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

显示文字

1.创建字体对象

a.系统字体
pygame.font.SysFont(字体名, 字体大小, bold(是否加粗)=False, italic(是否倾斜)=False) - 返回字体对象
bold=False, italic=False
b.自定义字体
pygame.font.Font(字体文件路径, 字体大小)

font1 = pygame.font.SysFont('Times', 50, bold=True, italic=True)
# font1 = pygame.font.Font('aa.ttf', 50)

2.根据字体创建文字对象

render(文字内容, 是否平滑, 文字颜色)

text = font1.render('hello pygame, 你好!', True, (255, 0, 0))

3.将文字渲染到窗口上

window.blit(text, (150, 100))

pygame.display.flip()

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

7.显示图形

import pygame
from color import Color
import math

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

显示图形

1.画直线
line(画在哪里, 线的颜色, 起点, 终点, 线宽=1)

pygame.draw.line(window, Color.green, (0, 0), (100, 100), 10)

lines(画在哪里, 线的颜色, 是否闭合, 点列表, 线宽)
依次连接点列表中所有的点,是否闭合决定是否连接起点和终点

points = [(110, 160), (150, 110), (200, 200), (500, 400), (300, 300)]
pygame.draw.lines(window, Color.green, False, points)

2.画圆

circle(画在哪里, 线的颜色, 圆心坐标, 半径, 线宽=0)

pygame.draw.circle(window, Color.red, (600, 200), 100, 1)

3.画弧线

arc(画在哪里, 线的颜色, 矩形, 起始弧度, 终止弧度, 线宽=1)
矩形 - (x, y, width, height) x,y决定矩形左上角的坐标,后面决定矩形的宽和高

pygame.draw.arc(window, Color.red, (10, 300, 200, 200), math.pi/4*5, math.pi/4*7)

4.画椭圆

ellipse(画在哪里, 线的颜色, 矩形, 线宽=0)

pygame.draw.ellipse(window, Color.red, (280, 400, 200, 100), 1)

5.画多边形

polygon(画在哪里, 线的颜色, 点列表, 线宽=0)

points1 = [(50, 100), (50, 200), (80, 300), (200, 200), (150, 50)]
pygame.draw.polygon(window, Color.black, points1, 1)

6.画矩形

rect(画在哪里, 线的颜色, 矩形, 线宽=0)

pygame.draw.rect(window, Color.black, (250, 250, 100, 100), 1)

pygame.display.flip()

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            exit()
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 原文链接:http://blog.zhaiyifan.cn/2016/08/04/android-new-proj...
    MarkZhai阅读 5,782评论 5 32
  • 每当听到歌曲“老榆树”就想起小时候家乡门前的那棵老榆树。 不知道从什么时候起,家门前面左边,离墙不远处出了一颗小榆...
    高崖小秦阅读 3,931评论 0 5
  • 跟同学丁露琼步廖廓山浅淡人生有感 文/张瑕 一点惮机悟缘由,世俗常态皆因果。 生前困扰是空灵,心若止水无忧愁...
    清倾红尘阅读 3,978评论 1 3

友情链接更多精彩内容