Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » Engine-Problem

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ] [ 3 ]
000
07.03.2006, 23:14 Uhr
Marco15



HI Leuts!

Ich hab nach ein paar Schwierigkeiten endlich geschafft die Genesis3D Header Datein und LibraryDatein einzubinden. Jetzt wollte ich ein Beispiel aus dem Buch Spieleprogrammierung mit C++ und Genesis3d kompilieren, aber da kommen Fehler, die ich noch nie hatte und wenn ich in der Hilfe nachlese, dann seh ich das so, als hätte ich die EngineDateien nicht richtig eingefügt.

Folgendes Beispiel:


Code:

//---------------------------------------------------
// Game1.cpp :
// Nur Anzeige von BSP-Welt (ohne Bewegungen)
//---------------------------------------------------

#include "Game1.h"

// Spielobjekt
TGame Game;

// Vorwärtsdeklaration (für Fensterereignisse)
LRESULT CALLBACK WndProc (HWND hWnd,
  UINT iMessage, WPARAM wParam, LPARAM lParam);

// Windows-Hauptfunktion mit Game-Schleife
int WINAPI WinMain
  (HINSTANCE hInstance, HINSTANCE hPrevInstance,
   LPSTR lpCmdLine, int nCmdShow)
{
  // Fensterklasse initialisieren
  WNDCLASS Win;     // Objekt der Fensterklasse
  MSG      msg;     // Aktuelle Meldung
  // Extrabytes für Klassen/Fensterinstanz
  Win.cbClsExtra = 0;
  Win.cbWndExtra = 0;
  // Instanz der Fensterklasse
  Win.hInstance  = hInstance;    
  // Symbol und Cursor der Fensterklasse
  Win.hIcon = LoadIcon(hInstance, IDI_APPLICATION);
  Win.hCursor = LoadCursor(NULL, IDC_ARROW);
  // Hintergrundfarbe (schwarz) und Fensterstil
  Win.hbrBackground =
    (HBRUSH)GetStockObject(BLACK_BRUSH);
  Win.style = CS_HREDRAW | CS_VREDRAW;
  // Verknüpfung mit Ereignis-Routine
  Win.lpfnWndProc = WndProc;
  // Name der Fensterklasse
  Win.lpszClassName = GVersion;
  Win.lpszMenuName = NULL;    // kein Menü
  // Registrierung der Fensterklasse
  RegisterClass (&Win);
  // Fenster erzeugen
  GHandle = CreateWindow (Win.lpszClassName,
    "Genesis3D - [Esc]=Ende", WS_TILED,
    CW_USEDEFAULT, CW_USEDEFAULT, MaxWidth,
    MaxHeight, NULL, NULL, hInstance, NULL);
  if (!GHandle)
  {
    return 0;  // nicht ok
  }
  // Mauszeiger verbergen
  ShowCursor (false);
  // Fenster zeigen und "auffrischen"
  ShowWindow   (GHandle, nCmdShow);
  UpdateWindow (GHandle);
  // Spielinitialisierung
  Game.CreateGame ();
  // Spielmodus auf "Laufen" einstellen
  Game.isRunning = true;
  // Solange Spiel "läuft"
  while (Game.isRunning)
  {
    // evtl. Fenstereignisse abfragen
    while (PeekMessage
      (&msg, NULL, 0, 0, PM_NOREMOVE))
    {
      // Spielverlauf
      Game.RunGame ();
      if (!GetMessage(&msg, NULL, 0, 0))
      {
        Game.isRunning = false;
        break;
      }
      // Ereignisdaten auswerten (lassen)
      TranslateMessage (&msg);
      DispatchMessage  (&msg);
    }
  }
  // Programm-/Spielende
  Game.FreeGame ();
  return 1;  // ok
}

// Verarbeitung der Fensterereignisse
LRESULT CALLBACK WndProc (HWND hWnd,
  UINT iMessage, WPARAM wParam, LPARAM lParam)
{
  // Ereignis auswerten
  switch (iMessage)
  {
    case WM_KEYDOWN:
    {
      switch (wParam)
      {
        case VK_ESCAPE:  // Spielende mit [Esc]-Taste
        {
          PostMessage(hWnd, WM_QUIT, 0, 0);
        }
      }
    }
    // ansonsten Ereignis an "Default-Handler"
    default:
      return DefWindowProc
        (hWnd, iMessage, wParam, lParam);
  }
  return 0;
}

//---------------------------------------------------

