JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=c51540f4b5c1d92c337039d15e95f587Medaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Problem mit SpriteObjekt

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Fragen, Antworten und Kritik
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
ProC++
Mini JLI'ler



Anmeldedatum: 27.04.2007
Beiträge: 11

Medaillen: Keine

BeitragVerfasst am: 27.04.2007, 10:54    Titel: Problem mit SpriteObjekt Antworten mit Zitat

Hallo erstmal Smile

Ich habe folgende Probleme, und hoffe, dass mir jemand bei der Lösung helfen kann.
1.) Ich habe mir eine Klasse erstellt, in der ein SpriteObjekt erzeugt wird. Und dieses gebe ich natürlich im Destruktor wieder frei mit
CPP:
#define RELEASE(x) if(x!=0){x->Release();}

//...

~klasse()
{
    RELEASE(m_lpSprite);
}


Allerdings kommt dann eine Fehlermeldung in Form von "...Problembericht an Microsoft senden...". Jetzt habe ich das freigeben des m_lpSprite-Objektes aus dem Destruktor genommen, und bekomme keine Fehlermeldung mehr.
Wie kann das angehen?

2.) Ich will mir ein Spiel bauen, (2D Jump'nRun) und wollte für die Map einfach ein Sprite auf den Hintergrund legen, und dann in jedem Schleifendurchlauf eben testen, ob der Pixel an der XY-SpielerPosition eine andere Farbe als der Sprite-Hintergrund hat, um so eben ein durch-das-level-fallen meiner Spielfigur zu vermeiden. Allerdings will die Abfrage mit LockRect(IDirect3DTexture9) nicht funktionieren. Kann mir da jemand weiterhelfen, oder ist mein Weg zur Kollisionserkennung der falsche?

3.) Ich wollte mich hier im Forum auch einfach mal erkundigen, ob ihr sämtliche DX-Funktionen so im Kopf behaltet, oder auch jedes mal mit der Dokumentation arbeitet? Ich bin mitten dabei, das Buch zu lesen, und habe mir am Anfang die Mühe gemacht, mir das erstellen eines Win-Fensters und das initialisieren von D3D reinzuprügeln, aber je weiter ich lese, desto mehr Funktionen mit nicht gerade weniger Parametern prasseln auf mich ein.


Das waren auch schon meine Weh-Wehchen. Ich hoffe jemand kann mir etwas weiterhelfen und ich bedanke mich schon mal für eure Mühe mir zu antworten. Tschö
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 27.04.2007, 11:35    Titel: Antworten mit Zitat

Hi,

wegen deinem Release() Problem:

Du müsstest etwas mehr Code liefern wenn es recht ist, vermuten kann ich aber dennoch schonmal:

- Das Sprite Objekt wurde schon frei gegeben und zerstört.
- Das SpriteObjekt wurde nie erstellt aber m_lpSprite zeigt auf etwas (Datenmüll)

2) Dein Weg der Kollisionserkennung ist schon aufgrund der enormen leistung verkehrt Wink Es sei denn du hast es schon ordentlich optimiert (nur relevanten Bereich locken, etc.)

Aber auch hier bräuchte ich etwas mehr Code, so kann ich nicht sagen was du falsch machst, da es beim Locken eine ganze Menge zu beachten gibt.

3) ich arbeite schon seit einigen Jahren mit DirectX und kenne bisher auch nur BeginScene/EndScene aus den Kopf Wink Ein bissl übertrieben aber ich persönlich habe entweder so etwas wie intelliSense was mir mögliche Funktionen direkt im Code anzeigt oder eben die DX Dokumentation offen. Die Doku allein deswegen schon weil man dort vieles nachlesen kann/muss.

mfg Mark
_________________
"I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse."
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
ProC++
Mini JLI'ler



Anmeldedatum: 27.04.2007
Beiträge: 11

Medaillen: Keine

BeitragVerfasst am: 27.04.2007, 12:22    Titel: Antworten mit Zitat

Moin!

Naja, ich lade ja die Textur auf mein SpriteObjekt, und bekomme das dann beim kompilieren auch angezeigt...also auf Datenmüll zeigt es dann nicht, oder?
Eigentlich wird das Objekt ganz simpel in meiner Init() Funktion:

