JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.phpMedaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Newbe Problem

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Mr.Matze
Mini JLI'ler


Alter: 32
Anmeldedatum: 05.07.2006
Beiträge: 27
Wohnort: Neustadt a. d. Weinstraße
Medaillen: Keine

BeitragVerfasst am: 05.07.2006, 20:00    Titel: Newbe Problem Antworten mit Zitat

Hallo,

ich bin neu hier und habe ein Problem Rolling Eyes

Ich habe Versucht das Buchbeispiel:
SpriteBounce etwas zu verändern und einen Pong Clon draus zu machen.
Ich kann schon programmieren(HTML PHP und Basic).

Ich werde aus der Fehlermeldung nicht schlau und da hoffe ich ihr könnt mir helfen.

Fehlermeldung
Zitat:

Linker-Vorgang läuft...
DIRECT3D.OBJ : error LNK2001: Nichtaufgeloestes externes Symbol _DXTraceA@20
DIRECT3D.OBJ : error LNK2001: Nichtaufgeloestes externes Symbol _DXGetErrorDescription9A@4
Ping_Pong.exe : fatal error LNK1120: 2 unaufgeloeste externe Verweise
Fehler beim Ausführen von link.exe.

Ping_Pong.exe - 3 Fehler, 0 Warnung(en)


Ich Poste ma den ganzen Code:
Main.CPP
Code:

/*
    Jetzt lerne ich Spieleprogrammierung mit DirectX und Visual C++
       
    Programmname: SpriteBounce

    Beschreibung: Dieses Programm zeigt, wie der Resourcen Manager eingesetzt wird.
   
                  Führen Sie das Programm durch Drücken von F5 aus.
*/

// Headerdateien
#include "Direct3D.h"
#include "Sprite.h"
#include "ResourceManager.h"

// Anwendungsfenster erzeugen
HWND CreateMainWindow(HINSTANCE hInstance);

// Callback Funktion zur Nachrichtenbehandlung
LRESULT CALLBACK MessageHandler(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam);

// Das Fensterhandle
HWND hWnd = 0;

// Instanz der Klasse CDirect3D
CDirect3D Direct3D;

// Instanz der Klasse ResourceManager
CResourceManager ResourceManager;


// Asteroiden anlegen (Instanzem der Klasse CSprite)
CSprite s_oben;
CSprite s_unten;

// Windows main-Funktion
int WINAPI WinMain(HINSTANCE hInstance,     
                   HINSTANCE hPrevInstance, 
                   LPSTR lpCmdLine,         
                   int nCmdShow)             
{   
    MessageBox(0,"Das soll ein Ping Pong sein","Ping-Pong",MB_OK);
   
   
    // Fenster erzeugen und Handle speichern
    hWnd = CreateMainWindow(hInstance);

    // Wenn der Rückgabewert 0 ist, ist ein Fehler aufgetreten
    if(0 == hWnd)
    {
        MessageBox(0,"Fenster konnte nicht erzeugt werden","Fehler",MB_OK);
        return -1;
    }

    // Direct3D initialisieren
    if(!Direct3D.Init(hWnd,FALSE))
    {
        return -1;
    }

    ResourceManager.Init(Direct3D.GetDevice());

    // Maus-Cursor verstecken
    ShowCursor(FALSE);

    // Farbe die beim Löschen verwendet werden soll
    Direct3D.SetClearColor(D3DCOLOR_XRGB(0,255,0));
 

   
//Schläger initialisieren
         s_unten.Create(Direct3D.GetDevice(),3);

         s_unten.SetStep(3,0);

       s_unten.SetPosition(SCR_WIDTH / 2, SCR_HEIGHT - 50);

         s_oben.Create(Direct3D.GetDevice(),3);

         s_oben.SetStep(3,0);

       s_oben.SetPosition(SCR_WIDTH / 2, 50);


    // Asteroiden Texturen laden

        ResourceManager.AddTexture("Gfx/schlaeger.bmp");

        s_unten.AddTexture(ResourceManager.GetTexture("Gfx/schlaeger.bmp"));
      s_oben.AddTexture(ResourceManager.GetTexture("Gfx/schlaeger.bmp"));

    // Struktur, in der Informationen zur Nachricht gespeichert werden
    MSG msg = { 0 };
   
    while(msg.message != WM_QUIT)
    {
        if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
        else
        {
            Direct3D.BeginScene();
             
            // Asteroiden mit Bounce bewegen und zeichnen

                s_unten.Draw();
            s_oben.Draw();
           
            Direct3D.EndScene();
        }
    }
   
    // Rückgabewert an Windows
    return 0;
}



