Ergebnis 1 bis 20 von 1418

Thema: Technik-Sammelthread für Probleme und Antworten

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    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


  2. #2
    Was tut das return-Statement da drinnen?

  3. #3
    Zitat Zitat von Quetschi Beitrag anzeigen
    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

    Deine Funktion existiert gar nicht und wird deshalb nicht aufgerufen!
    Das Callback heißt:
    Code:
    void onFrame(RPG::Scene scene)
    und nicht

    Code:
    bool onFrame(char*pluginName)
    Da dynloader.dll deine Funktion also dementsprechend nicht kennt, wird sie auch nie aufgerufen.

    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

    Geändert von Morden (03.06.2013 um 16:34 Uhr)

  4. #4
    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.

  5. #5
    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:

    Code:
                            mmscn = getMenuScreen();
                            {
                            return (**reinterpret_cast<char ***>(0x4CDC60))[12];
                            }
    Du musst diese Funktion doch außerhalb erstmal als Funktion deklarieren und definieren -- dann kannst du sie aufrufen!

    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

    Geändert von Morden (03.06.2013 um 17:06 Uhr)

  6. #6
    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 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;
    }

    Geändert von Corti (03.06.2013 um 17:11 Uhr)

  7. #7
    Perfekt Corti^^
    Ich hatte leider keine Zeit um dort so genau durchzugehen^^

    PeAcE
    MorDen

  8. #8
    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.

  9. #9
    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?

  10. #10
    wenn(Bedingung erfüllt)
    {
    erstelle bild
    }
    wenn nicht
    {
    zerstöre bild
    }

    denk mal genau drüber nach ;-)

  11. #11
    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. ^^

  12. #12
    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 );
    }

    Geändert von Corti (03.06.2013 um 21:58 Uhr)

  13. #13
    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.

    Geändert von Quetschi (04.06.2013 um 06:16 Uhr)

  14. #14
    zeig mal deinen onFrame-Callback-Code.

    Edit @Morden: Sniped, BaM BaM ;-)

    Geändert von Corti (04.06.2013 um 07:51 Uhr)

  15. #15
    Könntest du mehr vom Source posten?

    Edit: Corti war mal wieder schneller xD

    PeAcE
    MorDen

  16. #16
    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:
    Code:
    static RPG::Actor* RPG::Actor::partyMember (int  index) [static]
    Aber wie benutze ich das? Das "(int index)" heißt doch, dass ich dem ganzen eine Integerzahl übergeben muss oder nicht? ._. Wenn ja, welche?

    Geändert von Quetschi (04.06.2013 um 15:18 Uhr)

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •