Das geht nur mit DynRPG.
Druckbare Version
Oh, es geht afaik auch ohne. Wenn man um jede Feind- und Heldenhandlung eine TakesTurn + Folgeswitch-Seite herumbastelt, hat man die Möglichkeit nach jeder Kampfhandlung Eventcode ablaufen zu lassen, vorrausgesetzt man benutzt den 2k3 ohne Atb-Verkrüppelungspatch.
jo :) hat sich dank Corti erledigt
ich bin mit der 1x +0 lösung zufrieden ^^
dankööööö
Aja stimmt, das hatte ich vergessen. Sehr gut.
danke nochmal :)
Aber jetzt nochmal wegen einen alten problem
und zwar habe ich mitlerweile die skills filtern können aber
wie gesagt die switch skills sind aber immer noch nicht filterbar
einer meiner charactere hat NUR switch skills aber kann auch die limit moves verwenden
und hier das problem : Wenn er seine skills aufruft werden ALLE skills angezeigt also auch seine limit moves :(
Kann man das irgendwie über den patch filtern lassen ? das also switch skills
zb normale skills sind ?
Skill listet alle Skills. Wenn du für alle non-limit-moves in eine eigene Kategorie ziehst solltest du das abgrenzen können.
Wenn ich die Frage richtig verstanden habe sollte es das sein.
die swtich skills können in keinen sub set angezeigt werden
die limit moves schon und wenn ich also "Skills" als komanndo habe werden halt ALLE erlernten skills angezeigt
also auch die switches / lmits und normale skills die halt nur normalen damage (zb) machen
Weniger ein Problem, eher eine Frage: man kann den Timer vom RM2K ernsthaft nur oben links und nicht oben rechts platzieren ?
Wenn du selbst einen machst kannst du ihn überall platzieren.
...allerdings kann er dann nicht im Kampf laufen.
Kurze Frage:
Ist es irgendwie möglich die "Enter Hero Name"-Option von so
http://s7.directupload.net/images/130429/yxuaw6ly.png
nach so
http://s14.directupload.net/images/130429/kpdvo6rl.png
zu modifizieren?
Also quasi den Faceset-Platzhalter wegzumachen?
( Kommt mir jetzt aber bitte nicht mit "Mach dir halt ein eigenes Enter-Hero-Name-Fenster blablabla" oder wasweißich. Mich interessiert primär, was ich da im Systemset verändern müsste und/oder ob das überhaupt geht. )
Ohne Patch/Hack eher nicht. Die leere Box schaut etwas hohl aus. Da du wohl kein Helden-Faceset verwenden möchtest, nutze doch den Facesetplatz für irgendwas andere, dekoratives.
Okay. Danke für die schnelle Antwort.
Du wirst dafür die Nutzung eines HexEditors nicht vermeiden können:
Schritt 1: einen HexEditor laden (zB. Hex Editor MX)
Schritt 2: Sicherungskopie deiner RPG_RT erstellen (falls man Änderungen speichert, und vergisst welche es waren)
Schritt 3: die Original-RPG_RT mit dem HexEditor öffnen
Schritt 4: Base 16 an den Fingern abzählen lernen:
~es stehen immer Zweierpaare an Zahlen/Buchstaben: [16^1][16^0], soll heißen linke Zahl/Buchstabe: 16er Schritte, rechte Zahl: 1er Schritte
~man zählt 0 1 2 3 4 5 6 7 8 9 A(=10) B(=11) C(=12) D(=13) E (=14) F(=15)
Schritt 5: die hier angegebenen Adressen aufsuchen (auf der linken Seite des EditorFensters stehen die Adressenangaben), anklicken Änderung eintippen
Schritt 6: auf das Speicher-Symbol oben klicken (RPG_RT darf momentan nicht laufen, sonst speichert der nicht)
Schritt 7: RPG_RT starten (aus dem Maker oder so) und die Änderung betrachten
EnterHeroName-Änderungen (RM2k3):
0x915B8 die Werte C0 00 auf 00 01 setzen (Breite des Namen-Fensters, die 01 in 0x915B8 legt 256 Pixel drauf)
0x915C6 den Wert 60 auf 20 setzen (x-Position des Namen-Fensters)
0x91AE9 den Wert von 30 auf 00 setzen (Höhe des ausgelesenen + angezeigten FaceSets, geht auch über 48 Pixel hinaus)
0x91AEE den Wert von 30 auf 00 setzen (Breite des ausgelesenen + angezeigten FaceSets, geht auch über 48 Pixel hinaus)
0x91C69 den Wert von 40 auf 00 setzen (Breite des FaceSet-Fensters)
0x91C6B den Wert von 40 auf 00 setzen (Höhe des FaceSet-Fensters)
Wen's für den RM2k interessiert:
0x6EF44 (Breite des Namen-Fensters)
0x6EF52 (x-Position vom Namen-Fenster)
0x6F45B (Höhe der ausgelesenen + angezeigten FaceSet-Grafik)
0x6F460 (Breite der ausgelesenen + angezeigten FaceSet-Grafik)
0x6F5DD (Breite vom FaceSet-Fenster)
0x6F5DF (Höhe vom FaceSet-Fenster)
uff, viel zu viel Aufwand. :D hab schon nen einfacheren Weg drum rum gefunden. Aber danke. xD
Ich nehme mal spontan an, du verwendest die FaceSets doch noch als Dekor...
Da du möglichwerweise nicht die selben Grafiken wie im SpeicherMenü angezeigt haben wilst (RM2k3):
Von 0x91D18 bis 0x91D1E gibt der String "FaceSet" den Ordner an, aus dem die FaceSet-Grafik für's EnterHeroName ausgelesen wird.
Einfach einen neuen Ordner (im Spielordner) anlegen, sagen wir "NameSet", in 0x91D18 von 46 auf 4D und in 0x91D1A von 63 auf 6D ändern. Im Ordner NameSet dann die FaceSet-Grafik reinkopieren, die dem entsprechenden Hero zugewiesen wurde (soll heißen, der Dateiname muss übereinstimmen, und da braucht man nichts mit dem ImportManager machen... was Transparenzen angeht kann ich nicht viel sagen. Der Maker erkennt zB. das Pink des RTPs (in ChipSets) korrekt als transparente Farbe an).
Wen es für den RM2k interessiert:
Der String 'FaceSet' liegt hier in 0x6F68C bis 0x6F692. Wirkt sich nur auf die Grafik im EnterHeroName-Bildschirm aus.
Edit:
...oder es gibt einen Eventbefehl, mit dem man ein anderes Face zuweist... +sich gegen die Stirn schlägt+
Ich finds, bei sehr großen Spielen mit +200 Maps, immer recht unschön, wenn ich ewig lang scrollen muss, bis ich zur RPG_RT.exe komme, um das Spiel zu starten. Klar, ich kann auch einfach "R" drücken like a baus, dann jump' ich direkt zur RPG_RT.exe. Ändert aber nichts daran, dass Spieleordner von Makerspielen viel zu "vollgemüllt" sind. Oder bin ich der einzige, der das nicht schön findet? Zehntrillionen Unterordner (Backdrop, Battle, BattleCharset, Chipset, blablablawürg.), für jede Map und jedes Save eine zusätzliche Datei... kann man das nicht irgendwie "komprimieren"? Also "komprimieren" im Sinne von "wegräumen". Das einzige was mir hier spontan einfallen würde wär ne Molebox... scheint hier aber recht verhasst zu sein, weils die Performance drückt. Die Ordnergestaltung von Spielen der neueren Maker hingegen sind nicht so heftig. Man hat schön alles in einem Blick, kein Chaos, alles schön verstaut. Geht das bei 2k/3-Projekten nicht irgendwie auch?
Mit dem DestinyPatcher kannst du ändern, wo die RPG_RT.exe nach Dateien sucht. Geht iirc allerdings nur für 2k-Versionen und der Maker selbst findet die Dateien dann logischerweise auch nicht mehr, sollte man also erst machen, wenn man nichts mehr am Spiel ändern will.
Ansonsten erstell dir eine Batch-Datei, schreib RPG_RT.exe rein und nenn sie 0000run.bat oder so (hauptsache ein Name, der im Explorer vor den anderen Dateien angezeigt wird). Das erspart dir dann zumindest das Scrollen.
Pack ne Batchdatei ins übergeordnete Verzeichnis.
Gibt es eine Möglichkeit mit dem Power Patch Compact mehrere Variablen miteinander zu vergleichen um die größte bzw. kleinste Variable herauszufinden?
Danke, passt. Hat sich erledigt.
Das wäre genial. Würde mir einige Abfragen in meinem momentanen Projekt signifikant erleichtern. Vllt könnte man sowas via DynRPG realisieren (mal so in die Runde gefragt)?
Zwischenfrage:
Wie kann ich das EB!-Logo bei Spielstart ersetzen / austauschen? Ich weiß, dass das mit dem Ressourcehacker gehen müsste, weiß aber nich wie und hab dazu auch nich wirklich was gefunden.
steht hier beschrieben
http://www.rpg-studio.de/scientia/RP...e-Modifikation
Stichwort "Conditions" Base Statistic Ateration -> "Double"
Die Haken "Defense"(2. von oben) und "Intelligence"(3. von oben) sind bei mir vertauscht wie es ausschaut.
Könnt ihr das mal bei euch testen obs auch so ist?
Ist das ein bekannter Fehler?
@Corti: Uff, ich erinnere mich nur daran, dass das in einer 2k3-Übersetzung bei den Item-Stats vertauscht war.
Kennt jemand ein Tool/einen Patch/blubb, welches es ermöglicht, dem 2k3 Ergebnisse von Rechnungen mit Sinus und Cosinus auszugeben? Vorzugsweise ein DynRPG-Plugin?
Wie du schon sagtest -> DynRPG. Wofür brauchst du es? Was für Rechnungen genau brauchst du? Wenn du mir genau vermittel kannst was du willst schau ich, dass ichs dir eben runtertippe.
Ich möchte anhand eines Punktes P auf einem Kreis mir einen weiteren Punkt P' auf dem Kreis angeben lassen, der in einem bestimmten Winkel zu diesem liegt. Das ganze ist für eine Art Ringmenü, bei dem ich Unterpunkte beliebig hinzufügen und entfernen kann und sich das Menü von der Darstellung her anpasst.
Die Formeln die ich gefunden habe mit der ich da hin käme wäre eben:
x'=(x-u)*cos{[(2*pi)/360]*alpha}-(y-v)*sin{[(2*pi)/360]*alpha}+u
y'=(x-u)*sin{[(2*pi)/360]*alpha}+(y-v)*cos{[(2*pi)/360]*alpha}+v
Vorgegeben wären alpha (der Winkel in Grad, der dann nochmal in der Formel ins Bogenmaß umgerechnet wird), u und v als Mittelpunkt des Kreises und x und y als die Koordinaten des gegebenen Punktes P. Und ausspucken soll das ganze dann x' und y' als Koordinaten des neuen Punktes P'.
Mal schauen wann ich Zeit finde und Bock drauf hab ;-)
Es gibt doch schon ein math-Plugin mit sinus-Berechnung usw!
http://cherrytree.at/cms/lang/de/download/?did=23
PeAcE
MorDen
Geil, ich bin raus =D
DAS war es, was ich gesucht hatte! Dankesehr, und vielen Dank trotzdem, Corti! ;D
Gibt es eine Möglichkeit mit der man die EXP bis zum nächsten Level bestimmen kann? Also nicht diese Kurven in der Database, sondern dass man das mit einer Variable bestimmen kann.
Oder eventuell so, dass man die für jedes Level auf 100 setzen kann (damit man im Menü Prozente angeben kann, wenn man den maximalen Wert nicht über Variablen kann).
Gibt es eine Möglichkeit mit der man die EXP bis zum nächsten Level bestimmen kann?
Bestimmen im Sinne von "festlegen" oder "auslesen" ?
Ich benötige das im Sinne von "festlegen".
Erstell dir einen weiteren Held mit der exakt gleichen EXP-Kurve wie der, dessen EXP du brauchst,
speicher die EXP von deinem Held, geh mit dem Dummy einen Level höher als der Held gerade ist,
das lässt sich über ein bisschen Variablenrechnung verwirklichen, wie hoch du genau gehen musst,
und speichere auf dem höheren Level die EXP, die der Dummy dann hat, zieh davon die EXP des
Helden ab und tadaaa! Da hast du den genauen Differenzwert von der jetzigen Erfahrung.
Ups, festlegen. Na da kommst du um ein eigenes System eher kaum drumherum.
Ja, ich wollte das Standardmenü benutzen. Sonst hätte ich mir schon ein eigenes System gemacht. :'D
Deshalb wollte ich wissen ob man das als Alternative für jedes Level auf 100 setzen kann um somit in Kombination mit einem eigenem System ggf. "Prozente" anzuzeigen.
Du kannst per DynRPG im Hauptmenü die Exp-Anzeigen übermalen und was anderes hinpinseln ;-)
Kannst du etwas C++?
Okay. Gut zu wissen.
Naja vielleicht ein kleines bisschen. :'D Ich setz' mich mal dran und schau ob ich das hinbekomme. Wenn nicht, werd ich mich wahrscheinlich nochmal melden müssen.
Ich erspare dir mal etwas Gesuche, was folgt sind meist Stückchen aus meinen Plugins. Das wird dir nicht die Arbeit abnehmen, aber vielleicht ein wenig dabei helfen. Viel Erfolg.
Überzeichnet dies auch den Text/Zahlen-Output, der im Menü normal erfolgen würde? (wird darunterliegender Text-Output resettet, bevor der neue gedruckt wird?)
In onFrame mit Scene = Menu kannst du das ganze Bild überzeichnen, musst es aber in jedem Frame aufs neue tun.
@Corti
Ist es nicht einfacher ein Bild zu laden oder per DrawText was zu erzeugen und dieses RPG::Image dann einfach auf den RPG::screen->canvas zu zeichnen? Denn immerhin zeichnest du so auch "über" allem, da deine Draw-Funktion ja erst dann ausgeführt wird, wenn der Screen schon soweit fertig gezeichnet ist.
@bugmenot
Wie schon eben geschrieben: Im onFrame()-Callback zeichnest du über den - bis dahin schon komplett vom Maker gezeichneten - Bildschirm. Außer der ScreenTransition - ich glaube das ist das Einzige, was über allem steht.
EDIT: Sehe gerade Corti war schneller^^
PeAcE
MorDen
@Morden: Hab bereits etwas reineditiert. Pixel sind da wirklich unnötig kompliziert, da war ich irgendwie betriebsblind als ich Codestücke aus meinem Plugin kopiert hab.
Im Kampfsystem die Menüs sind auch drüber.Zitat:
Außer der ScreenTransition - ich glaube das ist das Einzige, was über allem steht.
Tatsächlich? :O Ich muss gestehen, dass ich mich weniger mit DynRPG+StandardKS beschäftigt habe >.<
Da würde mich jetzt glatt interessieren, ob die Standard-MessageBox auch über allem ist. Das werde ich heute Abend wohl mal ausprobieren^^
EDIT: Ich hätte auch mal weiter denken können: Brauch doch denn einfach nur checken, ob onDrawSystemBackground() nach onFrame() ausgeführt wird >.< Dann könnte man in solch einem Fall nämlich einfach dort auf den Bildschirm zeichnen.
PeAcE
MorDen
Was? Über dem was du in onFrame gezeichnet hast? Das dürfte eigentlich nicht sein. Ich muss da mal nachforschen.
Eigentlich sollten wirklich nur Screentransitions (und Movies, iirc - und eventuell "Frames" von System2 aber ich weiß grade nicht ob das stimmt) den Bildschirm nach onFrame manipulieren können. Alle Kampfgrafiken sollten von der draw-Methode von TLcfgBattleScene gezeichnet werden, und onFrame wird immer nach der draw-Methode der aktuellen Scene aufgerufen...
"Über allem" kann man mit onDrawScreen zeichnen, aber das wird aufgerufen wenn aus Windows-Sicht der Fensterinhalt neu gezeichnet wird und das kann manchmal mehrmals beim selben Frame passieren, also sollte man beachten dass eventuell Sachen die man im vorigen onDrawScreen gezeichnet hat noch immer da sind.
Für die Messagebox? Eher nicht, denn onDrawSystemBackground bezieht sich nicht auf den Fensterhintergrund sondern auf den Menühintergrund (der normalerweise einfärbig ist). Das Callback ist dazu da, eigene Hintergründe zu zeichnen. Fenster erscheinen über dem Hintergrund, und auf der Map wird das sowieso nicht verwendet weil ja die Map da ist und kein Systemhintergrund.
Wie kriege ich es denn mit DynRPG hin, ein Bild anzuzeigen?
Ich geh mal stark davon aus, dass das hiermit geht:
Aber wie genau funktioniert das? ._.
Bzw. der Teil mit dem Image...Ich hab mir jetzt ein Bild gemacht, welches ich dann einfach drüber legen würde. Aber wie sage ich dem Programm, dass es dieses Bild benutzen soll?
// Variable anlegen
RPG::Image *imageDings;
//Bild laden
imageDings = RPG::Image::create();
imageDings->useMaskColor = true;
imageDings->loadfromFile("Pictures\\Blabal.png",false);
// Bild anzeigen
RPG::screen->canvas->draw(x,y,imageDings,...);
// Bildressource freigeben
RPG::Image::destroy(imageDings);
________________________________________________________________________
Laden würde ich in "onInitFinished" machen, destroy in "onExit"
Der Ordner heißt Picture, ohne "s" hinten, also Vorsicht beim Codekopieren, Quetschi!
Ich krieg das nicht hin. Scheint so, als ob ich mich doch nur minimal mit C++ auskenne und das "bisschen" schon überschätzt war. :/
Beim Compilen krieg ich keine Fehlermeldung und im Spiel (also im Menü) wird mir das Bild nicht angezeigt :/
Würde sich einer von euch eventuell dazu bereit erklären mir so etwas schnell zu basteln oder mal über meinen Code zu schauen? :x
Was tut das return-Statement da drinnen?
Deine Funktion existiert gar nicht und wird deshalb nicht aufgerufen!
Das Callback heißt:
und nichtCode:void onFrame(RPG::Scene scene)
Da dynloader.dll deine Funktion also dementsprechend nicht kennt, wird sie auch nie aufgerufen.Code:bool onFrame(char*pluginName)
Edit:
Falsch ausgedrückt: Die Funktion existiert schon, du hast sie ja geschrieben. Nur versucht halt dynloader.dll eine void onFrame(RPG::Scene scene) Funktion aufzurufen, welche du ja nicht definiert und implementiert hast. Deshalb wird deine Funktion NICHT aufgerufen.
@Cherry
Oh danke, da habe ich dann wohl einfach total falsch gedacht - mein Fehler. Hatte SystemBackground jetzt mit dem MsgBox-Hintergrund gleichgesetzt. Aber danke, das wäre ich bestimmt früher oder später drüber gestolpert xD
PeAcE
MorDen
Ah okay. Das hab ich nun geändert, es passiert aber trotzdem nichts. Und müsste der Compiler nicht normalerweise eine .dll datei erzeugen?
Das ist bei mir nämlich auch nicht der Fall, wie ich gerade gemerkt hab. ._.
Trotzdem schonmal danke. :)
Das sollte er, wenn du das Projekt korrekt als »Dynamic Link Library« angelegt hast. Wenn du aber das Output-Directory der DLL nicht änderst, landet diese im Verzeichnis deines C/C++-Projektes, nicht aber in deinem RPG-Maker-Projekt.
Edit:
Habe mir gerade mal deinen Code ein wenig genauer angesehen und frage mich, was das soll:
Du musst diese Funktion doch außerhalb erstmal als Funktion deklarieren und definieren -- dann kannst du sie aufrufen!Code:mmscn = getMenuScreen();
{
return (**reinterpret_cast<char ***>(0x4CDC60))[12];
}
Des weiteren solltest du in C/C++ primitive Datentypen immer mit 0 oder ähnlichem initialisieren, da sie sonst einen zufälligen Wert am Anfang haben können, der nicht zwingend 0 sein muss.
PeAcE
MorDen
Hi, ich gehe davon aus, dass deine DLL nicht richtig kompiliert und dein Code vom Compiler nicht mal bemerkt wird, denn es ist ausgeschlossen, dass dieser Code problemlos kompiliert. Gerade als Anfänger ist es sinnlos große Konstrukte zu machen bevor nicht einzelne Stücke funktionieren.
Fang doch damit an, ohne Schleifen, Scenes etc. einfach mal irgendwas auf den Bildschirm zu zeichnen.
Bild laden
Bild zeigen
Bild löschen
in 3 verschiedenen Callbacks!
Zitat:
#define AUTO_DLLMAIN
#include <DynRPG/DynRPG.h>
int mmscn;
// Methodensignatur falsch
bool onFrame(char*pluginName)
{
if (scene == RPG::SCENE_MENU)
{
// du hast hier eine Funktion in deine Funktion kopiert.
// Das hier site in Funktionsaufruf
mmscn = getMenuScreen();
// das hier wird entweder ein Fehler oder die Klammern werden ignoriert und der onFrame-Callback beendet
{
return (**reinterpret_cast<char ***>(0x4CDC60))[12];
}
// du solltest die getMenuScreen-funktion als Funktion in dein Projekt einfügen und dann aufrufen.
if (mmscn == 0)
{
// das hier wird funktionieren , und ein Bild von der Festplatte laden, 60 mal pro Sekunde, absoluter Performancekiller
RPG::Image *myExpImage;
myExpImage = RPG::Image::create();
myExpImage->useMaskColor = true;
myExpImage->loadfromFile("Picture\EXP_Percentage.png",false);
RPG::Actor * actorCurrent;
// Global::etc. ist ein Namespace von mir, das solltest du schon ersetzen zB durch eine 4 ;-)
for (int i=0; i< Global::kNumberOfHeros; i++)
{
// die Schleife über das Switchkonstrukt ist grober Unfug. In meinem Samplecode folgr auf die Schleife ein Prüfen, ob ein Held auf der Gruppenposition 0 bis 3 vorhanden ist. Wenn du einfach nur an X Stellen überzeichnen willst, dann zeichne an X stellen, ohne Schleifen.
switch(i)
{
case 0:
// wenn du optionale Parameter nicht angeben willst lass sie weg, srcWidth=1 etc. gehört hier nicht hin
RPG::Canvas::Draw(200, 41, myExpImage,srcX = 0, srcY = 0, srcWidth = -1, srcHeight = -1)
break;
case 1:
RPG::Canvas::Draw(200, 99, myExpImage,srcX = 0, srcY = 0, srcWidth = -1, srcHeight = -1)
break;
case 2:
RPG::Canvas::Draw(200, 157, myExpImage,srcX = 0, srcY = 0, srcWidth = -1, srcHeight = -1)
break;
default:
break;
}
}
}
else
{
RPG::Image::destroy(myExpImage);
}
}
return true;
}
Perfekt Corti^^
Ich hatte leider keine Zeit um dort so genau durchzugehen^^
PeAcE
MorDen
Außerdem ist bei Picture\EXP.... ein Backslash zu wenig und RPG::Canvas::draw ist keine statische Methode sondern über RPG::screen->canvas->draw aufzurufen.
So...Ich hab nun endlich die Build Messages (keine Ahnung warum die vorher nicht da waren oO) und hab den Code schonmal bearbeitet.
Das ganze meckert nurnoch an der Stelle:
RPG::Image::destroy(myExpImage);
Er sagt mir, dass myExpImage nicht deklariert wurde, aber eigentlich wird das doch durch "RPG::Image *myExpImage;" deklariert oder nicht? Und wenn nicht, warum meckert das ganze dann nicht bei dem draw-Befehl?
wenn(Bedingung erfüllt)
{
erstelle bild
}
wenn nicht
{
zerstöre bild
}
denk mal genau drüber nach ;-)
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? :O
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
if(meinBild != NULL)
{
RPG::Image::destroy(meinBild );
}
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. :o
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 :o 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.
zeig mal deinen onFrame-Callback-Code.
Edit @Morden: Sniped, BaM BaM ;-)
Könntest du mehr vom Source posten?
Edit: Corti war mal wieder schneller xD
PeAcE
MorDen
Okay.
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:
Aber wie benutze ich das? Das "(int index)" heißt doch, dass ich dem ganzen eine Integerzahl übergeben muss oder nicht? ._. Wenn ja, welche?Code:static RPG::Actor* RPG::Actor::partyMember (int index) [static]
Jap, heißt es.
Du müsstest es dann so aufrufen:
Dabei ist darauf zu achten, dass die Funktion »0«-indexiert ist, also von 0 bis 3, nicht von 1 bis 4!Code:RPG::Actor* actor;
actor = RPG::Actor::partyMember(INTEGER);
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
Hrm, spontan sehe ich den Fehler nicht.
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.
- Welche Version hat deine RPG_RT.exe?
- Hast du irgendwelche Patches drauf?
- Welche Version des C++-Compilers benutzt du?
@Quetschi
Hast du das Präprozessor-Makro »AUTO_DLLMAIN« definiert?
Also am Anfang deiner main-Datei:
Weiß zwar nicht direkt, ob das was damit zu tun hat, aber vielleicht kann man so den Fehler eingrenzen.Code:#define AUTO_DLLMAIN
Ansonsten wäre dein ganzes Projekt bzw. dein ganzer Source vielleicht hilfreicher, als immer nur son Schnipsel.
PeAcE
MorDen
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
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.
Versuch mal "AnotherFullscreenMode", gibts hier irgendwo im Forum. Welches Windows hast du?
Okay, dann such ich mir den mal raus.
Windows 7 64-bit
Oh...und uhm Corti?
Wenn der Index von 0 bis 3 geht, wieso muss ich dann prüfen ob er ungleich 0 ist? ._.Zitat:
Code:// 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: Okay, ich glaub ich hab's verstanden. :D
EDIT2: Okay. Das PlugIn ist fertig ._. Großes Dankeschön an alle die mir geholfen haben! :D
Muss jetzt nur noch mit dem AnotherFullscreenMode gucken ob dann immer noch der Fehler mit dem DirectDraw erscheint. Aber das mach ich morgen, bin jetzt zu müde :'D