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()
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,366评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,521评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,689评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,925评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,942评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,727评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,447评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,349评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,820评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,990评论 3 337
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,127评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,812评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,471评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,017评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,142评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,388评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,066评论 2 355

推荐阅读更多精彩内容

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