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
    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 18:11 Uhr)

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

    PeAcE
    MorDen

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

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

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

    denk mal genau drüber nach ;-)

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

  7. #7
    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 22:58 Uhr)

  8. #8
    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 07:16 Uhr)

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

    Edit @Morden: Sniped, BaM BaM ;-)

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

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

    Edit: Corti war mal wieder schneller xD

    PeAcE
    MorDen

  11. #11
    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 16:18 Uhr)

  12. #12
    Jap, heißt es.
    Du müsstest es dann so aufrufen:
    Code:
    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

    Geändert von Morden (04.06.2013 um 16:22 Uhr)

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

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

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

Berechtigungen

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