Page 1 of 1
shooting!
Posted: Mon Apr 17, 2006 5:18 pm
by LOL
Hi,
I am making an FPS game using IrrWizard. I want projectiles to be displayed when a gun is fired.
I have tried looking at the Irrlicht Demo Example since it has a "visible shot" and have tried to incorporate it into the coding which is generated by IrrWizard, but with no success.
I would very grateful if someone can help me on this issue.
thx
Posted: Mon Apr 17, 2006 5:38 pm
by JP
What specific problems are you having? Any error messages, got any short bits of code that you can show where you've made the changes?
shooting
Posted: Mon Apr 17, 2006 6:08 pm
by LOL
I've tried to incorporate the shoot() function(in the CDemo.cpp) from the Irrlicht Demo into GamePlayState.cpp (This is a file generated by IrrWizard).
The thing runs fine but as soon as i fire the game crashes.!
void CGamePlayState::shoot()
{
IrrlichtDevice *device;
scene::ISceneManager* sm = device->getSceneManager();
scene::ICameraSceneNode* camera = sm->getActiveCamera();
if (!camera || !m_Selector)
return;
SParticleImpact imp;
imp.when = 0;
// get line of camera
core::vector3df start = camera->getPosition();
core::vector3df end = (camera->getTarget() - start);
end.normalize();
start += end*5.0f;
end = start + (end * camera->getFarValue());
core::triangle3df triangle;
core::line3d<f32> line(start, end);
// get intersection point with map
if (sm->getSceneCollisionManager()->getCollisionPoint(
line, m_Selector, end, triangle))
{
// collides with wall
core::vector3df out = triangle.getNormal();
out.setLength(0.03f);
imp.when = 1;
imp.outVector = out;
imp.pos = end;
}
else
{
// doesnt collide with wall
end = (camera->getTarget() - start);
end.normalize();
end = start + (end * 1000);
}
// create fire ball
scene::ISceneNode* node = 0;
node = sm->addBillboardSceneNode(0,
core::dimension2d<f32>(25,25), start);
node->setMaterialFlag(video::EMF_LIGHTING, false);
node->setMaterialTexture(0, device->getVideoDriver()->getTexture("media/particle.bmp"));
node->setMaterialType(video::EMT_TRANSPARENT_ADD_COLOR);
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();
anim = sm->createDeleteAnimator(time);
node->addAnimator(anim);
anim->drop();
if (imp.when)
{
// create impact note
imp.when = device->getTimer()->getTime() + (time - 100);
Impacts.push_back(imp);
}
}
///////////////////////////////////
void CGamePlayState::MouseEvent(CGameManager* pManager)
{
scene::ITriangleSelector* mapSelector;
// left mouse pressed, FIRE!!!
if (pManager->getMouse() == EMIE_LMOUSE_PRESSED_DOWN )
{
if (pManager->getPlayer()->getAmmo() > 0)
{
shoot(); // this is what i have added!
pManager->getPlayer()->setAmmo(pManager->getPlayer()->getAmmo() - 4);
// get the scene node
scene::ISceneNode* node = pManager->getSceneManager()->getSceneCollisionManager()->
getSceneNodeFromCameraBB(pManager->getSceneManager()->getActiveCamera(), ID_ENEMY);
if (node->getID() == ID_ENEMY )
{
// hit an enemy, not a wall
CGameEnemy* enemy = pManager->getEnemyManager()->GetEntityFor(ENTITY_MERC);
enemy->setHealth(enemy->getHealth() - 20);
pManager->createParticleEffect(pManager, getTargetsPosition(pManager), "media/blood.bmp");
} else
pManager->createParticleEffect(pManager, getTargetsPosition(pManager), "media/smoke.bmp");
}
}
// right mouse pressed, RELOAD!!!
if (pManager->getMouse() == EMIE_RMOUSE_PRESSED_DOWN )
{
pManager->getPlayer()->setAmmo(100);
/* if (pManager->getPlayer()->getAmmo() <= 0)
pManager->getPlayer()->setAmmo(100); // 100% full */
}
}
Posted: Mon Apr 17, 2006 7:08 pm
by JP
What's the error you get?
Posted: Mon Apr 17, 2006 9:25 pm
by area51
Most of the code in the shoot() function will be redundant as all you are really trying to do is create a FlyStraightAnimator with the correct parameters.
All the parameters you need will be in the calling function, CGamePlayState::MouseEvent().
In your shoot fuction you just need to do the //create fireball and //set flight line bit to start with.
You might want to pass in a pointer to the GameManager, pManager. You can then get a pointer to Irrlicht subsytems like the SceneManager (sm) in the code you have like this :
to create a FlyStraightAnimator you can do this:
Code: Select all
pManager->getSceneManager()->createFlystraightAnimator(camPos,targetPos, 5000);
to get the first parameter, camPos:
Code: Select all
pManager->getSceneManager()->getActiveCamera()->getPosition()
and the second, the target position, wall or enemy (getTargetsPosition() is a member function of CGamePlayState() by the looks)
and so on.
Sorry it's only high level help, but I think in this case it's better to step back from the code and think what you want to achieve from it. Then start from a blank and build it up rather than cut and paste a large amount of code and then whittle it back.
________
Avatar: the last airbender forum
Posted: Tue Apr 18, 2006 12:41 pm
by LOL
Thank you area51, I finally got it to work!
But i've got one problem - How do I actually create the fireball? because at the moment i've only got a white cube being fired!
when i put in this piece of code the game crashes when i fire the gun.
Code: Select all
node2->setMaterialTexture(0, m_pDevice->getVideoDriver()->getTexture("media/particle.bmp"));
Ive got rid of the shoot() function and just put the coding in CGamePlayState::MouseEvent().
Here is the CGamePlayState::MouseEvent() so far:
Code: Select all
void CGamePlayState::MouseEvent(CGameManager* pManager)
{
scene::ITriangleSelector* mapSelector;
// left mouse pressed, FIRE!!!
if (pManager->getMouse() == EMIE_LMOUSE_PRESSED_DOWN )
{
if (pManager->getPlayer()->getAmmo() > 0)
{
pManager->getSceneManager();
core::vector3df camPos = pManager->getSceneManager()->getActiveCamera()->getPosition();
core::vector3df targetPos = getTargetsPosition(pManager);
scene::ICameraSceneNode* camera = pManager->getSceneManager()->getActiveCamera();
pManager->getSceneManager()->createFlyStraightAnimator(camPos,targetPos, 5000);
///////////////////
pManager->getPlayer()->setAmmo(pManager->getPlayer()->getAmmo() - 4);
// get the scene node
scene::ISceneNode* node = pManager->getSceneManager()->getSceneCollisionManager()->
getSceneNodeFromCameraBB(pManager->getSceneManager()->getActiveCamera(), ID_ENEMY);
core::triangle3df triangle;
core::line3d<f32> line(camPos, targetPos);
SParticleImpact imp;
imp.when = 0;
// get intersection point with map
if (pManager->getSceneManager()->getSceneCollisionManager()->getCollisionPoint(
line, m_Selector, targetPos, triangle))
{
// collides with wall
core::vector3df out = triangle.getNormal();
out.setLength(0.03f);
imp.when = 1;
imp.outVector = out;
imp.pos = targetPos;
}
else
{
// doesnt collide with wall
targetPos = (camera->getTarget() - camPos);
targetPos.normalize();
targetPos = camPos + (targetPos * 1000);
}
scene::ISceneNode* node2 = 0;
node2 = pManager->getSceneManager()->addBillboardSceneNode(0,
core::dimension2d<f32>(25,25), camPos);
node2->setMaterialFlag(video::EMF_LIGHTING, false);
**********************************************************
//This next line is giving me problems. If i put it in then the game crashes on firing, otherwise i get a white cube being fired!
**********************************************************
This one -> //node2->setMaterialTexture(0, m_pDevice->getVideoDriver()->getTexture("media/particle.bmp"));
node2->setMaterialType(video::EMT_TRANSPARENT_ADD_COLOR);
scene::ISceneNodeAnimator* anim = 0;
anim = pManager->getSceneManager()->createFlyStraightAnimator(camPos, targetPos, 500);
node2->addAnimator(anim);
anim->drop();
anim = pManager->getSceneManager()->createDeleteAnimator(500);
node2->addAnimator(anim);
anim->drop();
Posted: Tue Apr 18, 2006 8:05 pm
by area51
I can't see where you've initialised m_pDevice, so use this instead:
Code: Select all
node2->setMaterialTexture(0, pManager->getDevice()->getVideoDriver()->getTexture("media/particle.bmp"));
Also this code below:
Code: Select all
core::triangle3df triangle;
core::line3d<f32> line(camPos, targetPos);
SParticleImpact imp;
imp.when = 0;
// get intersection point with map
if (pManager->getSceneManager()->getSceneCollisionManager()->getCollisionPoint(
line, m_Selector, targetPos, triangle))
{
// collides with wall
core::vector3df out = triangle.getNormal();
out.setLength(0.03f);
imp.when = 1;
imp.outVector = out;
imp.pos = targetPos;
}
else
{
// doesnt collide with wall
targetPos = (camera->getTarget() - camPos);
targetPos.normalize();
targetPos = camPos + (targetPos * 1000);
}
isn't doing that much more than this:
Code: Select all
core::vector3df targetPos = getTargetsPosition(pManager);
________
Yamaha fj600
Posted: Wed Apr 19, 2006 12:52 pm
by LOL
Thanks area51, youre a star!
it works like a charm!