// Fenster erzeugen
HWND CreateMainWindow(HINSTANCE hInstance)
{
    WNDCLASSEX wndClass =
    {
        sizeof(WNDCLASSEX),                                 // Größe angeben
        CS_DBLCLKS | CS_OWNDC | CS_HREDRAW | CS_VREDRAW,    // Standardstile       
        MessageHandler,                                     // Callback-Funktion
        0,                                                  // Zusätzliche Angaben
        0,                                                  // nicht benötigt
        hInstance,                                          // Anwendungsinstanz
        LoadIcon(NULL, IDI_WINLOGO),                        // Windows-Logo
        LoadCursor(NULL, IDC_ARROW),                        // Normaler Cursor
        (HBRUSH)GetStockObject(WHITE_BRUSH),                // Weißer Pinsel
        NULL,                                               // kein Menü
        "WindowClass",                                      // Der Name der Klasse
        LoadIcon(NULL, IDI_WINLOGO)                         // Windows Logo
    };

    // Klasse registrieren
    RegisterClassEx(&wndClass);

    return CreateWindowEx(NULL,                   // Keine erweiterten Stile nutzen
                          "WindowClass",          // Klassenname
                          "SpriteBounce",         // Fenstertitel
                          WS_OVERLAPPEDWINDOW |   // Fenster
                          WS_VISIBLE,             // Eigenschaften
                          0, 0,                   // Anfangsposition
                          SCR_WIDTH, SCR_HEIGHT,  // und Größe des Fensters
                          NULL,                   // Handle des Elternfensters
                          NULL,                   // Handle des Menüs
                          hInstance,              // Anwendungsinstanz
                          NULL);                  // wird nicht benötigt
}


// Diese Funktion wird von Windows aufgrufen, wenn
// eine Nachricht für Ihr Programm vorliegt
LRESULT CALLBACK MessageHandler(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    // testen, um welche Nachricht es sich handelt
    switch(msg)
    {
     // Programm beenden, wenn das Fenster
     // geschlossen wird
    case WM_DESTROY:
            PostQuitMessage(0);
            return 0;
         break;

    case WM_KEYDOWN:
           switch(wParam)
           {
             // Bei F1 einen Screenshot speichern
             case VK_F1:   
                    Direct3D.CreateScreenshot("c:\\screenshot.bmp");
                 break;
     
             // Wenn ESC gedrückt, Programm beenden
             case VK_ESCAPE:
                     DestroyWindow(hWnd);
                  break;                     
           }
         break;
    }
    // Standardnachrichtenverarbeitung von Windows
    return DefWindowProc(hwnd, msg, wParam, lParam);
}

Sprite.CPP
Code:

#include "SPRITE.H"

// Konstruktor - Initialisierungen
CSprite::CSprite(void)
{
    m_Rotation = 0;

    m_StepX    = 0;
    m_StepY    = 0;

    m_Width    = 0;
    m_Height   = 0;

    m_AnimationSpeed = 0;
    m_AnimationDelay = 0;
    m_CurrentImage   = 0;

    m_lpDevice = NULL;                 
    m_lpSprite = NULL;
}

// Destructor - freigeben der Objekte
CSprite::~CSprite(void)
{
    if(NULL != m_lpSprite)
    {
        m_lpSprite->Release();
        m_lpSprite = NULL;
    }

    // die Texturen dürfen hier nicht mehr frei gegeben
    // werden, da dies im ResourcenManager erfolgt
}

// Position setzen
void CSprite::SetPosition(float x,float y)
{
    m_vPosition.x = x;
    m_vPosition.y = y;
}

// Rotation setzen
void CSprite::SetRotation(float rotation)
{
    m_Rotation = rotation;
}

// Skalierungsfaktor setzen
void CSprite::SetScale(float scale)
{
    m_vScale.x = scale;
    m_vScale.y = scale;
}

// Schrittweite bestimmen
void CSprite::SetStep(float StepX,float StepY)
{
    m_StepX = StepX;
    m_StepY = StepY;
}

// Sprite kreiern
void CSprite::Create(LPDIRECT3DDEVICE9 lpDevice, int AnimationSpeed)
{
    m_lpDevice = lpDevice;
   
    m_AnimationSpeed = AnimationSpeed;
   
    D3DXCreateSprite(m_lpDevice, &m_lpSprite);
   
    m_vRotationCenter = D3DXVECTOR2((float)m_Width/2, (float)m_Height/2);
   
    m_vScale = D3DXVECTOR2(1.0f,1.0f);

    m_StepX = 10.0f;
    m_StepY = 10.0f;
}

// Textur für das Sprite festlegen
void CSprite::AddTexture(LPDIRECT3DTEXTURE9 lpTexture)
{
    // Beschreibung des zu Grunde liegenden Surfaces
    D3DSURFACE_DESC desc;

    lpTexture->GetLevelDesc(0,&desc);
   
    // Breite und Höhe speichern
    m_Width  = desc.Width;
    m_Height = desc.Height;
   
    // Zeiger auf die Textur speichern
    m_AnimationVec.push_back(lpTexture);
}

