3

Irrlicht 内で弾丸を利用しようと試みましたが、役に立ちませんでした。2 組の箇条書きをコーディングしようとしました。私は「レーザー」と「ロケット」を持っています。前者はビルボードを発射し、後者はメッシュを発射します。

前者用の有効なビルボードを作成することができましたが、どうしてもその位置を変更することができません。プレイヤーの顔からスポーンするのではなく、武器 (画面の右側) からスポーンしたくありません。ビルボードを武器ノードの親にすることを試み、値の問題をテストするために大きな値と小さな値を試しました。どちらも機能していません。

ロケットを使用するための IMesh ノードを作成しました。それを使って撮影しようとすると、大量のクラッシュが発生します。メッシュを起動しようとすると、出力に次のエラーが表示されます。

Loaded mesh: ../../media/rocketlauncher_shell.obj
First-chance exception at 0x00281a34 in 15.LoadIrrFile.exe: 0xC0000005: Access violation reading location 0x00000000.
Unhandled exception at 0x00281a34 in 15.LoadIrrFile.exe: 0xC0000005: Access violation reading location 0x00000000.
The program '[8092] 15.LoadIrrFile.exe: Native' has exited with code -1073741819 (0xc0000005).

私は百万回以上チェックしましたが、パスは完全に正しいです。Rocketlauncher_shell.obj は、../../media 内に直接配置されています。

これが私のコードです:

void CDemo::shoot()
{
    scene::ISceneManager* sm = device->getSceneManager();
    scene::ICameraSceneNode* camera = sm->getActiveCamera();

    if (!camera)
        return;

    SParticleImpact imp;
    imp.when = 0;

    // get line of camera

    core::vector3df start = camera->getPosition();
    core::vector3df end = (camera->getTarget() - start);
    end.normalize();

    SBullet bullet;

    bullet.direction = end;
    start += end*8.0f;
    end = start + (end * camera->getFarValue());

    scene::ISceneNode* node = 0;

    if (shotgunactive)
    {
        // TEMPORARY CRASH PREVENTION

        node = sm->addBillboardSceneNode(0,
            core::dimension2d<f32>(25,25), start);

        bullet.node = node;
        node->setName("laserbullet");

        node->setMaterialFlag(video::EMF_LIGHTING, false);
        node->setMaterialTexture(0, device->getVideoDriver()->getTexture("../../media/fireball.bmp"));
        node->setMaterialType(video::EMT_TRANSPARENT_ADD_COLOR);
    }

    if (laseractive)
    {
        // create fire ball

        node = sm->addBillboardSceneNode(0, core::dimension2d<f32>(25,25), core::vector3df(100.0f,0.1f,2.0f));

        bullet.node = node;
        node->setName("laserbullet");

        node->setMaterialFlag(video::EMF_LIGHTING, false);
        node->setMaterialTexture(0, device->getVideoDriver()->getTexture("../../media/fireball.bmp"));
        node->setMaterialType(video::EMT_TRANSPARENT_ADD_COLOR);

        cout << "LASER SHOT" << endl;
    }

    else if (rocketactive)
    {
        // Draw Rocket Shell
        scene::IMesh* nodemesh = smgr->getMesh("../../media/rocketlauncher_shell.obj");
        scene::IMeshSceneNode* node = smgr->addMeshSceneNode(nodemesh);
        node->setMaterialFlag(video::EMF_LIGHTING, false);
        node->setMaterialTexture(0, device->getVideoDriver()->getTexture("../../media/6fe78a94.tga"));
        node->setMaterialType(video::EMT_TRANSPARENT_ADD_COLOR);
        bullet.node = node;
        node->setName("rocketbullet");
    }

    f32 length = (f32)(end - start).getLength();
    const f32 speed = 0.6f;
    u32 time = (u32)(length / speed);

    scene::ISceneNodeAnimator* anim = 0;

    // set flight line

    anim = sm->createFlyStraightAnimator(start, end, time);

    node->addAnimator(anim);
    anim->drop();

    // when it should disappear
    bullet.when = device->getTimer()->getTime() + (time - 100);
    Bullets.push_back(bullet);

    // play sound
#ifdef USE_IRRKLANG
    if (ballSound)
        irrKlang->play2D(ballSound);
#endif
#ifdef USE_SDL_MIXER
    if (ballSound)
        playSound(ballSound);
#endif


    return;
}

すべての場合のブールは完全に機能しています。デバッグ行は常に表示され、前述の問題以外はすべて正常に機能します。

「laseractive」と「rocketactive」の行に注目してください。

このプログラムは、「LoadIrrFile」デフォルト プロジェクト #15 の上に構築しました。

必要な参照の完全なコードは次のとおりです: http://pastie.org/pastes/8623503/text

(これは最も美しいコードではありません - 進行中の作業であり、これまでにない Irrlicht での最初の試みです)

余談ですが、Irrlicht 内でヒットスキャン武器は可能ですか? そのような機能を備えたショットガンの武器をコーディングしたいと思います。

4

0 に答える 0