Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 16

Thema: Flash CS3 - Button mit Rückgabewert

  1. #1
    Erfahrener User Avatar von Bodom
    Registriert seit
    30.10.2007
    Beiträge
    155

    Standard Flash CS3 - Button mit Rückgabewert

    Ok, um mein Ziel und die Situation zu beschreiben folgendes:
    Ich bin gerade dabei, ein "Tool" für Crysis zu bauen, mit dem es mir gelingt, einen Dialog zwischen NPC und Spieler zu erstellen. Dabei soll der Spieler mehrere Antwortmöglichkeiten haben (Beispiel hierfür sollen sein: Gothic (1-3), Knights Of The Old Republic (1-2), etc.).
    Soweit, so gut. Mehr oder weniger hab ich das auch schon über die Vorhandenen FlowGraphs zum laufen gebracht. Nur hab ich mir dann an dieser Stelle gedacht: hey, wenn du dir das selber zusammenklempnerst könnte es ein viel einfacherer FlowGraph werden.
    Als ich dann angefangen habe zu basteln ist mir noch eine Mauszeigerunterstützung in den Sinn gekommen. Wäre für den Spieler nun mal auch wesentlich komfortabler.

    Und als weitere Vorlage für solch ein "Dialog-Menü" kam mir das Interface in den Sinn, mit welchem man in Crysis die Waffen verändern kann (Schalldämpfer, Visiere, etc.). Dort gibt es schließlich genau meine gewünschte Mausunterstützung und Sachen zum anklicken und auswählen und blablabla.

    Lange Rede, kurzer Sinn:
    Ich bin soweit, dass ich das Menü zum laufen gebracht habe, Problem ist aber noch, dass ich zwar Buttons habe, jedoch weiß ich nicht wie ich in Crysis nun den Mauszeiger reinbekomme wie in dem Waffen-Menü.

    Bei einem Flash-Tutorial auf crymod.com bin ich schon vor längerer Zeit auf die Flash-Files von Crysis gestoßen und habe dort mal nachgeschaut aber so richtig durchblicken tu ich da leider nicht.
    Und auch sonst hab ich kein Tutorial gefunden, bei dem mir gezeigt wird, wie ich ein Rückgabe-Wert behandel. Zwar Button-Tutorials aber alle ohne Rückgabe-Wert o.O

    Kann mir da jemand weiterhelfen? Wenn nötig, kann ich auch ein paar Bilder posten.

  2. #2
    VIP Avatar von Pat21
    Registriert seit
    06.09.2007
    Beiträge
    10.654

    Standard

    @ Bodom
    Schaue dir zu diesem Node mal den Source-Code an:
    http://www.crymod.com/thread.php?thr...ilight=mouse+c

  3. #3
    Erfahrener User Avatar von Bodom
    Registriert seit
    30.10.2007
    Beiträge
    155

    Standard

    Schon mal vielen Dank!

    Ich werd's ausprobieren und mir zu Gemüte führen. Falls noch was is, meld ich mich^^.

  4. #4
    Professional Avatar von Hamers
    Registriert seit
    29.02.2008
    Ort
    Mittendrin
    Beiträge
    2.760

    Standard

    @Bodom

    Willst du es so wie Crytek machen, brauchst du C++. Mit der Funktion "SwitchToModalHUD" kannst du die Maus auf einer Flash Datei aktivieren. Rückgabewerte erstellst du in der Flash Datei mit der Funktion "fscommand" und in C++ empfängst du diese mit einem "FSCommandHandler"

  5. #5
    Erfahrener User Avatar von Bodom
    Registriert seit
    30.10.2007
    Beiträge
    155

    Standard

    hehe, danke dir auch für die hilfe!
    ich werd's morgen anfangen in ruhe, da ich heute relativ viel anderes zeugs um die ohren hatte^^.

    EDIT:
    Hab mich jetzt in den letzten Tagen damit beschäftigen können und funktioniert soweit klasse. Ich hab bis jetzt nur das Problem, dass meine Flash-Funktion nicht richtig funktioniert (Spiel stürzt ab) und ich hab keine Ahnung woran das liegt. Bin leider halt nicht der Flash-Freak, aber ich hoff, dass ich es noch zum funktionieren bekomm. Wenn's fertig ist, will ich es per Video zeigen.
    Geändert von Bodom (19.02.2010 um 10:55 Uhr)

  6. #6
    Erfahrener User Avatar von Bodom
    Registriert seit
    30.10.2007
    Beiträge
    155

    Standard

    Nochmal ne Frage:
    Um die Maus benutzen zu können benötige ich doch 2 Listener, diese bau ich wie folgt in den Code ein:

    Code:
    class CFlowNode_Bla: public CFlowBaseNode, public IInputEventListener, public IHardwareMouseEventListener
    {
       if(gEnv->pHardwareMouse)
       {
         gEnv->pHardwareMouse->AddListener(this);
       }
       if(GetISystem()&&GetISystem->GetIInput())
       {
         GetISystem()->GetIInput()->AddListener(this);
       }
    }
    Und nun stürzt das Spiel ab. Wenn ich die beiden Zeilen mit "AddListener(this)" auskommentiere, läufts weiter.
    Ich weiß, dass ich noch verschiedene Funktionen benötige, um einen Input zuverarbeiten (also wenn z.B. die linke Maustaste gedrückt ist). Die hab ich ebenfalls eingebaut.
    Hab mich insgesamt an das Beispiel von Pat21 gehalten.

  7. #7
    VIP Avatar von Pat21
    Registriert seit
    06.09.2007
    Beiträge
    10.654

    Standard

    @ Bodom
    Du kannst, so wie es jetzt bei dir ist, nicht einfach eine if-Abfrage machen.
    Entweder baust du diese Befehle in den Konstruktor der Klasse ein oder in eine Funktion.

  8. #8
    Erfahrener User Avatar von Bodom
    Registriert seit
    30.10.2007
    Beiträge
    155

    Standard

    hab das ja im konstruktor, den "RemoveListener" im destruktor.

    frag mich nich, warum ich das class noch reingehängt hab... war wohl zu früh am morgen

  9. #9
    VIP Avatar von Pat21
    Registriert seit
    06.09.2007
    Beiträge
    10.654

    Standard

    @ Bodom
    Zeig mir mal den kompletten Code deines Nodes.

  10. #10
    Erfahrener User Avatar von Bodom
    Registriert seit
    30.10.2007
    Beiträge
    155

    Standard

    bitte schön:
    Code:
    // FlowNode - Dialog
    // Created for "CRYTHIC" by Simon Mahalsky
    //
    // Dialog-Node for Crythic. It manages a conversation with NPCs
    
    #include "StdAfx.h"
    #include "Game.h"
    #include "GameCVars.h"
    #include "GameActions.h"
    #include "HUD/HUD.h"
    #include "IHardwareMouse.h"
    #include "Nodes/G2FlowBaseNode.h"
    
    #include <IActorSystem.h>
    #include <StringUtils.h>
    
    class CFlowNode_Dialog:public CFlowBaseNode, public IHardwareMouseEventListener, public IInputEventListener
    {
    private:
        SActivationInfo* m_actInfo;
    
        unsigned int m_iCursorCounter;
        
        bool b_active;
        bool b_select;
        bool b_button;
        string m_key;
    
        Vec2i i_mPos;
    
    public:
        CFlowNode_Dialog::CFlowNode_Dialog(SActivationInfo* pActInfo)
        {
            b_active=false;
            b_select=false;
            b_button=false;
        }
    
        ~CFlowNode_Dialog()
        {
            if(gEnv->pHardwareMouse)
            {
                gEnv->pHardwareMouse->RemoveListener(this);
            }
    
            if(GetISystem() && GetISystem()->GetIInput())
            {
                GetISystem()->GetIInput()->RemoveEventListener(this);
            }
        }
    
        enum EInputPorts
        {
            EIP_Activate=0,
            EIP_Deactivate,
    
            // Messages:
            EIP_MsgOne,
            EIP_MsgTwo,
            EIP_MsgThree,
            EIP_MsgFour,
            EIP_MsgFive,
        };
    
        enum EOutputPorts
        {
            EOP_Message,
            EOP_Done,
        };
    
        virtual void GetMemoryStatistics(ICrySizer *s)
        {
            s->Add(*this);
        }
    
        virtual void GetConfiguration(SFlowNodeConfig& config)
        {
            static const SInputPortConfig in_ports[]=
            {
                InputPortConfig_Void("Activate", _HELP("Activate")),
                InputPortConfig_Void("Deactivate", _HELP("Deactivate")),
                InputPortConfig<string>("MsgOne", _HELP("MsgOne"), 0, _UICONFIG("dt=text")),
                InputPortConfig<string>("MsgTwo", _HELP("MsgTwo"), 0, _UICONFIG("dt=text")),
                InputPortConfig<string>("MsgThree", _HELP("MsgThree"), 0, _UICONFIG("dt=text")),
                InputPortConfig<string>("MsgFour", _HELP("MsgFour"), 0, _UICONFIG("dt=text")),
                InputPortConfig<string>("MsgFive", _HELP("MsgFive"), 0, _UICONFIG("dt=text")),
                {0}
            };
    
            static const SOutputPortConfig out_ports[]=
            {
                OutputPortConfig_Void("Message", _HELP("Message")),
                OutputPortConfig_Void("Done", _HELP("Done")),
                {0}
            };
    
            config.pInputPorts=in_ports;
            config.pOutputPorts=out_ports;
            config.sDescription=_HELP("Dialog");
            config.SetCategory(EFLN_WIP);
        }
    
        virtual void ProcessEvent(EFlowEvent event, SActivationInfo* pActInfo)
        {
            switch(event)
            {
            case eFE_Initialize:
                {
                    if(gEnv->pHardwareMouse)
                    {
                        gEnv->pHardwareMouse->AddListener(this);
                    }
                    if(GetISystem()&&GetISystem()->GetIInput())
                    {
                        GetISystem()->GetIInput()->AddEventListener(this);
                    }
    
                    b_active=false;
                    b_button=false;
                    b_select=false;
    
                    Movement(true);
                    Mouse(false);
    
                    break;
                }
    
            case eFE_Activate:
                {
                    if(IsPortActive(pActInfo, EIP_Activate))
                    {
                        b_active=true;
    
                        CHUD* pHUD=g_pGame->GetHUD();
                        if(pHUD==0)
                        {
                            return;
                        }
    
                        const string msgOne=GetPortString(pActInfo, EIP_MsgOne);
                        const string msgTwo=GetPortString(pActInfo, EIP_MsgTwo);
                        const string msgThree=GetPortString(pActInfo, EIP_MsgThree);
                        const string msgFour=GetPortString(pActInfo, EIP_MsgFour);
                        const string msgFive=GetPortString(pActInfo, EIP_MsgFive);
                        pHUD->DisplayCrythicDialog(msgOne, msgTwo, msgThree, msgFour, msgFive);
    
                        Movement(false);
                        Mouse(true);
    
                        // Hier das Dialog-Menü ausblenden
                    }
                    break;
                }
            }
        }
    
        virtual bool OnInputEventUI( const SInputEvent &event ) 
        {
            return false;
        }
    
        virtual bool OnInputEvent(const SInputEvent &rInputEvent)
        {
            if(!b_active)
            {
                return false;
            }
    
            if(rInputEvent.keyId==GetKeyID(m_key) && rInputEvent.state==eIS_Pressed)
            {
                b_button=!b_button;
    
                if(b_button)
                {
                    Movement(false);
                    Mouse(true);
                }
                else
                {
                    Movement(true);
                    Mouse(false);
                }
            }
            else if(rInputEvent.keyId==eKI_Mouse1 && rInputEvent.state==eIS_Pressed && b_button)
            {
                // Code fehlt
            }
    
            return false;
        }
    
        virtual void OnHardwareMouseEvent(int iX,int iY,EHARDWAREMOUSEEVENT eHardwareMouseEvent)
        {
            if(b_active)
            {
                if(eHardwareMouseEvent==HARDWAREMOUSEEVENT_LBUTTONDOWN)
                {
                    b_select=true;
                }
                else if(eHardwareMouseEvent==HARDWAREMOUSEEVENT_LBUTTONUP)
                {
                    b_select=false;
                    i_mPos=Vec2i(iX, iY);
                }
    
                //const string g_message=FCom(return_command, return_value);
                const string g_message="#TEST-VALUE#";
                ActivateOutput(m_actInfo, EOP_Done, true);
                ActivateOutput(m_actInfo, EOP_Message, g_message);
            }
        }
    
    private:
        void CFlowNode_Dialog::Movement(bool enable)
        {
            IActionMapManager *pActionMapManager=gEnv->pGame->GetIGameFramework()->GetIActionMapManager();
            
            if(enable)
            {
                if(pActionMapManager)
                {
                    pActionMapManager->EnableFilter("no_move", false);
                    pActionMapManager->EnableFilter("no_mouse", false);
                }
            }
            else
            {
                if(pActionMapManager)
                {
                    pActionMapManager->EnableFilter("no_move", true);
                    pActionMapManager->EnableFilter("no_mouse", true);
                }
            }
        }
    
        void CFlowNode_Dialog::Mouse(bool enable)
        {
            if(enable)
            {
                gEnv->pHardwareMouse->IncrementCounter();
                ++m_iCursorCounter;
            }
            else
            {
                while(m_iCursorCounter>0)
                {
                    gEnv->pHardwareMouse->DecrementCounter();
                    m_iCursorCounter--;
                }
            }
        }
    
        string CFlowNode_Dialog::FCom(const char *command, const char *value)
        {
            string ret;
    
            if(strcmp(command, "returnMessage"))
            {
                return ret=value;
            }
            else
            {
                return ret="";
            }
        }
    
        EKeyId CFlowNode_Dialog::GetKeyID(string sKey)
        {
            if(!strcmpi(sKey, "0"))
                return eKI_0;
            else if(!strcmpi(sKey, "1"))
                return eKI_1;
            else if(!strcmpi(sKey, "2"))
                return eKI_2;
            else if(!strcmpi(sKey, "3"))
                return eKI_3;
            else if(!strcmpi(sKey, "4"))
                return eKI_4;
            else if(!strcmpi(sKey, "5"))
                return eKI_5;
            else if(!strcmpi(sKey, "6"))
                return eKI_6;
            else if(!strcmpi(sKey, "7"))
                return eKI_7;
            else if(!strcmpi(sKey, "8"))
                return eKI_8;
            else if(!strcmpi(sKey, "9"))
                return eKI_9;
    
            else if(!strcmpi(sKey, "F1"))
                return eKI_F1;
            else if(!strcmpi(sKey, "F2"))
                return eKI_F2;
            else if(!strcmpi(sKey, "F3"))
                return eKI_F3;
            else if(!strcmpi(sKey, "F4"))
                return eKI_F4;
            else if(!strcmpi(sKey, "F5"))
                return eKI_F5;
            else if(!strcmpi(sKey, "F6"))
                return eKI_F6;
            else if(!strcmpi(sKey, "F7"))
                return eKI_F7;
            else if(!strcmpi(sKey, "F8"))
                return eKI_F8;
            else if(!strcmpi(sKey, "F9"))
                return eKI_F9;
            else if(!strcmpi(sKey, "F10"))
                return eKI_F10;
    
            else if(!strcmpi(sKey, "NUM0"))
                return eKI_NP_0;
            else if(!strcmpi(sKey, "NUM1"))
                return eKI_NP_1;
            else if(!strcmpi(sKey, "NUM2"))
                return eKI_NP_2;
            else if(!strcmpi(sKey, "NUM3"))
                return eKI_NP_3;
            else if(!strcmpi(sKey, "NUM4"))
                return eKI_NP_4;
            else if(!strcmpi(sKey, "NUM5"))
                return eKI_NP_5;
            else if(!strcmpi(sKey, "NUM6"))
                return eKI_NP_6;
            else if(!strcmpi(sKey, "NUM7"))
                return eKI_NP_7;
            else if(!strcmpi(sKey, "NUM8"))
                return eKI_NP_8;
            else if(!strcmpi(sKey, "NUM9"))
                return eKI_NP_9;
            else if(!strcmpi(sKey, "NUMENTER"))
                return eKI_NP_Enter;
    
            else if(!strcmpi(sKey, "MOUSE1"))
                return eKI_Mouse1;
            else if(!strcmpi(sKey, "MOUSE2"))
                return eKI_Mouse2;
            else if(!strcmpi(sKey, "MOUSE3"))
                return eKI_Mouse3;
            else if(!strcmpi(sKey, "MOUSE4"))
                return eKI_Mouse4;
            else if(!strcmpi(sKey, "MOUSE5"))
                return eKI_Mouse5;
            else if(!strcmpi(sKey, "MOUSE6"))
                return eKI_Mouse6;
            else if(!strcmpi(sKey, "MOUSE7"))
                return eKI_Mouse7;
            else if(!strcmpi(sKey, "MOUSE8"))
                return eKI_Mouse8;
    
            else if(!strcmpi(sKey, "DOWN"))
                return eKI_Down;
            else if(!strcmpi(sKey, "UP"))
                return eKI_Up;
            else if(!strcmpi(sKey, "LEFT"))
                return eKI_Left;
            else if(!strcmpi(sKey, "RIGHT"))
                return eKI_Right;
    
            else if(!strcmpi(sKey, "A"))
                return eKI_A;
            else if(!strcmpi(sKey, "B"))
                return eKI_B;
            else if(!strcmpi(sKey, "C"))
                return eKI_C;
            else if(!strcmpi(sKey, "D"))
                return eKI_D;
            else if(!strcmpi(sKey, "E"))
                return eKI_E;
            else if(!strcmpi(sKey, "F"))
                return eKI_F;
            else if(!strcmpi(sKey, "G"))
                return eKI_G;
            else if(!strcmpi(sKey, "H"))
                return eKI_H;
            else if(!strcmpi(sKey, "I"))
                return eKI_I;
            else if(!strcmpi(sKey, "J"))
                return eKI_J;
            else if(!strcmpi(sKey, "K"))
                return eKI_K;
            else if(!strcmpi(sKey, "L"))
                return eKI_L;
            else if(!strcmpi(sKey, "M"))
                return eKI_M;
            else if(!strcmpi(sKey, "N"))
                return eKI_N;
            else if(!strcmpi(sKey, "O"))
                return eKI_O;
            else if(!strcmpi(sKey, "P"))
                return eKI_P;
            else if(!strcmpi(sKey, "Q"))
                return eKI_Q;
            else if(!strcmpi(sKey, "R"))
                return eKI_R;
            else if(!strcmpi(sKey, "S"))
                return eKI_S;
            else if(!strcmpi(sKey, "T"))
                return eKI_T;
            else if(!strcmpi(sKey, "U"))
                return eKI_U;
            else if(!strcmpi(sKey, "V"))
                return eKI_V;
            else if(!strcmpi(sKey, "W"))
                return eKI_W;
            else if(!strcmpi(sKey, "X"))
                return eKI_X;
            else if(!strcmpi(sKey, "Y"))
                return eKI_Y;
            else if(!strcmpi(sKey, "Z"))
                return eKI_Z;
    
            else
                return eKI_NP_0;
        }
    };
    
    REGISTER_FLOW_NODE("Crythic:Dialog", CFlowNode_Dialog);

Seite 1 von 2 12 LetzteLetzte

Stichworte

Berechtigungen

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