Hm...Anfangs ist die Bedingung ja nicht erfüllt...das heißt das PlugIn würde versuchen ein Bild zu zerstören, dass noch garnicht existiert...d.h. ich muss überprüfen ob das Bild bereits existiert oder?
Wenn ja wie mach ich das? :x
Oder iwie drumherum coden, aber da fällt mir gerade nicht ein wie ich das machen könnte...vielleicht wenn ich mal ne nacht drüber schlafe oder so. ^^
Variablen haben einen Gültigkeitsbereich. Wenn du Sachen in einem if{} erstellt sind sie nur darin gültig, genau so wäre etwas, dass du in dem else{} machst nur darin gültig.
Zu dem Bild:
Das Reinladen und das Zerstören solltest du gar nicht in dem onFrame Callback machen, weil der 60 mal pro Sekunde passiert.
Es gibt den Callback "onInit.." oder so. Der wird ausgeführt wenn die Makerspieldaten geladen wurden,also einmal beim Spielstart. Dort kannst und solltest du Bilder reinladen.
Es gibt auch den Callback "onExit" oder so, der wird ausgeführt wenn das Spiel beendet wird. Dort ist der richtige Ort um Bilder mit destroy freizugeben.
Die Variable RPG::Image *meinBild deklarierst du in der main.cpp-Datei. Dadurch ist sie in den andern Callbacks vorhanden und kann benutzt werden.
Ich hab schon öfters destroy bei Bildern gemacht, die nicht existierten weil ich einen falschen Dateinamen angegeben hab. Das heisst, du musst und brauchst nicht prüfen, ob der ->loadFromFile Vorgang erfolgreich war. Was du prüfen solltest ist, ob RPG::Image::create(); erfolgreich war und das machst du per
Wieso kommt es eigentlich manchmal dazu, dass eine Meldung mit "DirectDraw Error (DDERR_NOEXCLUSIVEMODE)" angezeigt wird, wenn ich dir RPG_RT.exe starte?
Ich hab jetzt endlich sogar mal ne .dll aus dem Compiler rausbekommen und das Spiel gestartet zum Testen und da ist das mal wieder aufgeploppt.
Liegt aber glaub ich nicht an dem PlugIn, da das vorher auch schon aufgetaucht ist. Also direkt nachdem ich den DynRPG- Patch installiert habe ohne irgendwas mit PlugIns zu machen.
Erscheint aber nur, wenn ich das Spiel im Vollbild öffnen möchte. Im Fenstermodus passiert nichts.
Okay...hab's jetzt im Fenstermodus ausprobiert uuuuund....nichts ._. Das Fenster bleibt schwarz und ich krieg's nurnoch über den Task Manager geschlossen und für den Bruchteil von einer Sekunde,
sehe ich eine Fehlermeldung.
EDIT:
So ich hab das mal gescreent bekommen:
Ja sieht wohl nach einer Zugriffsverweigerung aus Aber wo genau?
Ich hab das mit dem RPG::Image::create(); usw. jetzt in onInitFinished() gepackt und das RPG::Image::destroy ist im onExit Callback.
Da das ganze noch vor dem auftauchen des Title Screens passiert, gehe ich mal davon aus dass das während des onInitFinished passiert.
»Ein Traum kann auch die Wehmut nach der verlorenen Vergangenheit sein…«
»Manchmal ist eine Enttäuschung auch einfach nur das Ergebnis zu hoher Erwartungen.«
__________________________________________________________________________
void onFrame(RPG::Scene scene)
{
if (scene == RPG::SCENE_MENU)
{
mmscn = getMenuScreen();
if (mmscn == 0)
{
for (int i=0; i< 3; i++)
{
switch(i)
{
case 0:
RPG::screen->canvas->draw(200, 41, myExpImage);
break;
case 1:
RPG::screen->canvas->draw(200, 99, myExpImage);
break;
case 2:
RPG::screen->canvas->draw(200, 157, myExpImage);
break;
default:
break;
}
}
}
}
}
Und mir fällt gerade auf, dass ich überprüfen müsste, wieviele Helden ich in der Party hab, da ansonsten ja immer die Bilder gezeichnet werden, auch wenn an dieser Position kein Held ist
Das ergibt ja keinen Sinn, wenn dann da plötzlich einfach so ein Bild ist.
Wahrscheinlich hiermit:
RPG::Actor* actor;
actor = RPG::Actor::partyMember(INTEGER);
Dabei ist darauf zu achten, dass die Funktion »0«-indexiert ist, also von 0 bis 3, nicht von 1 bis 4!
Dann müsstest du damit dann halt auch prüfen können, ob der zurückgegebene Actor != NULL ist.
Korrigiert mich, wenn sich die Funktion anders verhält!
EDIT:
Dein onFrame-Code sieht für mich auf den ersten Blick richtig aus.
PeAcE
MorDen
--
»Ein Traum kann auch die Wehmut nach der verlorenen Vergangenheit sein…«
»Manchmal ist eine Enttäuschung auch einfach nur das Ergebnis zu hoher Erwartungen.«
__________________________________________________________________________
Geht er weg wenn du die draw-Zeilen rauseditierst?
@Partymember:
Hatte ich dir bereits auf der vorherigen Seite beschrieben ;-) Aber hier nochmal
// Zeiger auf ein Heldenobjekt
RPG::Actor * actorCurrent;
// Die Funktion "RPG::Actor::partyMember" gibt dir einen Zeiger auf ein Heldenobjekt auf dem übergebenen Index zurück
actorCurrent = RPG::Actor::partyMember(indexHero); // Der Index ist 0 bis einschliesslich 3, da maximal 4 Helden in der Gruppe sein können. Die Reihenfolge entspricht der im Menü.
// Nachdem du den Helden auf einem Index angefordert hast, musst du überprüfen, ob wirklich ein Held zurückgegeben wurde.
if(actorCurrent != 0) // if zero, no actor has been returned
{
}
EDIT: Ey Morden war schneller! Damit stehts nun 1:1 , haha ^_^
Ich hab die draw-Zeilen mal auskommentiert, leider kam immernoch derselbe Fehler.
Allerdings wurde mir die Meldung diesmal über dem Fenster angezeigt und das Spiel hat nach einem Klick auf "OK" gestartet.
Danach hab ich nochmal die draw-Zeilen hinzugefügt und auch dieses mal hat das Spiel nach einem Klick auf "OK" gestartet. Mir komm't gerade so vor, als ob es zufällig ist ob die Meldung über oder unter dem Fenster auftaucht.
Wenn sie allerdings unter dem Fenstar auftaucht, hilft nur ein Beenden über den Task Manager.
Danach bin ich im Spiel selber ins Menü gegangen und dann bekam ich erneut die Meldung mit "Access Violation in module ..." und wurde auf den Title Screen zurückverfrachtet.
a) Kommentier mal alles raus. Einfach Callbacks ohne Inhalt. Was passiert dann?
b) mach dann mal die reinladen-destroy schritte im onInit, einmal. Erstmal sehen ob das funktioniert.
Hast du das Präprozessor-Makro »AUTO_DLLMAIN« definiert?
Also am Anfang deiner main-Datei:
#define AUTO_DLLMAIN
Weiß zwar nicht direkt, ob das was damit zu tun hat, aber vielleicht kann man so den Fehler eingrenzen.
Ansonsten wäre dein ganzes Projekt bzw. dein ganzer Source vielleicht hilfreicher, als immer nur son Schnipsel.
PeAcE
MorDen
--
»Ein Traum kann auch die Wehmut nach der verlorenen Vergangenheit sein…«
»Manchmal ist eine Enttäuschung auch einfach nur das Ergebnis zu hoher Erwartungen.«
__________________________________________________________________________
Außer dass mir gerade bei 4 von 5 mal starten wieder der Fehler "DirectDraw Error (DDERR_NOEXCLUSIVEMODE)" um die Ohren gehauen wurde, was scheinbar durch bloßes patchen ausgelöst wird, kam keine "Access Violation" mehr.
(Hab es dann nochmal bei einem komplett neuem Projekt ausprobiert, weil's mir zu doof wurde ._.)
Ich benutz' die Code:: Blocks Version 12.11. Hab sonst keine Patches drauf. Die Version der RPG_RT.exe ist 1.0.8.0.
EDIT:
Wenn ich das ganze im onInit ablaufen lasse, kommt wieder Access Violation.
@Morden: Ja das #define AUTO_DLLMAIN ist drin. Und hier nocheinmal der ganze Code:
Bei der Version 12.11 von CodeBlocks ist MinGW mit GCC Version 4.7 dabei, du solltest aber lieber GCC Version 4.6.1 verwenden!
Ich such dir gleich mal nen Link raus.
EDIT:
Hier schonmal ein Link zu einem GCC in Version 4.6.1: http://sourceforge.net/projects/tdm-...1.exe/download. Beim Installieren darauf achten den Haken bei Updates rauszunehmen sonst installiert er gleich das neuste, also 4.7.1 wenn ich mich nicht täusche.
Ich denke das müsste dann deine Probleme auch schon beheben, denn dein Code an sich scheint nicht falsch zu sein und sollte eigtl laufen - so auf den ersten Blick.
Du musst dann halt in CodeBlocks nur einen neuen Compiler einrichten und dort dann auch halt DynRPG einfügen.
PeAcE
MorDen
--
»Ein Traum kann auch die Wehmut nach der verlorenen Vergangenheit sein…«
»Manchmal ist eine Enttäuschung auch einfach nur das Ergebnis zu hoher Erwartungen.«
__________________________________________________________________________
Okay...Ich hab mir jetzt einfach ne ältere Code:: Blocks version geholt und ich krieg keine Meldung mit Access Violation.
Ich muss jetzt nurnoch die Transparenz rausnehmen, weil man sonst noch die Zahlen darunter sieht ._. Aber das ist ja schnell getan.^^
Und dann noch abfragen wieviele in meiner Party sind.
Ich kriege aber immernoch ab und zu den Fehler mit "DirectDraw Error (DDERR_NOEXCLUSIVEMODE)", wenn ich es aus dem Ordner starte (also im Vollbildmodus).
Weiß jemand was es damit auf sich hat? Entweder ich erhalte den Fehler und das Spiel schließt sich, oder aber ich krieg den Fehler nicht und das Spiel minimiert sich.
Wäre gut wenn ich das auch noch irgendwie weg kriege.