Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
koso
Založen: 28. 05. 2009 Příspěvky: 110
|
Zaslal: 5. leden 2010, 12:18:11 Předmět: potrebujem poradit s konštruktorom (C++) |
|
|
v jednom cpp súbore mám vytvorenú triedu takto
kód: |
class DemoListener : public ExampleFrameListener, public OIS::MouseListener, public OIS::KeyListener |
rovno v tom súbore sú aj zadefinované všetky jej fcie a konštruktor vyzerá takto
kód: |
DemoListener(RenderWindow* win, Camera* cam, SceneManager *sceneManager, CEGUI::Renderer *renderer, ET::TerrainManager* terrainMgr, ET::SplattingManager* splatMgr)
: ExampleFrameListener(win, cam, true, true), mGUIRenderer(renderer), mTerrainMgr(terrainMgr), mTerrainInfo(&terrainMgr->getTerrainInfo()), mSplatMgr(splatMgr)
{ |
rovno v tom súbore sú jej fcie použité v inej triede.
ja sa pokúšam spraviť túto triedu do samostatného .cpp a .h súboru aby som ju mohol používať aj mimo toho prvého.nedarí sa mi to ale skompilovať.
moja definicia v .h súbore je takáto
kód: |
class DemoListener : public ExampleFrameListener, public OIS::MouseListener, public OIS::KeyListener
{
public:
DemoListener(RenderWindow* win, Camera* cam, SceneManager *sceneManager, CEGUI::Renderer *renderer,
ET::TerrainManager* terrainMgr, ET::SplattingManager* splatMgr);
~DemoListener();
...} |
potom v mojom cpp zavolám konštruktor aby som nastavil premenné
kód: |
DemoListener::DemoListener(RenderWindow* win, Camera* cam, SceneManager *sceneManager, CEGUI::Renderer *renderer, ET::TerrainManager* terrainMgr, ET::SplattingManager* splatMgr)
: ExampleFrameListener(win, cam, true, true), mGUIRenderer(renderer), mTerrainMgr(terrainMgr), mTerrainInfo(&terrainMgr->getTerrainInfo()), mSplatMgr(splatMgr)
{
|
stále mám problém s definíciou konštruktora v .h súbore. kompiler stále vypisuje error.
mohol by mi niekto poradit ako by mal vyzerať konštruktor v mojom .h súbore, podla pôvodného(to je ten prvý kód)
vopred ďakujem |
|
Návrat nahoru |
|
|
Sirall
Založen: 02. 08. 2007 Příspěvky: 68 Bydliště: Praha 4 Nusle
|
Zaslal: 5. leden 2010, 14:23:47 Předmět: Re: potrebujem poradit s konštruktorom (C++) |
|
|
Co ti kompiler hlásí za chybu? |
|
Návrat nahoru |
|
|
koso
Založen: 28. 05. 2009 Příspěvky: 110
|
Zaslal: 5. leden 2010, 15:01:36 Předmět: |
|
|
terrainediting.cpp : error C2511: 'terrainEditingListener::terrainEditingListener(Ogre::RenderWindow *,Ogre::Camera *,Ogre::SceneManager *,CEGUI::Renderer *,ET::TerrainManager *,ET::SplattingManager *)' : overloaded member function not found in 'terrainEditingListener' |
|
Návrat nahoru |
|
|
Sirall
Založen: 02. 08. 2007 Příspěvky: 68 Bydliště: Praha 4 Nusle
|
Zaslal: 5. leden 2010, 15:11:35 Předmět: |
|
|
Možná jsem blázen, ale chyba je na první pohled jinde, než třída kterou uvádíš. Podle chyby bych řekl, že ve třídě terrainEditingListener, ti schází konstruktor s parametry (Ogre::RenderWindow *,Ogre::Camera *,Ogre::SceneManager *,CEGUI::Renderer *,ET::TerrainManager *,ET::SplattingManager *). Z toho co jsi uvedl, ale nevidím přímou souvislost s tvou třídou DemoListener. |
|
Návrat nahoru |
|
|
koso
Založen: 28. 05. 2009 Příspěvky: 110
|
Zaslal: 5. leden 2010, 15:40:57 Předmět: |
|
|
ospravedlnujem sa, ta trieda terrainEditingListener je vlastne DemoListener.
predtym ako som sem posielal ten error som to poprepisoval. Prosim, skus sa na to pozriet tak ze vlastne mas triedu v cpp subore definovanu, vytvorenua jej fcie pouziva hned ina trieda v tom istom subore.
Chces ju ale spravit tak aby si si ju mohol naincludovat do inych projektov. co by si dal do konstruktora v .h subore? vychadzaj pritom z prveho kodu v prvom prispevku.to je ta trieda iba v .cpp subore |
|
Návrat nahoru |
|
|
Sirall
Založen: 02. 08. 2007 Příspěvky: 68 Bydliště: Praha 4 Nusle
|
Zaslal: 5. leden 2010, 16:09:58 Předmět: |
|
|
V tom tvém zápisu chybu nevidím, nejsou tam ale informace o includech atp. Každopádně správný zápis by měl vypadat např takto:
class.h:
kód: |
class A
{
public:
A(int a);
};
class B
{
public:
B();
};
class C
{
public:
C(int c);
};
class D : public A, public B, public C
{
int* v1;
int* v2;
int* v3;
public:
D(int* v1, int* v2, int* v3);
~D();
void test();
}; |
class.cpp:
kód: |
#include "class.h"
A::A(int a)
{
}
B::B()
{
}
C::C(int c)
{
}
D::D(int* v1, int* v2, int* v3) : A(0), B(), C(0), v1(v1), v2(v2), v3(v3)
{
//...
}
D::~D()
{
//...
}
void D::test()
{
// ..
} |
Edit: Normálně bych tedy měl každou třídu v jiném souboru, to ale je analogie. Musí se to jen správně naincludovat. |
|
Návrat nahoru |
|
|
koso
Založen: 28. 05. 2009 Příspěvky: 110
|
Zaslal: 5. leden 2010, 16:22:37 Předmět: |
|
|
neviem si s tym poradit. tu je moj terrainEditing.h:
kód: |
#ifndef __TERRAINEDITING_H__
#define __TERRAINEDITING_H__
#include <OgreNoMemoryMacros.h>
#include <CEGUI/CEGUISystem.h>
#include <CEGUI/CEGUISchemeManager.h>
#include <OgreCEGUIRenderer.h>
#include "ExampleApplication.h"
#include "ETTerrainManager.h"
#include "ETTerrainInfo.h"
#include "ETBrush.h"
#include "ETSplattingManager.h"
using namespace std;
using Ogre::uint;
class terrainEditingListener : public ExampleFrameListener, public OIS::MouseListener, public OIS::KeyListener
{
public:
terrainEditingListener(RenderWindow* win, Camera* cam, SceneManager *sceneManager, CEGUI::Renderer *renderer, ET::TerrainManager* terrainMgr, ET::SplattingManager* splatMgr);
~terrainEditingListener();
void createEditBrush();
bool frameStarted(const FrameEvent &evt);
virtual bool mousePressed( const OIS::MouseEvent &arg, OIS::MouseButtonID id );
virtual bool mouseReleased( const OIS::MouseEvent &arg, OIS::MouseButtonID id );
virtual bool mouseMoved( const OIS::MouseEvent &arg );
virtual bool keyPressed(const OIS::KeyEvent& arg);
virtual bool keyReleased(const OIS::KeyEvent& arg);
void saveTerrain();
void loadTerrain();
void updateLightmap();
protected:
RaySceneQuery *mRaySceneQuery; //ray scene query pointer
bool mLMouseDown, mRMouseDown; //true ak je tlacitko stlacene
bool mMMouseDown;
SceneManager *mSceneMgr; //pointer na scene manager
SceneNode *mPointer; //pointer na terrain
CEGUI::Renderer *mGUIRenderer; //cegui renderer
ET::Brush mEditBrush; //stetec na terrain editing
bool mDeform; //indikuje ktory mod pouzivame(deform , paint)
uint mChosenTexture; //ktora zo 4 textures je pouzivana?
//pohyb
Vector3 mDirection;
bool mMove;
SceneNode* mCamNode;
bool mContinue;
ET::TerrainManager* mTerrainMgr;
const ET::TerrainInfo* mTerrainInfo;
ET::SplattingManager* mSplatMgr;
};
#endif |
a tu je terrainEditing.cpp
kód: |
#include "terrainEditing.h"
terrainEditingListener::terrainEditingListener(RenderWindow* win, Camera* cam, SceneManager *sceneManager, CEGUI::Renderer *renderer, ET::TerrainManager* terrainMgr, ET::SplattingManager* splatMgr)
: ExampleFrameListener(win, cam, true, true), mGUIRenderer(renderer), mTerrainMgr(terrainMgr), mTerrainInfo(&terrainMgr->getTerrainInfo()), mSplatMgr(splatMgr)
{
//zakladne premenne
mPointer = NULL;
mLMouseDown = false;
mRMouseDown = false;
mMMouseDown = false;
mSceneMgr = sceneManager;
//rychlost pohybu
mMoveSpeed = 320;
mRotateSpeed *= 0.008;
//registracia udalosti(eventov)
mMouse->setEventCallback( this );
mKeyboard->setEventCallback(this);
//vytvori RaySceneQuery
mRaySceneQuery = mSceneMgr->createRayQuery( Ray() );
//vytvori pointer pre pracu z terenom
Entity* pointer = mSceneMgr->createEntity("Pointer", "ogrehead.mesh");
mPointer = mSceneMgr->getRootSceneNode()->createChildSceneNode();
mPointer->attachObject(pointer);
//inicializuje poziciu CEGUI kurzora
CEGUI::MouseCursor::getSingleton().setPosition(CEGUI::Point(CEGUI::Vector2(0,0)));
createEditBrush();
mDeform = true;
mChosenTexture = 0;
mDirection = Vector3::ZERO;
mContinue = true;
mCamNode = mCamera->getParentSceneNode();
}
terrainEditingListener::~terrainEditingListener( )
{
delete mRaySceneQuery;
}
terrainEditingListener::createEditBrush()
{
// load the edit brush for terrain editing
Image image;
image.load("brush.png", "ET");
image.resize(16, 16);
mEditBrush = ET::loadBrushFromImage(image);
}
terrainEditingListener::frameStarted(const FrameEvent &evt)
{
if (!ExampleFrameListener::frameStarted( evt ))
return false;
// handle movement
mCamNode->translate(mCamera->getOrientation()*mDirection*mMoveSpeed*evt.timeSinceLastFrame);
// Ensure we stay above terrain (somehow buggy still, doesn't work reliably)
Vector3 camPos = mCamNode->getPosition( );
// get terrain height at camPos
float terrainHeight = mTerrainInfo->getHeightAt(camPos.x, camPos.z);
if ((terrainHeight + 30.0f) > camPos.y)
mCamNode->setPosition(camPos.x, terrainHeight+30.0f, camPos.z);
if (mLMouseDown || mRMouseDown)
{
// deform or paint terrain on mouse down
// left button raises, right button lowers
if (mDeform)
{
// choose a brush intensity, this determines
// how extreme our brush works on the terrain
float brushIntensity = evt.timeSinceLastFrame * 0.2 * (mLMouseDown? 1 : -1);
// translate our cursor position to vertex indexes
Vector3 deformPos = mPointer->getPosition();
int x = mTerrainInfo->posToVertexX(deformPos.x);
int z = mTerrainInfo->posToVertexZ(deformPos.z);
// now tell the ETM to deform the terrain
mTerrainMgr->deform(x, z, mEditBrush, brushIntensity);
}
else
{
// need to set our brush intensity larger for painting.
// for painting, all texture channels are only 1 byte
// large, so with a small intensity you won't get any
// effect at all.
float brushIntensity = evt.timeSinceLastFrame * 5.0 * (mLMouseDown? 1 : -1);
// retrieve edit points
Vector3 paintPos = mPointer->getPosition();
int x = mTerrainInfo->posToVertexX(paintPos.x);
int z = mTerrainInfo->posToVertexZ(paintPos.z);
// now use the splatting manager to update the coverage maps
mSplatMgr->paint(mChosenTexture, x, z, mEditBrush, brushIntensity);
}
}
return mContinue;
}
terrainEditingListener::mousePressed(const OIS::MouseEvent &arg, OIS::MouseButtonID id)
{
// Left mouse button down
if ( id == OIS::MB_Left )
{
mLMouseDown = true;
}
// Middle mouse button down
else if ( id == OIS::MB_Middle )
{
CEGUI::MouseCursor::getSingleton().hide( );
mMMouseDown = true;
}
else if (id == OIS::MB_Right)
{
mRMouseDown = true;
}
return true;
}
terrainEditingListener::mouseReleased(const OIS::MouseEvent &arg, OIS::MouseButtonID id)
{
// Left mouse button up
if ( id == OIS::MB_Left )
{
mLMouseDown = false;
// after completed deformation steps, recalculate the lightmap
if (mDeform)
updateLightmap();
}
// Middle mouse button up
else if ( id == OIS::MB_Middle )
{
CEGUI::MouseCursor::getSingleton().show( );
mMMouseDown = false;
}
else if (id == OIS::MB_Right)
{
mRMouseDown = false;
// after completed deformation steps, recalculate the lightmap
if (mDeform)
updateLightmap();
}
return true;
}
terrainEditingListener::mouseMoved(const OIS::MouseEvent &arg)
{
// Update CEGUI with the mouse motion
CEGUI::System::getSingleton().injectMouseMove( arg.state.X.rel, arg.state.Y.rel );
// whenever the mouse is moved, we update the position on the
// terrain to which the mouse is currently pointing
Ray mouseRay = mCamera->getCameraToViewportRay(arg.state.X.abs/float(arg.state.width), arg.state.Y.abs/float(arg.state.height));
// since ETM is no longer a scene manager, we don't use a ray scene query,
// but instead query the terrain info directly
std::pair<bool, Vector3> result = mTerrainInfo->rayIntersects(mouseRay);
if (result.first)
{
// update pointer's position
mPointer->setPosition(result.second);
}
// If we are dragging the middle mouse button.
if ( mMMouseDown )
{
mCamera->yaw( Degree(-arg.state.X.rel * mRotateSpeed) );
mCamera->pitch( Degree(-arg.state.Y.rel * mRotateSpeed) );
}
return true;
}
terrainEditingListener::keyPressed(const OIS::KeyEvent &arg)
{
// we'll use the keys 1, 2, 3, 4 and E to switch between
// edit modes and select a paint texture
// WSAD is used for movement
// O will save the changes to disk
switch (arg.key)
{
case OIS::KC_1:
mDeform = false;
mChosenTexture = 0;
return true;
case OIS::KC_2:
mDeform = false;
mChosenTexture = 1;
return true;
case OIS::KC_3:
mDeform = false;
mChosenTexture = 2;
return true;
case OIS::KC_4:
mDeform = false;
mChosenTexture = 3;
return true;
case OIS::KC_5:
mDeform = false;
mChosenTexture = 4;
return true;
case OIS::KC_6:
mDeform = false;
mChosenTexture = 5;
return true;
case OIS::KC_E:
mDeform = true;
return true;
case OIS::KC_W:
mDirection.z += -1;
return true;
case OIS::KC_S:
mDirection.z += 1;
return true;
case OIS::KC_A:
mDirection.x += -1;
return true;
case OIS::KC_D:
mDirection.x += 1;
return true;
// case OIS::KC_O:
// saveTerrain();
// return true;
// case OIS::KC_P:
// loadTerrain();
// return true;
case OIS::KC_ESCAPE:
mContinue = false;
return true;
default:
return false;
}
}
terrainEditingListener::keyReleased(const OIS::KeyEvent &arg)
{
// not interested in this
switch (arg.key)
{
case OIS::KC_W:
mDirection.z -= -1;
return true;
case OIS::KC_S:
mDirection.z -= 1;
return true;
case OIS::KC_A:
mDirection.x -= -1;
return true;
case OIS::KC_D:
mDirection.x -= 1;
return true;
default:
return false;
}
}
terrainEditingListener::saveTerrain()
{
// just for demonstration, we'll save anything we can
// start with the terrain
Image image;
ET::saveHeightmapToImage(*mTerrainInfo, image);
image.save("../../Media/ET/ETterrain.png");
// now save the splatting maps
for (uint i = 0; i < mSplatMgr->getNumMaps(); ++i)
{
mSplatMgr->saveMapToImage(i, image);
image.save("../../Media/ET/ETcoverage."+StringConverter::toString(i)+".png");
}
// now the lightmap
Image lightmap;
ET::createTerrainLightmap(*mTerrainInfo, lightmap, 512, 512, Vector3(1, -1, 1), ColourValue(1,1,1),
ColourValue(0.3, 0.3, 0.3));
lightmap.save("../../Media/ET/ETlightmap.png");
// generate a base texture for this terrain (could be used for older hardware instead of splatting)
// create an ImageList of our splatting textures.
ET::ImageList textures (6);
for (int i = 0; i < 6; ++i)
textures[i].load("splatting"+StringConverter::toString(i)+".png", "ET");
// create the base texture
Image baseTexture;
mSplatMgr->createBaseTexture(baseTexture, 512, 512, textures, 20, 20);
baseTexture.save("../../Media/ET/ETbase.png");
// finally create a minimap using the lightmap and the generated base texture
Image minimap = ET::createMinimap(baseTexture, lightmap);
minimap.save("../../Media/ET/ETminimap.png");
}
terrainEditingListener::loadTerrain()
{
// now we revert the process and load the data back from disk
// recreate terrain...
mTerrainMgr->destroyTerrain();
Image image;
image.load("ETterrain.png", "ET");
ET::TerrainInfo info;
ET::loadHeightmapFromImage(info, image);
info.setExtents(AxisAlignedBox(0, 0, 0, 1500, 300, 1500));
mTerrainMgr->createTerrain(info);
mTerrainInfo = & mTerrainMgr->getTerrainInfo();
// now load the splatting maps
for (uint i = 0; i < mSplatMgr->getNumMaps(); ++i)
{
image.load("ETcoverage."+StringConverter::toString(i)+".png", "ET");
mSplatMgr->loadMapFromImage(i, image);
}
// update the lightmap
updateLightmap();
}
terrainEditingListener::updateLightmap()
{
Image lightmap;
ET::createTerrainLightmap(*mTerrainInfo, lightmap, 128, 128, Vector3(1, -1, 1), ColourValue(1,1,1),
ColourValue(0.3, 0.3, 0.3));
// get our dynamic texture and update its contents
TexturePtr tex = TextureManager::getSingleton().getByName("ETLightmap");
tex->getBuffer(0, 0)->blitFromMemory(lightmap.getPixelBox(0, 0));
} |
prosim mrkni sa na to. neviem co s tym |
|
Návrat nahoru |
|
|
Deluxe
Založen: 31. 07. 2007 Příspěvky: 235 Bydliště: Oslavany
|
Zaslal: 5. leden 2010, 16:46:31 Předmět: |
|
|
Nemohl by byt problem ze ve tvym kodu nespecifikujes namespace? neni rozdil mezi RenderWindow a Ogre::RenderWindow...?
Mas tam sice "using Ogre::uint" ale tim importujes jen typ uint. |
|
Návrat nahoru |
|
|
Sirall
Založen: 02. 08. 2007 Příspěvky: 68 Bydliště: Praha 4 Nusle
|
Zaslal: 5. leden 2010, 16:56:25 Předmět: |
|
|
Tak nevím, když si ty třídy nahradím, tak mi to funguje. Řekl může být problém s namespace, které používáš v header souboru - já osobně dávám v header souborech celou cestu, tj. místo using Ogre::uint píšu všude Ogre::uint a using používám jen v cpp.
Jiný problém mě nenapadá |
|
Návrat nahoru |
|
|
Sirall
Založen: 02. 08. 2007 Příspěvky: 68 Bydliště: Praha 4 Nusle
|
Zaslal: 5. leden 2010, 16:56:59 Předmět: |
|
|
Deluxe napsal: |
Nemohl by byt problem ze ve tvym kodu nespecifikujes namespace? neni rozdil mezi RenderWindow a Ogre::RenderWindow...?
Mas tam sice "using Ogre::uint" ale tim importujes jen typ uint. |
Heh, byl jsem předběhnut |
|
Návrat nahoru |
|
|
koso
Založen: 28. 05. 2009 Příspěvky: 110
|
Zaslal: 5. leden 2010, 17:07:16 Předmět: |
|
|
ja som si myslel ze som idiot ale ja som megaidiot . V terrainEditing.cpp som nemal pred vsetkymi fciami napisany datovy typ .
mam vsak este jeden problem.NWM co je entry point takze ani nwm ako ho definovat.tipujem ze je to niekde v project properities.mozete mi este ozrejmit toto.
kód: |
1>LINK : fatal error LNK1561: entry point must be defined |
|
|
Návrat nahoru |
|
|
Sirall
Založen: 02. 08. 2007 Příspěvky: 68 Bydliště: Praha 4 Nusle
|
Zaslal: 5. leden 2010, 17:12:05 Předmět: |
|
|
Heh, též jsem si nevšiml Podle chyby jsem se zaměřil na konstruktor.
S aktuální chybou je lehké pořízení, schází ti v aplikaci main |
|
Návrat nahoru |
|
|
rezna
Založen: 27. 07. 2007 Příspěvky: 2156
|
Zaslal: 5. leden 2010, 17:13:07 Předmět: |
|
|
ze by
? |
|
Návrat nahoru |
|
|
Deluxe
Založen: 31. 07. 2007 Příspěvky: 235 Bydliště: Oslavany
|
Zaslal: 5. leden 2010, 17:14:09 Předmět: |
|
|
nebo mozna WinMain(...) |
|
Návrat nahoru |
|
|
|