下周就要开始考试了。。今天再学一个基础的例程,涉及音频播放,感觉以后也会常用的功能。
1. loadPrcFileData("", "audio-library-name p3openal_audio")
这段代码的意思是告诉panda3D用的是OpenAL音频而不是FMOD (我也分不清这两个是啥)
loadPrcFileData的用法是:
from panda3d.core import loadPrcFileData
loadPrcFileData('', 'fullscreen true')
这段代码用于全屏显示,这不重要,重点是他的用法在于用loadPrcFileData改变配置文件
第一个参数为空就完事儿了(可能有用,但感觉我用不到)
第二个参数就是要添加的内容 这里是audio-library-name p3openal_audio, 空格分开前后两段。
2. location
OnscreenText(text=msg, style=1, fg=(0, 0, 0, 1), shadow=(1, 1, 1, 1),
parent=base.a2dTopLeft, align=TextNode.ALeft,
pos=(0.08, -pos - 0.04), scale=.06)
这里既有parent代码,又有pos,我觉得应该是基于parent的pos位置
3.self.tex = MovieTexture("1")
success = self.tex.read(media_file)
assert success, "Failed to load video!"
前两句的意思应该是将这个media_file通过read函数(应该是MovieTextrue的父类的方法)读入self.tex中用于后面的texture替换,下面一句assert是python的语法 查询后如下
assert的异常参数,其实就是在断言表达式后添加字符串信息,用来解释断言并更好的知道是哪里出了问题。格式如下:
assert expression [, arguments]
assert 表达式 [, 参数]
例子:
>>> assert len(lists) >=5,'列表元素个数小于5'
Traceback (most recent call last):
File "D:/Data/Python/helloworld/helloworld.py", line 1, in <module>
assert 2>=5,'列表元素个数小于5'
AssertionError: 列表元素个数小于5
4. 卡片操作
cm = CardMaker("My Fullscreen Card")
cm.setFrameFullscreenQuad()# Tell the CardMaker to create texture coordinates that take into
# account the padding region of the texture.
cm.setUvRange(self.tex)
# Now place the card in the scene graph and apply the texture to it.
card = NodePath(cm.generate())
card.reparentTo(self.render2d)
card.setTexture(self.tex)
这里通过CardMaker建立了一个卡片,这个card具体是啥我在手册上也没有明确查到,姑且当作一个容器。
render2d的意思应该是显示2d的内容,毕竟例程的内容是2d影片
render是3d
前两句很简单的给出了一个全屏显示,后面的NodePath+reparentTo的方法将card插入到渲染中然后再通过setTexture的方法替换内容,以后可以借鉴。
5. 操作控制
self.accept('p', self.playpause)
self.accept('P', self.playpause)self.accept('s', self.stopsound)
self.accept('S', self.stopsound)
self.accept('m', self.fastforward)
self.accept('M', self.fastforward)
def stopsound(self):
self.sound.stop()
self.sound.setPlayRate(1.0)
def fastforward(self):
if self.sound.status() == AudioSound.PLAYING:
t = self.sound.getTime()
self.sound.stop()
if self.sound.getPlayRate() == 1.0:
self.sound.setPlayRate(0.5)
else:
self.sound.setPlayRate(1.0)
self.sound.setTime(t)
self.sound.play()
def playpause(self):
if self.sound.status() == AudioSound.PLAYING:
t = self.sound.getTime()
self.sound.stop()
self.sound.setTime(t)
else:
self.sound.play()
通过accept语句来控制键盘交互,后面一段控制了播放,暂停,停止,快进等功能,比较简单,也可以作为参考。
有一点是控制语句里控制的全是sound,但效果里是影片也一起停止了,怀疑是这一句的作用
self.tex.synchronizeTo(self.sound)
果然,将这一句注释后,视频自顾自播放了 毫无控制。
那这样这个同步方法还是很简便的,只需要控制声音就可以了。
不知道ogv文件是怎么制作的,但是应该比egg文件简单一些。