// Bewegung des Sprite
void CSprite::Move(DIRECTION dir)
{
    // Bei der Bewegung werden die Bildschirmbegrenzungen beachtet
    switch(dir)
    {
        case LEFT:
                if(m_vPosition.x > 0)
                {
                    m_vPosition.x -= m_StepX;
                }
        break;

        case RIGHT:
                if(m_vPosition.x < SCR_WIDTH - m_Width)
                {
                    m_vPosition.x += m_StepX;
                }
        break;

        case UP:
                if(m_vPosition.y > 0)
                {
                    m_vPosition.y -= m_StepY;
                }
        break;

        case DOWN:
                if(m_vPosition.y < SCR_HEIGHT - m_Height)
                {
                    m_vPosition.y += m_StepY;
                }
        break;
    }
}

// die Methode Bounce sorgt dafür, dass das Sprite
// an den Bildschirmbegrenzungen abprallt
void CSprite::Bounce(void)
{
    // x- und y-Wert um StepX und StepY erhöhen
    m_vPosition.x += m_StepX;
    m_vPosition.y += m_StepY;
   
    // wenn sich das Sprite aus dem Anzeigebereich
    // bewegt, Richtung umkehren

    if(m_vPosition.x < 0 || m_vPosition.x > SCR_WIDTH - m_Width)
    {
        m_StepX = -m_StepX;
    }
   
    if(m_vPosition.y < 0 || m_vPosition.y > SCR_HEIGHT - m_Height)
    {
        m_StepY = -m_StepY;
    }
}



// Skalierung des Sprites
void CSprite::Scale(float dScale)
{
    m_vScale.x += dScale;
    m_vScale.y += dScale;
}

// Rotation des Sprites
void CSprite::Rotate(float dRotation)
{
    m_Rotation += dRotation;
}

// Sprite zeichnen
void CSprite::Draw(void)
{

   
    // Sprite in der passenden Animationsstufe zeichnen   
    m_lpSprite->Draw(m_AnimationVec[0],
                     0,
                     &m_vScale,
                     &m_vRotationCenter,
                     m_Rotation,
                     &m_vPosition,
                     0xFFFFFFFF);
}


Ressourcemanager und Direct3D sende ich nicht, da ich die nicht verändert habe.

Danke für die Mühe

Grüße
Matze
_________________
Bitte besucht meine Webiste:
www.m-soft.de.tp
www.der-sternschnuppen-gruss.de.tp
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
FH
Super JLI'ler


Alter: 36
Anmeldedatum: 16.10.2004
Beiträge: 437

Medaillen: Keine

BeitragVerfasst am: 05.07.2006, 20:10    Titel: Antworten mit Zitat

Hast du die "dxerr9.lib" in das Projekt eingebunden? Sieht nämlich so aus, als würde die fehlen...
Gruß

FH
_________________
goto work, send your kids to school
follow fashion, act normal
walk on the pavement, watch T.V.
save for your old age, obey the law
Repeat after me: I am free
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
PeaceKiller
JLI Master


Alter: 35
Anmeldedatum: 28.11.2002
Beiträge: 970

Medaillen: Keine

BeitragVerfasst am: 05.07.2006, 20:10    Titel: Antworten mit Zitat

Das Problem, ist, das du Funktionen verwendest, die der Compiler beim linken nicht kennt. Du musst ihm nur sagen gegen welche Bibliothek er noch linken soll.

Welche das allerdings sind, muss dir jemand anders sagen Wink
Wobei ich auf d3d8.lib oder d3dx8.lib tippe.
_________________
»If the automobile had followed the same development cycle as the computer, a Rolls-Royce would today cost $100, get a million miles per gallon, and explode once a year, killing everyone inside.«
– Robert X. Cringely, InfoWorld magazine
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Mr.Matze
Mini JLI'ler


Alter: 32
Anmeldedatum: 05.07.2006
Beiträge: 27
Wohnort: Neustadt a. d. Weinstraße
Medaillen: Keine

BeitragVerfasst am: 05.07.2006, 20:15    Titel: Antworten mit Zitat

Ihr hattet recht.
Habe gedach ich muss das nur alle einmal einfügen Laughing

Danke für euere Hilfe.

Grüße
Matze
_________________
Bitte besucht meine Webiste:
www.m-soft.de.tp
www.der-sternschnuppen-gruss.de.tp
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
Jonathan_Klein
Living Legend


Alter: 36
Anmeldedatum: 17.02.2003
Beiträge: 3431
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 05.07.2006, 21:46    Titel: Antworten mit Zitat

Wenn man schon weiß, das es sich um eine DX Funktion handelt, was aus dem Namen ja vhervorgeht, sollte man die Dokumentation öffnen und bei der Suche den Funktionsnamen eingeben. Das A@20 kann man weglassen, da der Compiler die Funktionsnamen nachträglich noch verändert (um Überladung möglich zu machen). Also am besten nur z.b. nach DXTrace suchen, noch besser nach *DXTrace* falls man zuviel weggelassen hat.
Sollte man die Funktion gefunden ahbne, steht ganz utnen die benötigten header und Libs. Das selbe gilt natürlich auch für Windowsfunktinen, die teilweise auch LIBS benötigen. Einfach in der Dokumentation anchsehen.
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum