void Sound::play() { QSoundEffect::play(SOUND_BACKGROUND); } void WingFlapSound:: play() { QSoundEffect::play(SOUND_WING); } void HitSound::play() { QSoundEffect::play(SOUND_HIT); }显示call to non-static member function without an object argument
时间: 2024-03-03 14:50:19 浏览: 28
这个错误通常是因为调用了成员函数,但没有提供一个对象作为参数。成员函数需要一个对象才能被调用,因为它们依赖于对象的状态和数据。你需要创建一个对象,然后调用该成员函数。例如,如果你有一个名为`sound`的`Sound`对象,你可以这样调用`play`函数:
```
sound.play();
```
如果你要在静态函数中调用成员函数,你需要先创建一个对象,然后使用该对象来调用成员函数。例如:
```
static void someStaticFunction() {
Sound sound;
sound.play();
}
```
相关问题
利用QSoundEffect并用多态帮我写几个wav文件的播放
好的,这里给您提供一个简单的示例,展示如何使用 Qt 的多态机制实现不同音效的播放。
首先,我们需要定义一个 `Sound` 类作为所有音效的基类,其中包含了播放音效的虚函数 `play()`:
```cpp
class Sound : public QObject
{
Q_OBJECT
public:
explicit Sound(QObject *parent = nullptr) : QObject(parent) {}
virtual ~Sound() {}
virtual void play() = 0;
};
```
然后,我们可以定义一些派生自 `Sound` 类的音效类,例如 `BackgroundSound` 和 `ExplosionSound`:
```cpp
class BackgroundSound : public Sound
{
Q_OBJECT
public:
explicit BackgroundSound(QObject *parent = nullptr) : Sound(parent) {}
void play() override {
QSoundEffect sound;
sound.setSource(QUrl::fromLocalFile("background.wav"));
sound.setLoopCount(QSoundEffect::Infinite);
sound.play();
}
};
class ExplosionSound : public Sound
{
Q_OBJECT
public:
explicit ExplosionSound(QObject *parent = nullptr) : Sound(parent) {}
void play() override {
QSoundEffect sound;
sound.setSource(QUrl::fromLocalFile("explosion.wav"));
sound.setLoopCount(1);
sound.play();
}
};
```
这两个类分别重写了 `play()` 函数,以播放不同的音效文件。
最后,我们可以使用多态机制来播放这些音效。例如:
```cpp
Sound* sound = new BackgroundSound(this);
sound->play();
delete sound;
sound = new ExplosionSound(this);
sound->play();
delete sound;
```
请注意,我们使用 `new` 运算符动态创建了 `Sound` 类的实例,并使用多态机制调用了 `play()` 函数。在使用完音效后,我们需要使用 `delete` 运算符销毁这些实例,以释放内存。
希望这个示例能够帮助您理解如何使用多态机制实现不同音效的播放。如果您有任何问题,请随时向我提问。
import processing.sound.*;SoundFile sound;boolean isPlaying = false;void setup() { size(400, 400); background(255); // 加载音乐文件 sound = new SoundFile(this, "music.mp3");}void draw() { // 每帧检查音乐是否正在播放 if (isPlaying) { if (!sound.isPlaying()) { sound.play(); } } else { sound.pause(); }}void keyPressed() { if (key == 'b' || key == 'B') { // 按下b键,播放音乐 isPlaying = true; } else { // 按下其他字母键,暂停音乐 isPlaying = false; }}在此基础上修改,按下其他按键时播放另一首歌,此时第一次按键的歌曲停止
好的,您可以按照以下步骤进行修改:
1. 首先,您需要预加载另一首歌曲,您可以在 `setup()` 函数中添加以下代码:
```java
SoundFile anotherSound = new SoundFile(this, "another_music.mp3");
```
2. 接下来,在 `keyPressed()` 函数中,添加一个判断语句,当用户按下其他字母键时,停止当前播放的音乐,然后播放另一首歌曲。
```java
void keyPressed() {
if (key == 'b' || key == 'B') {
// 按下b键,播放音乐
isPlaying = true;
} else {
// 按下其他字母键,暂停音乐
isPlaying = false;
// 停止当前歌曲
sound.stop();
// 播放另一首歌曲
anotherSound.play();
}
}
```
这样,当用户按下其他字母键时,当前播放的歌曲会停止,然后播放另一首歌曲。如果用户再次按下 `b` 键,就会回到原来的歌曲。