CPP:
    void Klasse::Init(LPDIRECT3DDEVICE9 lpD3DDevice)
    {
        m_lpD3DDevice=lpD3DDevice;

        D3DXCreateSprite(m_lpD3DDevice,
                        &m_lpSprite);

    }


erzeugt. Dacht mir, wenn ich das Objekt in der Klasse erzeuge, müsste ich es auch in der Klasse wieder freigeben. (Wie in dem Buchbeispiel mit der CSprite-Klasse auch geschehen):


Ne, optimiert hab ich beim locken noch garnichts... Embarassed bin doch blutiger DX - Anfänger...

Hab aber bei den Buchbeispiel-Programen schon was mit pixelgenauer Kollisionserkennung gesehen - muss dann wohl einfach ein bisschen weiterlesen, oder gibts da ne ganz andere methode? Jedes Feld auf dem das manequin stehen soll mit einer RECT-Strkt. zu beschreiben find ich rigendwie zu doll. Hier aber erstmal mein "KollisionsCode":

CPP:
BOOL Klasse::Collision(int x,int y)
    {
        D3DLOCKED_RECT locked;
        D3DCOLOR check;
//MapVec ist ein LPDIRECT3DTEXTURE9 Vector
//m_Scroll ist mein sichtbares Rechteck, da das "Spielfeld" größer als //screen ist
        m_MapVec[m_count]->LockRect(    0,
                                        &locked,
                                        &m_Scroll,
                                        D3DLOCK_READONLY);

        int pitch=locked.Pitch/4;
        D3DCOLOR* pix=reinterpret_cast<D3DCOLOR*>(locked.pBits);

        check=pix[(y/m_height)*pitch+x];

        m_MapVec[m_count]->UnlockRect(0);

//in m_Background ist die Hintergrundfarbe gespeichert

        if(m_BackGround==check)
        return FALSE;


        return TRUE;
    }


Habe habe auch versucht die "check"-farbe auf einem Surface anzeigen zu lassen, dieses hatte aber immer die voreingestellte BG farbe

Hab mir das wohl alles n bisschen zu leicht vorgestellt mit der Kollision,hmpf
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 27.04.2007, 13:03    Titel: Antworten mit Zitat

Interessant wäre es dann zu wissen wo genau denn deine Klasse frei gegeben wird, vor oder erst nach dem zerstören des Devices?

Ansonsten wüsste ich spontan nicht wo das Problem auftritt. Allerdings arbeite ich mit D3DXSprite nicht mehr :/

Wegen der Kollision: Möglicherweise könnte das ok sein, bin mir nicht sicher wie es beim Readonly abläuft, da aber keine Daten wieder hochgeladen werden müssen könnte die performance ganz ok sein. Probleme mit der performance bringt es allerdings wenn du viele Überprüfungen hast und dort jedesmal Lock/Unlock benutzt, das kostet leider Zeit.
_________________
"I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse."
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
ProC++
Mini JLI'ler



Anmeldedatum: 27.04.2007
Beiträge: 11

Medaillen: Keine

BeitragVerfasst am: 27.04.2007, 13:23    Titel: Antworten mit Zitat

Vielen dank übrigens überhaupt für die schnelle Antwort vorhin!
hmm,wie stell ich denn am besten fest, in welcher Reiehnfolge die Objekte wieder freigegeben werden?
Die Draw-Funktion der Klasse wird nur zwischen den BeginScene- und EndScene-Aufrufen ausgeführt. und sonst garnicht.
erzeugt wurde das Klasse-Objekt ja erst nachdem ich das Device erzeugt habe, und mein Fenster wird mit der "DestroyWindow(HWND)"Methode geschlossen.
Werden dabei nicht die Devices von innen nach außen freigegeben...also
dass was als letztes erzeugt wurde, wird zuerst freigegeben?
Oder lieg ich da ganz falsch mit meiner Vorstellung?
mfg Timo
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 27.04.2007, 13:53    Titel: Antworten mit Zitat

Wenn du mit new und delete arbeitest bleibt das dir selbst überlassen und wenn es auf die Reihenfolge der freigabe ankommt würde ich auch darauf setzen um das etwas besser steuern zu können. Wie es ohne pointerspass abläuft weiss ich jetzt leider nicht.
_________________
"I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse."
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
ProC++
Mini JLI'ler



Anmeldedatum: 27.04.2007
Beiträge: 11

Medaillen: Keine

BeitragVerfasst am: 27.04.2007, 19:26    Titel: Antworten mit Zitat

