Code Newbie
News     Forums     Search     Members     Sign Up    

My Code Newbie
Username

Password

Articles/Snippets
ASP Classic
ASP.NET
C
C#
C++
HTML / CSS
Java
Javascript
Linux / BSD
Perl
PHP
Python
Ruby
SQL
VB 6
VB.NET

C.N. Friends
  Planet Rome

Link to Us!
Code Newbie
  Code Newbie
    forums
Old 04-13-2005, 07:15 PM   #1 (permalink)
IbeNewb
Registered User
 
Join Date: Apr 2005
Posts: 5
IbeNewb is on a distinguished road
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?
IbeNewb is offline   Reply With Quote
Old 04-14-2005, 09:59 AM   #2 (permalink)
Valmont
[code][/code] enforcer
 
Valmont's Avatar
 
Join Date: Mar 2003
Location: Netherlands
Posts: 1,544
Valmont is on a distinguished road
First of all your program can't find ITerrainSceneNode. Did you include headers correctly for example?
__________________
Valmont is offline   Reply With Quote
Old 04-14-2005, 03:10 PM   #3 (permalink)
IbeNewb
Registered User
 
Join Date: Apr 2005
Posts: 5
IbeNewb is on a distinguished road
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.
IbeNewb is offline   Reply With Quote
Old 04-14-2005, 03:20 PM   #4 (permalink)
Valmont
[code][/code] enforcer
 
Valmont's Avatar
 
Join Date: Mar 2003
Location: Netherlands
Posts: 1,544
Valmont is on a distinguished road
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.
__________________
Valmont is offline   Reply With Quote
Old 04-14-2005, 03:29 PM   #5 (permalink)
IbeNewb
Registered User
 
Join Date: Apr 2005
Posts: 5
IbeNewb is on a distinguished road
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..
IbeNewb is offline   Reply With Quote
Old 04-14-2005, 04:48 PM   #6 (permalink)
Valmont
[code][/code] enforcer
 
Valmont's Avatar
 
Join Date: Mar 2003
Location: Netherlands
Posts: 1,544
Valmont is on a distinguished road
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);
}
__________________
Valmont is offline   Reply With Quote
Old 04-14-2005, 05:51 PM   #7 (permalink)
IbeNewb
Registered User
 
Join Date: Apr 2005
Posts: 5
IbeNewb is on a distinguished road
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();
IbeNewb is offline   Reply With Quote
Old 04-14-2005, 07:06 PM   #8 (permalink)
Valmont
[code][/code] enforcer
 
Valmont's Avatar
 
Join Date: Mar 2003
Location: Netherlands
Posts: 1,544
Valmont is on a distinguished road
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;
}
__________________
Valmont is offline   Reply With Quote
Old 04-14-2005, 07:13 PM   #9 (permalink)
IbeNewb
Registered User
 
Join Date: Apr 2005
Posts: 5
IbeNewb is on a distinguished road
Thank you very much

Everything is working correctly. I will recommend this site and it's community.
IbeNewb is offline   Reply With Quote
Old 04-14-2005, 11:39 PM   #10 (permalink)
Valmont
[code][/code] enforcer
 
Valmont's Avatar
 
Join Date: Mar 2003
Location: Netherlands
Posts: 1,544
Valmont is on a distinguished road
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;
}
__________________
Valmont is offline   Reply With Quote
Reply

Bookmarks

Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are On



All times are GMT -8. The time now is 08:02 AM.


Powered by vBulletin® Version 3.7.0
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.0.0 RC8





Copyright © 2000-2008, Milano Interactive
Web Hosting provided by Portal 360 Web Hosting