121.游戏窗口中显示图像:
一,img=pygame.image.load(路径)
并把加载到内存中的图片返回给调用者。
二,屏幕对象.blit(img, (x, y))
把img图像
绘制在x,y
位置处。
三,pygame.dusplay.update()
122.pygame
游戏时钟控制刷新频率:
clock= pygame.time.Clock()
在游戏循环中,控制clock的刷新频率每秒60次
clock.tick(60)
123.pygame
中通过pygame.event.get()
来获取用户当前所做的事件的列表(用户同一时间可以做很多事情)。
124.如果开发的子类不是直接继承自object
,则在重写初始化方法时,一定要先调用父类的__init__()
方法。
125.pygame
中可以使用pygame.time.set_timer(eventId, 间隔时间)
来添加定时器。
126.导入模块的顺序:先导入官方标准模块,再导入第三方模块,最后导入自己的模块。
127.pygame.sprite.groupcollide(group1, group2, dokill1, dokill2, collided=None)
---Sprite_dict
专门用来检测两个精灵组是否发生了碰撞。碰撞后,dokill1
用来控制碰撞后group1
是否销毁;dokill2
用来控制碰撞后group2
是否销毁;
128.模块之间循环导入,会报ImportErorr
。设计模块时,应避免循环导入。
129.特别注意:
a=3
b=3
则,a==b
和a is b
都返回True
,
a=30000
b=30000
则,a==b
返回True
, a is b
返回False
130.深拷贝copy.deepcopy(aaa)
、浅拷贝copy.copy(aaa)
深入剖析:
深拷贝copy.deepcopy(aaa)
不管引用层级有多深,都会拷贝出来让其与源彻底独立。比如,一个list中存放的是另外list
的引用,则进行深拷贝时,拷贝出来的会与源彻底独立了。
浅拷贝copy.copy(aaa)
最多只会copy
第一层,也有可能不拷贝。之所以这么说,是因为:当被拷贝的是可变类型时,不管引用层级有多深,只会copy
第一层,后面的引用的与源共用一个。而当被拷贝的是不可变类型时,第一层也不拷贝。
131.属性、属性(多见于Python把我们定义的私有变量前面加上类名)、__属性
、__属性__
,含义各不同。属性公有属性,_属性
、__属性
均表示私有属性,__属性__内置属性
。
_属性
、__属性
在from xxx模块 import *
这种情况下,是导入不过来的。在import xxx
模块可以被导进来。
132.私有属性之所以无法调用,正是Python把我们定义的私有变量前面加上_类名
,最终变量名即:_类名__变量名
。当我们知道了这个规则后,尽管可以通过这种方式调用,但极不推荐!
133.@property
装饰器修饰的方法名(例如:name)会自动成为一个属性。当name
方法被@property
装饰后,自动多了个@name.setter
。用@name.setter
来修饰的方法将被视为name
的setter
方法。
注意的是:@name.setter
来修饰的方法名就必须是name
了,不可以随意修改了。否则设置值时,会报错!
@property
def name(self):
pass
@name.setter
def name(self, new_name):
pass
134.__all__
作用:__all__
是个模块中的全局变量,如果在xxx模块
中定义了该变量,那么通过from xxx模块 import *
来导入该模块时,只能导入里面配置的类、变量、方法。__all__=["变量名", "方法名", "类名"]
,配置不分先后顺序。
135.range(start,end)
,按[start,end)
左闭合右开生成list
。
136.range()
使用时有何风险?
python2.x
中有风险,如果要生成的list
特别大,比如几千万甚至更大,则会报错:Memory Error
python3.x
中,则不管要生成的list
是多大,都返回一个range
对象。不存在风险。
137.当用Thread()
来创建一个线程对象时,仅仅是创建了一个普通子线程对象,此时子线程并未开始执行任务。
138.当子线程对象的start()
被调用时,子线程开始执行任务;当一个子线程的任务执行完成后,该子线程生命周期自动终结。
139.主线程会等他所创建出来的子线程的任务都执行完成后,该主线程才会死亡。
140.当自定义的线程类,要继承自threading.Thread
类,并重写run()
方法,把子线程要做的任务写在该run()
方法,此时再调用自己创建的该线程类的start()
方法时,内部就会自动调用run()
方法了,执行我们要在子线程做的任务了。