Panda3D学习 (4):播放器

下周就要开始考试了。。今天再学一个基础的例程,涉及音频播放,感觉以后也会常用的功能。

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文件简单一些。

猜你喜欢

转载自blog.csdn.net/zanbaixi2128/article/details/80789388