Du meinst sicherlich mit new eine Instanz der Klasse anzulegen in Form von
CPP:
Klasse* NeueKlasse= new Klasse;
oder ?
Das hat auch komischerweise nicht gefunzt. Das Programm ist also komentarlos abgestürzt. Gibt es da etwas besonderes in Bezug auf die MemberVariablen- bzw -Funktions-erstellung zu beachten damit das funktioniert?

Und um nochmal auf das Pixel auslesen mit LockRect() zurückzukommen, das hat ja leider überhaupt nicht funktioniert. Die Textur wurde mit D3DPOOL_MANAGED angelegt, wie auch in der Dokumentation angegeben.Gibt es da nochwas zu beachten? Ich kann die Pixel mit der o.g. "Collision()"-Funktion nämlich nicht auslesen. Ich bin echt ratlos. Sad
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 27.04.2007, 21:03    Titel: Antworten mit Zitat

Das er beim erzeugen einer Instanz mit new Abstürtzt ist in der Tat recht seltsam, kannst du nicht einfach mal den ganzen Code posten?

Wegen dem Locken, managed texturen sind lockbar, wieso es genau nicht bei dir geht kann ich jetzt nicht sagen, stürtzt er da ab, oder sowas?

Allgemein bei solchen problemen würde ich empfehlen Breakpoints (F5) zu setzen und dann ein Debug Build auszuführen, hält das Programm dann an den Breakpoints kannst du da schön untersuchen wo das Problem genau löst indem du Werte untersuchst oder einfach nur weitersteppst (F10/F11).
_________________
"I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse."
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
ProC++
Mini JLI'ler



Anmeldedatum: 27.04.2007
Beiträge: 11

Medaillen: Keine

BeitragVerfasst am: 27.04.2007, 21:41    Titel: Antworten mit Zitat

Uppps, ist mir jetzt ein bisschen unangenehm. Die Klasse lies sich mit new nicht anlegen, da ich die ganzen Variablen-Initialisierungen testweise aus dem Konstruktor genommen hatte. Ich weiss nicht wie ich bei Win32 Anwendungen einen Debug Buid erstellen kann...hatte alles bei Konsolen-Projekten nach der Buch-Anleitung eingestellt, aber bei Win-Projekten sind diese Einstellungen weg. Und sowieso weiss ich nicht wie das mit den Symbol-Files gehen soll. Darum muss ich verdächtigen Code immer auskommentieren um Problemen auf die Spur zu kommen Embarassed . aber das ist ja hier ein bisschen ab vom Thema.

Zum Locken - er stürzt nicht ab und gar nichts... nur werden die Farben nicht aus der Textur gelesen....hatte zu Testzwecken eine Funktion erstellt, die als Rückgabewert die Farbe an XY-Spielerposition hatte und habe mir eine kleine Surface mit dieser Farbe erstellt...allerdings war dieses Surface an jeder Position des Spielers im Spiel weiß - wie die voreingestellte BG Color mit der verglichen wird.


Das Sprite-RELEASE Problem ist jedenfalls behoben dafür schonmal vielen Dank.
MfG,
Timo
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 02.05.2007, 07:50    Titel: Antworten mit Zitat

Du könntest den Rückgabewert von LockRect mal überprüfen, ganz simpel zB so:

CPP:
if( FAILED(m_MapVec[m_count]->LockRect(    0,
                                        &locked,
                                        &m_Scroll,
                                        D3DLOCK_READONLY)))
{
  // Fehler!
}


Noch dazu wäre es interessant zu wissen wie die Texturen in m_MapVec erstellt wurden, vielleicht wurde da einfach nur ein inkompatibler Pool oder ähnliches verwendet.
_________________
"I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse."
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
ProC++
Mini JLI'ler



Anmeldedatum: 27.04.2007
Beiträge: 11

Medaillen: Keine

BeitragVerfasst am: 03.05.2007, 18:19    Titel: Antworten mit Zitat