// Spiel initialisieren/"aufbauen"
void TGame::CreateGame (void)
{
  geRect   WorldScreen;    // Anzeigefläche
  char     WorldName[64];  // Name der Welt/Level
  geVFile *WorldFile;      // BSP-Datei (Welt/Level)

  // 3D-Engine initialisieren
  Engine = geEngine_Create (GHandle, GVersion, ".");
  if (!Engine) ExitError
    ("3D-Engine kann nicht gestartet werden!");
  // Anzeigedaten für Engine ausschalten
  geEngine_EnableFrameRateCounter(Engine, GE_FALSE);
  // Treiber auswählen
  SetDriver ();
  // Anzeigefläche festlegen
  WorldScreen.Left   = 0;
  WorldScreen.Right  = MaxWidth  - 1;
  WorldScreen.Top    = 0;
  WorldScreen.Bottom = MaxHeight - 1;
  // Koordinaten-Matrix setzen
  geXForm3d_SetIdentity (&XForm);
  // Kamera initialisieren
  Camera = geCamera_Create (2.0, &WorldScreen);
  if (!Camera) ExitError
    ("Kamera kann nicht installiert werden!");
  // BSP-Datei laden
  strcpy (WorldName, Pfad);
  strcat (WorldName, BSP_Datei);
  WorldFile = geVFile_OpenNewSystem (NULL,
    GE_VFILE_TYPE_DOS, WorldName, NULL,
    GE_VFILE_OPEN_READONLY);
  // Wenn Datei ok, Welt/Level erzeugen
  if (WorldFile)
  {
    World = geWorld_Create(WorldFile);
    geVFile_Close(WorldFile);
  };
  if (!World) ExitError
    ("Welt/Level lässt sich nicht erzeugen!");
  // Welt/Level mit 3D-Engine verknüpfen
  if (!geEngine_AddWorld(Engine, World)) ExitError
    ("Welt/Level lässt sich nicht einbinden!");
}

//---------------------------------------------------

// Spiel "in Szene setzen"
void TGame::RunGame (void)
{
  // Koordinaten und Winkel ausrichten
  geXForm3d_SetIdentity (&XForm);
  geXForm3d_RotateX (&XForm, 0.0);
  geXForm3d_RotateY (&XForm, 0.0);
  geXForm3d_RotateZ (&XForm, 0.0);
  geXForm3d_Translate (&XForm, 0.0, 0.0, 0.0);
  geCamera_SetWorldSpaceXForm (Camera, &XForm);
  // Rendering starten
  if (!geEngine_BeginFrame(Engine, Camera, GE_TRUE))
    ExitError ("BeginFrame gescheitert!");
  // Welt/Level rendern und darstellen
  if (!geEngine_RenderWorld
    (Engine, World, Camera, 0.0)) ExitError
      ("Rendering gescheitert!");
  // Rendering beenden
  if (!geEngine_EndFrame(Engine)) ExitError
    ("EndFrame gescheitert!");
}

//---------------------------------------------------

// Spiel "abbauen"
void TGame::FreeGame (void)
{
  // Kamera, Welt und Engine freigeben
  if (Camera) geCamera_Destroy (&Camera);
  if (World) geWorld_Free (World);
  if (Engine)
  {
     geEngine_ShutdownDriver(Engine);
     geEngine_Free (Engine);
  }
  // Zeiger "nullen"
  Camera = NULL; World = NULL; Engine = NULL;
}

//--------------------------------------------------

// Grafiktreiber/modus wählen/setzen
void TGame::SetDriver (void)
{
  geDriver_System *DriverSystem; long Breite, Hoehe;
  // Treibersystem "einbetten"
  DriverSystem = geEngine_GetDriverSystem (Engine);
  if (!DriverSystem)
    ExitError ("Kein Treibersystem gefunden!");
  // DirectX-Grafiktreiber aufnehmen
  Driver = geDriver_SystemGetNextDriver
    (DriverSystem, NULL);
  if (!Driver) ExitError ("Treiber nicht gefunden!");
  // Suchschleife für Grafikmodus
  DMode = geDriver_GetNextMode (Driver, NULL);
  // Liste nach passendem Modus durchsuchen
  while(true)
  {
    if (!DMode) ExitError ("Falscher Treibermodus!");
    // Auflösungswerte ermitteln
    geDriver_ModeGetWidthHeight
      (DMode, &Breite, &Hoehe);
    // Wenn Maße passen, Schleife verlassen
    if (Breite == MaxWidth && Hoehe == MaxHeight) break;
    // Ansonsten weitersuchen
    DMode = geDriver_GetNextMode (Driver, DMode);
  }
  // Grafiktreiber/modus überprüfen
  if ((!Driver) || (!DMode)) ExitError
    ("Kein passender Grafiktreiber/modus!");
  // Grafiktreiber/modus initialisieren
  if (!geEngine_SetDriverAndMode
    (Engine, Driver, DMode)) ExitError
      ("Grafikinitialisierung fehlgeschlagen!");
}

