Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Stefan

Alter Hase

  • »Stefan« ist der Autor dieses Themas

Beiträge: 668

Wohnort: Innsbruck

  • Private Nachricht senden

1

14.02.2006, 13:56

Denkfehler bei Zeiger

Hallo!

Ich hab leider gerade einen Denkfehler und finde keine Lösung :D
Das ist der Zeiger den ich mit meiner Szene füllen möchte
const Scene * gpScene = NULL; // global scene class

Füllen des Zeigers
gpScene = createScene();

Und hier die Funktion:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
const Scene * createScene()
{
  Scene * pNCScene = beginEdit(Scene::create());
  pNCScene->addRef(); // don't be irritated, for add/removeRef 

  // you do not need a non const pointer


..........
...
...
 return endEdit(pNCScene);
}


Das funktioniert alles wunderbar, aber jetzt möchte ich die Funktion createScene() in meine Klasse einbauen.
Ich dachte zuerst:
void CreateScene(const nvsg::Scene *pnScene);
Aber das geht leider nicht!

Dann hab ichs noch so probiert:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
void CreateScene(const nvsg::Scene *pnScene2);
{
  Scene * pNCScene = beginEdit(Scene::create());
  pNCScene->addRef(); // don't be irritated, for add/removeRef 

  // you do not need a non const pointer


..........
...
...
 endEdit(pNCScene);
  pnScene2 = pNCScene;
}


Geht aber leider auch nicht :) Also ich hoffe ihr könnt mir helfen. Ich steh wohl gerade auf der Leitung^^

cya,
Stefan

rewb0rn

Supermoderator

Beiträge: 2 773

Wohnort: Berlin

Beruf: Indie Game Dev

  • Private Nachricht senden

2

14.02.2006, 14:01

Könntest du dein Problem genauer darstellen? zB Fehlermeldung?
Ich verstehe schon gar nicht, warum du

C-/C++-Quelltext

1
2
const Scene * gpScene = NULL; // global scene class

gpScene = createScene();

machst, das kann ja gar nicht klappen, weil du den Wert einer Konstanten nicht ändern kannst. Wenn du ne Konstante für den Parameter einer Funktion brauchst kannste auch

C-/C++-Quelltext

1
2
3
Scene * gpScene = NULL; // global scene class

gpScene = createScene();
Funktion(static_cast<const Scene>(gpScene));

machen.

Stefan

Alter Hase

  • »Stefan« ist der Autor dieses Themas

Beiträge: 668

Wohnort: Innsbruck

  • Private Nachricht senden

3

14.02.2006, 14:13

Mein Ziel ist es die Funktion

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
const Scene * createScene()
{
  Scene * pNCScene = beginEdit(Scene::create());
  pNCScene->addRef(); // don't be irritated, for add/removeRef

  // you do not need a non const pointer


..........
...
...
 return endEdit(pNCScene);
}


in meine Klasse einzubauen. Bis jetzt ist mir dann aber immer die Anwendung abgestürtzt.

// steht in der main-Funktion
Terrain->CreateScene(gpScene);


C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
void TerrainCreateScene(const nvsg::Scene *pnScene2);
{
  Scene * pNCScene = beginEdit(Scene::create());
  pNCScene->addRef(); // don't be irritated, for add/removeRef

  // you do not need a non const pointer


..........
...
...
 endEdit(pNCScene);
pnScene2  = pNCScene;
 }


Also ich weiß eben jetzt nicht ganz, wie ich die obere Funktion richtig einbauen kann..weil ich habe ja leider nicht die Möglichkeit den pNCScene zeiger wie zuvor als return Wert zurück zu geben.

cya,
Stefan

Black-Panther

Alter Hase

Beiträge: 1 443

Wohnort: Innsbruck

  • Private Nachricht senden

4

14.02.2006, 14:26

hmmm ich versteh dein Problem nicht! Könntest du es bitte ein bisschen genauer beschreiben? WELCHE Funktion willst du in WELCHE Klasse einbauen, um damit WAS zu erreichen? FEHLER? Quellcode der anderen Klasse (wenn relevant), Logik dieser beiden Klassen... ?
stillalive studios
Drone Swarm (32.000 Dronen gleichzeitig steuern!)
facebook, twitter

Stefan