Hallo!
Puh, ich hab nun noch ein wenig rumprobiert, allerdings ohne nennenswerten Erfolg. Meine Leveltextur hat ja eine ganz andere Auflösung, als das Spiel....so musste ich casten wie ein wilder. Habe zum Ausprobieren das Flag bei LockRect auf D3DLOCK_DISCARD gestellt, und alle Pixel an XY osition knallrot gefärbt. Das hat nun auch wunderbar funktioniert, und jetzt bin ich mir sicher, dass die Pixel an der gewünschten Position gelesen werden (wenn sie es denn richtig würden). Dadurch, dass ich die entsprechenden Pixel eingefärbt hae, und dass mir dass auch im Spiel angezeigt wurde, gehe ich doch davon aus, dass die Textur im richtigen Pool angelegt wurde. Aber da ich nich so die Ahnung habe, wie andere in diesem Forum poste ich einfach nochmal den Code.
1.) Anlegen der Textur:

CPP:
void Klasse::AddMap(LPCSTR FILE)
    {
        LPDIRECT3DTEXTURE9 lpTexture;
        D3DXIMAGE_INFO info;

        D3DXGetImageInfoFromFile(FILE,&info);

        m_width=info.Width;
        m_height=info.Height;

        D3DXCreateTextureFromFileEx(    m_lpD3DDevice,
                                        FILE,
                                        m_width,m_height,
                                        1,
                                        0,
                                        D3DFMT_A8R8G8B8,
                                        D3DPOOL_MANAGED,
                                        D3DX_FILTER_NONE,
                                        D3DX_FILTER_NONE,
                                        0xffffffff,
                                        0,0,
                                        &lpTexture);

       m_MapVec.push_back(lpTexture);
    }


und
2.) den geänderten KollisionsCode:

CPP:
   BOOL Klasse::Collision(int x,int y)
    {
        D3DLOCKED_RECT locked;
        D3DCOLOR check;
        float TransY=(static_cast<float>(m_height)/static_cast<float>(SCR_HEIGHT))*static_cast<float>(y);
        float TransX;

        if(m_Scroll.right!=0)
        TransX=((static_cast<float>(m_Scroll.right)-static_cast<float>(m_Scroll.left))/static_cast<float>(SCR_WIDTH))*static_cast<float>(x);

        else
        TransX=(static_cast<float>(m_width)/static_cast<float>(SCR_WIDTH))*static_cast<float>(x);

        m_MapVec[m_count]->LockRect(  0,
                                    &locked,
                                    &m_Scroll,
                                    D3DLOCK_READONLY);
        int Pitch=locked.Pitch/4;
        D3DCOLOR* pix=reinterpret_cast<D3DCOLOR*>(locked.pBits);

        check=pix[static_cast<int>(TransY)*Pitch+static_cast<int>(TransX)];

        m_MapVec[m_count]->UnlockRect(0);

        if(check==m_BackGround)
        return FALSE;

        return TRUE;
    }


Danke schonmal im Voraus für das Durchkämpfen durch meinen Code.
Mit freundlichen Grüßen,
Timo
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
ProC++
Mini JLI'ler



Anmeldedatum: 27.04.2007
Beiträge: 11

Medaillen: Keine

BeitragVerfasst am: 04.05.2007, 19:11    Titel: Antworten mit Zitat

Okay, bitte schlag mich nicht.... Embarassed .....
Problem erkannt, Problem gebannt^^. Ich habe ja in der D3DXCreateTextureFromFileEx() Methode den untransparenten weißen Hintergrund mit dem ColorKey auf transparentes Schwarz gesetzt. Natürlich dachte ich, dass wenn ich die Pixel der Textur lese, ich die Originalfarben(also weiss) erhalte. Falsch gedacht, ich habe die Vergleichsfarbe jetzt auf transparentes Schwarz gesetzt und siehe da - es funktioniert.
Allerdings hapert es jetzt an der Implementierung der Spring-Funktion. Aber das bekomme ich hoffentlich bald in den Griff. Aber falls zufällig jemand eine intelligent gelöste Spring- Funktion zur Hand hat, hätte ich nichts dagegen wenn diese hier gepostet würde, hrhr. Also vielen Dank ersteinmal für deine kompetente Hilfe Fallen.
Mit freundlichen Grüßen,
Timo
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 04.05.2007, 21:36    Titel: Antworten mit Zitat

Springfunktion? Glaube das gabs im Forum schon einige male:

Beim Tastendruck und Bodenkontakt:
Y-Bewegungsgeschwindigkeit auf Sprunggeschwindigkeit setzen

Beim Updaten der Objekte:
Y-Bewegungsgeschwindigkeit um Gravitationskonstante verringern
_________________
"I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse."
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 -> Fragen, Antworten und Kritik 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