//--------------------------------------------------

// Spielabbruch bei Fehler
void TGame::ExitError (char *Txt)
{
  // Fehlermeldung anzeigen, Programm abbrechen
  MessageBox (NULL, Txt, "Fehler", 48);
  FreeGame();
  _exit (EXIT_FAILURE);
}


 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
07.03.2006, 23:15 Uhr
Marco15



Sorry, dass das so viel Code is

Ich muss dazu sagen, dass ich mich mit dem Quellcode noch nicht so toll auskenne, aber da ich es von der BuchCD kopiert habe, sollte es richtig sein. Die oben eingefügte Headerdatei Game1:



Code:

//---------------------------------------------------
// Game1.h :
// Header mit Klassendeklaration von TGame
//---------------------------------------------------

// #define _BCB  // nur für Borland C++Builder

#include <windows.h>
#include "include\genesis.h"

class TGame
{
public:
  // Eigenschaften
  geEngine      *Engine;     // 3D-Engine
  geWorld       *World;      // World/Level
  geCamera      *Camera;     // Kamera/Betrachter
  geDriver      *Driver;     // Grafiktreiber
  geDriver_Mode *DMode;      // Grafikmodus
  geXForm3d      XForm;      // Welt-Matrix
  bool           isRunning;  // Spielmodus an/aus
  // Methoden
  void CreateGame (void);
  void RunGame    (void);
  void FreeGame   (void);
  void SetDriver  (void);
  void ExitError  (char *Txt);
} ;

// Pfad- und Dateinamen
const char *Pfad      = ".\\levels\\";
const char *BSP_Datei = "World0.bsp";
const char *GVersion  = "GPlay1";
// Globale Konstanten
const int MaxWidth    = 640;   // Max. Screenbreite
const int MaxHeight   = 480;   // Max. Screenhöhe

// Globalvariable
HWND GHandle;      // Handle des "Spielfensters"





Jetzt will ich das kompilieren, aber es kommen folgende 2 Fehler:

LIBCD.lib(wincrt0.obj) : error LNK2001: Nichtaufgeloestes externes Symbol _WinMain@16
Debug/Hmm.exe : fatal error LNK1120: 1 unaufgeloeste externe Verweise


Ich weiß ehrlich gesagt, so gar nicht was ich machen soll. Also, die einzige Genesis Datei, die hier benötigt wird ist genesis.h . Und die findet er ja im Gegensatz zu vorhin auch, aber anscheinend dürfte irgendeine Datei noch fehlen. Im Buch is aber nix. Muss man vielleicht die Datein die auf lib. änden auch noch irgendwie einbinden?Im Buch steht davon nichts.Ich hab auf jedenfall sicherheitshalber alle Dateien die benötigt werden versucht einzubinden, aber ich weiß nicht ob das so richtig ist:

Also, ich hab VC++ 6 gestartet, bin auf Extras, dann auf Optionen gegangen und da bin ich dann auf Verzeichnisse gegangen und hab bei den INcludedateien den Pfad zu den Includdateien angegeben und bei den Bibliotheksdateien, hab ich eben den Pfad zu den Bibliotheken angegeben. (DLL Datein gehören da doch auch rein, oder?)

Naja, ich hoffe dass ihr irgendeine Lösung wisst

Thx

LG Marco
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
08.03.2006, 02:05 Uhr
Hans
Library Walker
(Operator)


Hi,

so wie die Fehlermeldungen aussehen, kommen die nicht vom Compiler, sondern vom Linker. Das ist jenes Programm, das aus den vom Compiler erzeugten *.obj-Dateien die ausführbaren *.exe-Dateien macht. Ausser den *.obj-Dateien wird auch noch das Eine oder Andere aus anderen Dateien dazu gebunden, die die Endung .lib tragen.
Damit das funktioniert, muss der Linker wissen, wo diese *.lib-Dateien zu finden sind. Das bedeutet, das Du nach den Optionen oder Einstellungen für den Linker suchen musst, und dort die Pfade zu den *.lib-Dateien der Genesis3d-Engine hinzu fügen musst. (Da ich kein VC besitze kann ich Dir nicht mitteilen, wo sich diese Einstellungen in den Menüs "verbergen".)
Ach ja, DLLs sind zwar auch Bibliotheksdateien, allerdings solche, die von fertigen Programmen benutzt werden. Diese muss man von den Bibliotheken unterscheiden, die einem Programmierer irgendwelche Funktionen zum Gebrauch anbieten, also auch von den Standard C/C++ Bibliotheken wie stdio.h oder iostream.

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
08.03.2006, 07:44 Uhr
Tommix