Alter Hase

  • »Stefan« ist der Autor dieses Themas

Beiträge: 668

Wohnort: Innsbruck

  • Private Nachricht senden

5

14.02.2006, 14:42

Okay, ich beginne am besten nocheinmal von vorne :)

Ich hatte bis jetzt alles in Funktionen und wollte jetzt die Erstellung meines SceneGraph in eine Methode der Klasse Terrain einbauen.

Ich zeige euch hier nochmal meine alte Version:
const Scene * gpScene = NULL; // global scene class
..
...

In der main-Funktion erstelle ich meinen Baum, der sollte in Zukunft in meiner Terrain Klasse erzeugt werden.
gpScene = createScene();

Und das ist die Funktion dazu:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
const Scene * createScene()
{
  Scene * pNCScene = beginEdit(Scene::create());
  pNCScene->addRef(); // don't be irritated, for add/removeRef 

  // you do not need a non const pointer


  pNCScene->setBackColor(Vec3f(1,0,0));  // but here ;-)


...//hier is noch ewig langer code

....
return endEdit(pNCScene);
}



So mein Ziel ist es jetzt die Funktion createScene in die TerrainKlasse einzubauen.
So das ich in der Main-Funktion dann Terrain->CreateScene aufrufen kann und die globale const Scene * gpScene; meinen fertigen Baum enthält.


Mein Problem, ich kann in der Klasse ja nicht den Rückgabetyp const Scene * so wie in meiner Funktion erzeugen, sondern muss das irgendwie anderst lösen, nur wie?

Ich hoffe ihr habt mein Problem irgendwie verstanden, ist irgendwie blöd zu beschreiben...

cya,
Stefan

rewb0rn

Supermoderator

Beiträge: 2 773

Wohnort: Berlin

Beruf: Indie Game Dev

  • Private Nachricht senden

6

14.02.2006, 14:52

Moment also willst du, dass die Funktion der Klasse die globale Variable gpScene erstellt (was man auf gar keinen Fall machen sollte) oder soll die Funktion einfach nur einen neuen Baum zurückgeben (der dann, was aber in dem Fall uninteressant wäre, gpScene zugewiesen wird)?

Jedenfalls ist beides schon falsch, wenn du doch selber sagst du baust dir eine Terrainklasse. Diese sollte dann als Membervariable den Baum enthalten (den du ja durch eine Funktion zurückgeben könntest). Eine Klasse ist schließlich eine Klasse und keine Funktionsbibliothek.

Stefan

Alter Hase

  • »Stefan« ist der Autor dieses Themas

Beiträge: 668

Wohnort: Innsbruck

  • Private Nachricht senden

7

14.02.2006, 16:03

danke für die hilfe.
Naja, die erste Möglichkeit ist nicht meine sondern die aus dem Sample von Nvidia.
Aber ich habe mich nochmals in der Doku schlau gemacht und eine bessere Möglichkeit gefunden. Ich kann die Klasse als Groupe Node ableiten und sie dann in der Main-Funktion hinzufügen.

C-/C++-Quelltext

1
2
Terrain * terrain = beginEdit( Terrain ::create() );
  pNCScene->setRootNode(endEdit(terrain));


Somit hat sich mein Problem gelöst :)


cya,
Stefan

rewb0rn

Supermoderator

Beiträge: 2 773

Wohnort: Berlin

Beruf: Indie Game Dev

  • Private Nachricht senden

8

15.02.2006, 09:10

Zitat von »"Stefan"«

die erste Möglichkeit ist nicht meine sondern die aus dem Sample von Nvidia.


Die werden keine Klasse geschrieben haben aus deren Methode heraus eine globale Variable angesprochen wird, sondern eine Funktion in der main.cpp. Das isn großer Unterschied. Klassen sollten in sich geschlossen sein und nur auf Membervariablen zugreifen. Im Zweifelsfall darfs auch ne statische Klasse oder besser n Singleton sein, das benutzt wird, das wars dann aber auch.

Stefan

Alter Hase

  • »Stefan« ist der Autor dieses Themas

Beiträge: 668

Wohnort: Innsbruck

  • Private Nachricht senden

9

15.02.2006, 11:28

ja stimmt, dass haben sie nicht - danke dir für deine Erklärung.

Werbeanzeige