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
    Zitat Zitat von Morden Beitrag anzeigen
    Im Kampfsystem die Menüs sind auch drüber.
    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.

    Zitat Zitat von Morden Beitrag anzeigen
    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.]
    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.

    Geändert von Cherry (01.06.2013 um 12:23 Uhr)

  2. #2
    Zitat Zitat von Cherry Beitrag anzeigen
    Was? Über dem was du in onFrame gezeichnet hast? Das dürfte eigentlich nicht sein. Ich muss da mal nachforschen.
    Alarm zurück. War ein Irrtum meinerseits. Bitte um Verzeihung.

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

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

    Geändert von Corti (01.06.2013 um 21:57 Uhr)

  5. #5
    Der Ordner heißt Picture, ohne "s" hinten, also Vorsicht beim Codekopieren, Quetschi!

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


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

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

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

  10. #10
    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)

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

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

    PeAcE
    MorDen

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

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

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

    denk mal genau drüber nach ;-)

Berechtigungen

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