'Morgen,der Linker behauptet diese Funtion:

Zitat:

C++:
// Windows-Hauptfunktion mit Game-Schleife
int WINAPI WinMain
  (HINSTANCE hInstance, HINSTANCE hPrevInstance,
   LPSTR lpCmdLine, int nCmdShow)
//...



wäre nicht vorhanden. Sieh mal nach ob Game1.cpp Bestandteil Deines Projektes ist (muß im Reiter "Dateien" unter Quellcodedateien auftauchen).

Gruß, Tommix
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
08.03.2006, 12:38 Uhr
Marco15



@Hans- Hmm, also so weit ich weiß, hab ich schon alle Datein richtig eingebunden.Also die Include Dateien zu den Includedateien und die DLL und die Lib Dateien zu den Bibliotheksdatein

@Tommix- Du meinst ob Game.h eingebunden is? Also Game.h is eingebunden. Jetzt wollte ich den Quelltext nochmal testen. Doch diesmal kam ein Fehler, dass die Include Datei nicht geöffnet werden konnte. Komisch, gestern gings doch noch, nur eben mit Fehlern. Deswegen hab ich alle Include Dateien direkt in den Ordner kopiert, wo auch mein Projekt und mein Header(Game.h) gespeichert sind und hab dementsprechend den Header leicht verändert auf IncludeC++\Genesis.h (in IncludeC++ liegen die ganzen Headers, darunter auch Genesis.h). Die Datei dürfte er öffnen können, doch diesmal kommen 26 Fehler von nichtaufgelösten externen Verweisen. Bei allen liegt der Fehler in Hmmm.obj(Hmmm heißt mein Projekt) und dann noch folgenden Fehler:

LIBCD.lib(crt0.obj) : error LNK2001: Nichtaufgeloestes externes Symbol _main

Also auch der selbe von gestern, nur dass heute vie mehr Fehler da sind.

Wisst ihr vielleicht trotzdem was ich falsch mache?

LG Marco
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
08.03.2006, 12:50 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


Hast wahrscheinlich Konsolenanwendung gewählt und nicht Win32-Anwendung, deswegen sucht er nach einer main

Ansonsten header mit "pfad/zu/header.h" einbinden, also / und nicht \ das sollten zwar die preprozessoren unter windows richtig machen, nur kann es sein das es dadurch mit dem escape-zeichen probleme gibt.
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
08.03.2006, 13:00 Uhr
Tommix




Zitat von Marco15:
Du meinst ob Game.h eingebunden is?

Nein, das meine ich nicht. Die cpp-Datei muß Bestandteil des Projektes sein und dieses wiederum ein Win32-Projekt - keine Konsolenanwendung (wie Flo schon schrieb).
- Tommix
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
08.03.2006, 13:15 Uhr
Marco15



Ahaaa. Jetzt haben wir mal den Fehler eingeschränkt.

@FloSoft- Nö, ist eine Win Anwendung, hab sicherheitshalber nochmal eine neues Proejtk geöffnet.

Also, jetzt hab ich mal die Bibliotheksdateien händisch hinzugefügt und jetzt tritt nur mehr ein Fehler auf:

DC++Sachen\Bibliotheken\Genesisd.lib : fatal error LNK1136: Ungueltige oder beschaedigte Datei

Also is die Datei beschädigt, obwohl ich sie gestern nochmal neu runtergeladen hab. Naja, ich werds jetzt nochmal versuchen und hoffen, dass es klappt

Danke für eure Hilfe

LG Marco
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
08.03.2006, 13:17 Uhr
Marco15



@Tommix- Ja, hab grade nachgeguckt, die cpp. datei is auch eingebunden. Jetzt hab ich alles händisch eingebunden. Includes, Bibliotheken und den Header. Aber eine Bibliothek is eben beschädigt, anscheinend.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
08.03.2006, 13:22 Uhr
Pler
Einer von Vielen
(Operator)


Ähm, aber du hast nicht irgendo include "irgendwas.cpp" geschrieben?
Dieser Post wurde am 08.03.2006 um 13:22 Uhr von Pler editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ] [ 3 ]     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: