美文网首页
day15-面向对象和pygame

day15-面向对象和pygame

作者: 杨海py | 来源:发表于2018-11-24 10:52 被阅读0次

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()

相关文章

  • day15-面向对象和pygame

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

  • day15-面向对象和pygame

    多继承多继承:让一个类同时继承多个类注意:实际开发的时候。一般不使用多继承 多态类的特点:封装、继承、多态 封装:...

  • day15-面向对象和pygame

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

  • 面向对象和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参数对象来调用实现函数的功能需要用...

网友评论

      本文标题:day15-面向对象和pygame

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