|
 |
|
 |
04-13-2005, 07:15 PM
|
#1 (permalink)
|
|
Registered User
Join Date: Apr 2005
Posts: 5
|
Organize Failure
I wrote this script, and everything compiled fine. But it was crammed and sloppy. So I want to organize it, putting sections in different files (.cpp), and linking them, using classes. But I don't know exactly what to do to achieve this. Can some one help me out?
Here is what I have managed to come up with, and sadly, I get errors. =/
CTerrainNodes.h
Code:
#ifndef CTerrainNodes_h
#define CTerrainNodes_h
class CTerrainNodes
{
public:
CTerrainNodes();
void RenderTerrain( ITerrainSceneNode* );
};
#endif
CTerrainNodes.cpp
Code:
#include "CTerrainNodes.h"
using namespace irr;
#pragma comment(lib, "Irrlicht.lib")
CTerrainNodes::CTerrainNodes()
{
}
void CTerrainNodes::RenderTerrain( scene::ITerrainSceneNode* terrain )
{
// add terrain(center) scene node
scene::ITerrainSceneNode* terrain = smgr->addTerrainSceneNode(
"tiles/tile.bmp");
terrain->setScale(core::vector3df(10, 2, 10));
terrain->setPosition(core::vector3df(0,0,0));
terrain->setMaterialFlag(video::EMF_LIGHTING, false);
terrain->setMaterialTexture(0, driver->getTexture("textures/grassdark.bmp"));
terrain->scaleTexture(1.0f);
return terrain;
}
Section from Main.cpp
Code:
// Render Terrain
CTerrainNodes t;
t.RenderTerrain();
Errors....
Code:
Compiling...
main.cpp
c:\000-project\project testing\cterrainnodes.h(8) : error C2061: syntax error : identifier 'ITerrainSceneNode'
c:\000-project\project testing\main.cpp(73) : error C2065: 'terrain' : undeclared identifier
c:\000-project\project testing\main.cpp(74) : error C2227: left of '->setTriangleSelector' must point to class/struct/union
CTerrainNodes.cpp
c:\000-project\project testing\cterrainnodes.h(8) : error C2061: syntax error : identifier 'ITerrainSceneNode'
c:\000-project\project testing\cterrainnodes.cpp(17) : error C2511: 'RenderTerrain' : overloaded member function 'void (class irr::scene::ITerrainSceneNode *)' not found in 'CTerrainNodes'
c:\000-project\project testing\cterrainnodes.h(5) : see declaration of 'CTerrainNodes'
Error executing cl.exe.
thisone.exe - 5 error(s), 0 warning(s)
Whats wrong? 
|
|
|
04-14-2005, 09:59 AM
|
#2 (permalink)
|
|
[code][/code] enforcer
Join Date: Mar 2003
Location: Netherlands
Posts: 1,544
|
First of all your program can't find ITerrainSceneNode. Did you include headers correctly for example?
__________________
|
|
|
04-14-2005, 03:10 PM
|
#3 (permalink)
|
|
Registered User
Join Date: Apr 2005
Posts: 5
|
Well I included, these headers, (which works fine when not split into seperate files).
Code:
#include <stdio.h>
#include <wchar.h>
#include <irrlicht.h>
Maybe I can clear up a little what i want to do. Heres the script that compiles fine.
Code:
#include <stdio.h>
#include <wchar.h>
#include <irrlicht.h>
using namespace irr;
#pragma comment(lib, "Irrlicht.lib")
scene::ISceneNode* node = 0;
IrrlichtDevice* device = 0;
class MyEventReceiver : public IEventReceiver
{
public:
virtual bool OnEvent(SEvent event)
{
if (node != 0 && event.EventType == irr::EET_KEY_INPUT_EVENT&&
!event.KeyInput.PressedDown)
{
switch(event.KeyInput.Key)
{
case KEY_KEY_W:
case KEY_KEY_S:
{
core::vector3df v = node->getPosition();
v.Y += event.KeyInput.Key == KEY_KEY_W ? 2.0f : -2.0f;
node->setPosition(v);
}
return true;
}
}
return false;
}
};
int main()
{
MyEventReceiver receiver;
device = createDevice(video::EDT_DIRECTX8, core::dimension2d<s32>(640, 480),
16, false, false, false, &receiver);
video::IVideoDriver* driver = device->getVideoDriver();
scene::ISceneManager* smgr = device->getSceneManager();
// add terrain(center) scene node
scene::ITerrainSceneNode* terrain = smgr->addTerrainSceneNode(
"tiles/tile.bmp");
terrain->setScale(core::vector3df(10, 2, 10));
terrain->setPosition(core::vector3df(0,0,0));
terrain->setMaterialFlag(video::EMF_LIGHTING, false);
terrain->setMaterialTexture(0, driver->getTexture("textures/grassdark.bmp"));
terrain->scaleTexture(1.0f);
return terrain;
scene::ICameraSceneNode* camera =
smgr->addCameraSceneNodeFPS(0,100.0f,300.0f);
camera->setPosition(core::vector3df(1200,2000,1200));
camera->setFarValue(10000);
scene::ISceneNodeAnimator* anim = smgr->createCollisionResponseAnimator(
selector, camera, core::vector3df(30,50,30),
core::vector3df(0,-3,0),
core::vector3df(0,50,0));
camera->addAnimator(anim);
anim->drop();
//disable mouse cursor
device->getCursorControl()->setVisible(false);
int lastFPS = -1;
while(device->run())
{
driver->beginScene(true, true, video::SColor(255,113,113,133));
smgr->drawAll();
driver->endScene();
int fps = driver->getFPS();
if (lastFPS != fps)
{
wchar_t tmp[1024];
swprintf(tmp, 1024, L"Project - Demo Version",
driver->getName(), fps);
device->setWindowCaption(tmp);
lastFPS = fps;
}
}
device->drop();
return 0;
}
I wish to take this code from the script, ( which renders the terrain ), and place it into a seperate file, and link to it using a class, making it easier to keep track of.
Code:
// add terrain(center) scene node
scene::ITerrainSceneNode* terrain = smgr->addTerrainSceneNode(
"tiles/tile.bmp");
terrain->setScale(core::vector3df(10, 2, 10));
terrain->setPosition(core::vector3df(0,0,0));
terrain->setMaterialFlag(video::EMF_LIGHTING, false);
terrain->setMaterialTexture(0, driver->getTexture("textures/grassdark.bmp"));
terrain->scaleTexture(1.0f);
return terrain;
I don't know if using a class is the best method but its the only method I have found to work the best, so far. How do I go about doing this?  Thx.
|
|
|
04-14-2005, 03:20 PM
|
#4 (permalink)
|
|
[code][/code] enforcer
Join Date: Mar 2003
Location: Netherlands
Posts: 1,544
|
Just add the header irrlicht.h.
Code:
#include <irrlicht.h>
#include "CTerrainNodes.h"
using namespace irr;
#pragma comment(lib, "Irrlicht.lib")
CTerrainNodes::CTerrainNodes()
{ }
void CTerrainNodes::RenderTerrain( scene::ITerrainSceneNode* terrain )
{
// add terrain(center) scene node
scene::ITerrainSceneNode* terrain = smgr->addTerrainSceneNode( "tiles/tile.bmp");
terrain->setScale(core::vector3df(10, 2, 10));
terrain->setPosition(core::vector3df(0,0,0));
terrain->setMaterialFlag(video::EMF_LIGHTING, false);
terrain->setMaterialTexture(0, driver->getTexture("textures/grassdark.bmp"));
terrain->scaleTexture(1.0f);
return terrain;
}
And then don't redeclare "terrain". You already declared it:
Code:
void CTerrainNodes::RenderTerrain( scene::ITerrainSceneNode* terrain )
{
// add terrain(center) scene node
scene::ITerrainSceneNode* terrain = smgr->addTerrainSceneNode( "tiles/tile.bmp");
Do this:
Code:
void CTerrainNodes::RenderTerrain( )
Correct in the header as well.
If you need the "terrain" object outside the method, but inside the class do this:
Code:
class CTerrainNodes
{
public:
CTerrainNodes();
void RenderTerrain( );
private:
scene::ITerrainSceneNode* terrain;
};
CTerrainNodes::CTerrainNodes() : terrain(smgr->addTerrainSceneNode( "tiles/tile.bmp") )
{ }
But make sure the class knows about "smgr*". You may want to create constructor takes the argument:
Code:
CTerrainNodes::CTerrainNodes(scene::ITerrainSceneNode* smgr);
And so forth.
__________________
|
|
|
04-14-2005, 03:29 PM
|
#5 (permalink)
|
|
Registered User
Join Date: Apr 2005
Posts: 5
|
Still seems to give me the same errors
I'm wondering if I set up CTerrainNodes.h correctly. The error seems to point to that header, and how it can't reconize the scene::ITerrainSceneNode*.
I'm pretty new with setting up multiple .cpp and .h in a program.. And I don't know how to link them using classes.. You think you could shed some light? Please!
*EDIT*
Ok I tried everything you have metioned, to the best of my abilities. This is how I implemented them.
CTerrainNodes.h
Code:
// CTerrainNodes.h
#ifndef CTerrainNodes_h
#define CTerrainNodes_h
using namespace irr;
class CTerrainNodes
{
public:
CTerrainNodes();
void RenderTerrain( );
private:
scene::ITerrainSceneNode* terrain;
};
#endif
CTerrainNodes.cpp
Code:
#include <stdio.h>
#include <wchar.h>
#include <irrlicht.h>
#include "CTerrainNodes.h"
using namespace irr;
#pragma comment(lib, "Irrlicht.lib")
CTerrainNodes::CTerrainNodes(scene::ITerrainSceneNode* smgr);
{ }
void CTerrainNodes::RenderTerrain( )
{
// add terrain(center) scene node
scene::ITerrainSceneNode* terrain = smgr->addTerrainSceneNode( "tiles/tile.bmp");
terrain->setScale(core::vector3df(10, 2, 10));
terrain->setPosition(core::vector3df(0,0,0));
terrain->setMaterialFlag(video::EMF_LIGHTING, false);
terrain->setMaterialTexture(0, driver->getTexture("textures/grassdark.bmp"));
terrain->scaleTexture(1.0f);
return terrain;
}
Errors...
Code:
Deleting intermediate files and output files for project 'thisone - Win32 Debug'.
--------------------Configuration: thisone - Win32 Debug--------------------
Compiling...
CTerrainNodes.cpp
c:\000-project\project testing\cterrainnodes.cpp(11) : error C2244: 'CTerrainNodes::CTerrainNodes::CTerrainNodes' : unable to resolve function overload
c:\000-project\project testing\cterrainnodes.cpp(12) : error C2447: missing function header (old-style formal list?)
c:\000-project\project testing\cterrainnodes.cpp(17) : error C2065: 'smgr' : undeclared identifier
c:\000-project\project testing\cterrainnodes.cpp(17) : error C2227: left of '->addTerrainSceneNode' must point to class/struct/union
c:\000-project\project testing\cterrainnodes.cpp(23) : error C2065: 'driver' : undeclared identifier
c:\000-project\project testing\cterrainnodes.cpp(23) : error C2227: left of '->getTexture' must point to class/struct/union
c:\000-project\project testing\cterrainnodes.cpp(25) : error C2562: 'RenderTerrain' : 'void' function returning a value
c:\000-project\project testing\cterrainnodes.h(11) : see declaration of 'RenderTerrain'
main.cpp
c:\000-project\project testing\main.cpp(53) : error C2065: 'CTerrainNodes' : undeclared identifier
c:\000-project\project testing\main.cpp(53) : error C2146: syntax error : missing ';' before identifier 't'
c:\000-project\project testing\main.cpp(53) : error C2065: 't' : undeclared identifier
c:\000-project\project testing\main.cpp(54) : error C2228: left of '.RenderTerrain' must have class/struct/union type
c:\000-project\project testing\main.cpp(72) : error C2065: 'terrain' : undeclared identifier
c:\000-project\project testing\main.cpp(73) : error C2227: left of '->setTriangleSelector' must point to class/struct/union
Error executing cl.exe.
thisone.exe - 13 error(s), 0 warning(s)
Still doesn't work properly. I know I'm doing something wrong I just can't figure it out.. 
|
|
|
04-14-2005, 04:48 PM
|
#6 (permalink)
|
|
[code][/code] enforcer
Join Date: Mar 2003
Location: Netherlands
Posts: 1,544
|
I can't get the irrlicht library to work so I can't compile to test. However, this is the setup basically:
main.cpp:
Code:
#include "CTerrainNodes.h"
#include <irrlicht.h>
#pragma comment(lib, "Irrlicht.lib");
int main()
{
video::IVideoDriver* driver = device->getVideoDriver();
scene::ITerrainSceneNode* smgr = device->getSceneManager();
CTerrainNodes TNodes(driver, smgr);
TNodes.RenderTerrain();
}
CTerrainNodes.h:
Code:
#ifndef CTerrainNodes_h
#define CTerrainNodes_h
using namespace irr;
class CTerrainNodes
{
public:
CTerrainNodes(video::IVideoDriver*, scene::ITerrainSceneNode*);
);
void RenderTerrain();
private:
scene::ITerrainSceneNode* terrain;
scene::ITerrainSceneNode* smgr;
video::IVideoDriver* driver;
};
#endif
CTerrainNodes.cpp:
Code:
#include <stdio.h>
#include <wchar.h>
#include <irrlicht.h>
#include "CTerrainNodes.h"
using namespace irr;
#pragma comment(lib, "Irrlicht.lib")
CTerrainNodes::CTerrainNodes(video::IVideoDriver* driver, scene::ITerrainSceneNode* smgr)
: smgr(smgr), driver(driver);
{ }
void CTerrainNodes::RenderTerrain( )
{
// add terrain(center) scene node
terrain = smgr->addTerrainSceneNode( "tiles/tile.bmp");
terrain->setScale(core::vector3df(10, 2, 10));
terrain->setPosition(core::vector3df(0,0,0));
terrain->setMaterialFlag(video::EMF_LIGHTING, false);
terrain->setMaterialTexture(0, driver->getTexture("textures/grassdark.bmp"));
terrain->scaleTexture(1.0f);
}
__________________
|
|
|
04-14-2005, 05:51 PM
|
#7 (permalink)
|
|
Registered User
Join Date: Apr 2005
Posts: 5
|
Ok cool, I got it to compile with no errors. thanks.
I had to switch scene::ITerrainSceneNode* smgr; to scene::ISceneManager* smgr;
But I got another question, because another problem has occured. I need to pass terrain back to the main.cpp script, so I can attach a selector to it for collision detection. How can I go about doing this?
-jesse
Code:
CTerrainNodes.h
---------------------------------------
#ifndef CTerrainNodes_h
#define CTerrainNodes_h
using namespace irr;
class CTerrainNodes
{
public:
CTerrainNodes(video::IVideoDriver*, scene::ISceneManager*);
void RenderTerrain();
private:
scene::ITerrainSceneNode* terrain;
scene::ISceneManager* smgr;
video::IVideoDriver* driver;
};
#endif
CTerrainNodes.cpp
---------------------------------------
#include <stdio.h>
#include <wchar.h>
#include <irrlicht.h>
#include "CTerrainNodes.h"
using namespace irr;
#pragma comment(lib, "Irrlicht.lib")
CTerrainNodes::CTerrainNodes(video::IVideoDriver* driver, scene::ISceneManager* smgr)
: smgr(smgr), driver(driver)
{ }
void CTerrainNodes::RenderTerrain( )
{
// add terrain(center) scene node
terrain = smgr->addTerrainSceneNode( "tiles/tile.bmp");
terrain->setScale(core::vector3df(10, 2, 10));
terrain->setPosition(core::vector3df(0,0,0));
terrain->setMaterialFlag(video::EMF_LIGHTING, false);
terrain->setMaterialTexture(0, driver->getTexture("textures/grassdark.bmp"));
terrain->scaleTexture(1.0f);
}
Main.cpp
--------------------------------
// Render Terrain
CTerrainNodes TNodes(driver, smgr);
Nodes.RenderTerrain();
|
|
|
04-14-2005, 07:06 PM
|
#8 (permalink)
|
|
[code][/code] enforcer
Join Date: Mar 2003
Location: Netherlands
Posts: 1,544
|
Tons of options. It is not clear to me what you exactly want, but here is a starter. You should think hard about the responsibilities of class CTerrainNodes. That will provide the right method.
Code:
public:
scene::ITerrainSceneNode* get_terrain();
Code:
scene::ITerrainSceneNode* CTerrainNodes::get_terrain()
{
return terrain;
}
__________________
|
|
|
04-14-2005, 07:13 PM
|
#9 (permalink)
|
|
Registered User
Join Date: Apr 2005
Posts: 5
|
Thank you very much
Everything is working correctly. I will recommend this site and it's community. 
|
|
|
04-14-2005, 11:39 PM
|
#10 (permalink)
|
|
[code][/code] enforcer
Join Date: Mar 2003
Location: Netherlands
Posts: 1,544
|
I don't like this method. But like I mentioned I don't know what you're up to.
See if this works just as well. If it does, use this:
Code:
public:
const scene::ITerrainSceneNode* get_terrain() const;
Code:
const scene::ITerrainSceneNode* CTerrainNodes::get_terrain() const
{
return terrain;
}
__________________
|
|
|
| Thread Tools |
|
|
| Display Modes |
Linear Mode
|
Posting Rules
|
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts
HTML code is Off
|
|
|
All times are GMT -8. The time now is 08:02 AM.
|
Copyright © 2000-2008, Milano Interactive
Web Hosting provided by Portal 360 Web Hosting
|
 |
|