Exemplo n.º 1
0
        //快速计算
        protected static bool NumberMath2Value(char opCode, CQ_Value left, CQ_Value right, out CQ_Value returnValue)
        {
            try {
                returnValue = new CQ_Value();
                Type retType = NumberUtil.GetReturnType_Math2Value(left.m_type, right.m_type);

                double leftValue  = left.GetNumber();               // GetDouble(left.m_type, left.GetValue());
                double rightValue = right.GetNumber();              // GetDouble(right.m_type, right.GetValue());
                double finalValue;

                switch (opCode)
                {
                case '+':
                    finalValue = leftValue + rightValue;
                    break;

                case '-':
                    finalValue = leftValue - rightValue;
                    break;

                case '*':
                    finalValue = leftValue * rightValue;
                    break;

                case '/':
                    finalValue = leftValue / rightValue;
                    break;

                case '%':
                    finalValue = leftValue % rightValue;
                    break;

                default:
                    throw new Exception("Invalid math operation::opCode = " + opCode);
                }
                if (NumberUtil.IsNumberType(retType))
                {
                    returnValue.SetNumber(retType, NumberUtil.ConvertNumber(finalValue, retType));
                }
                return(true);
            }
            catch (Exception) {
                returnValue = CQ_Value.Null;
                return(false);
            }
        }
Exemplo n.º 2
0
        public CQ_Value ComputeValue(CQ_Content content)
        {
#if CQUARK_DEBUG
            content.InStack(this);
#endif
            object[] list  = new object[_expressions.Count - 1];
            int      count = _expressions[0] == null ? (_expressions.Count - 1) : (int)_expressions[0].ComputeValue(content).GetNumber();
//            if(count == 0)
//                throw new Exception("不能创建0长度数组");
            CQ_Value vcount = new CQ_Value();
            vcount.SetNumber(typeof(int), count);
            for (int i = 0; i < _expressions.Count - 1; i++)
            {
                list[i] = (_expressions[i + 1].ComputeValue(content).GetObject());
            }

            CQ_Value[] param    = new CQ_Value[] { vcount };
            CQ_Value   outvalue = CQ_Value.Null;


            //这几行是为了快速获取Unity的静态变量,而不需要反射
            if (!Wrap.New(type.typeBridge.type, param, out outvalue))
            {
                outvalue = type._class.New(content, param);
            }

            object obj = outvalue.GetObject();
            for (int i = 0; i < list.Length; i++)
            {
                type._class.IndexSet(content, obj, i, list[i]);
            }

#if CQUARK_DEBUG
            content.OutStack(this);
#endif
            return(outvalue);
        }
Exemplo n.º 3
0
    void OnGUI()
    {
        if (GUI.Button(new Rect(0, 0, 200, 50), "Eval use String"))
        {
            string callExpr = "ScriptClass4 sc =new ScriptClass4();\n" +
                              "sc.defHP1=100;\n" +
                              "sc.defHP2=200;\n" +
                              "return sc.GetHP();";
            CQuarkParagraph block = new CQuarkParagraph();
            CQuark.CQ_Value i     = block.Execute(callExpr);
            result = "result=" + i;
        }

        if (GUI.Button(new Rect(200, 0, 200, 50), "Eval use Code"))
        {
            //得到类型
            CQuark.IType typeOfScript = CQuark.AppDomain.GetTypeByKeyword("ScriptClass4");

            CQuark.CQ_Content content = new CQuark.CQ_Content();
            //调用脚本类构造创造一个实例
            var thisOfScript = typeOfScript._class.New(content, new CQuark.CQ_Value[0]).GetObject();

            //调用脚本类成员变量赋值
            //Debug.LogWarning(thisOfScript+","+ typeOfScript+","+ typeOfScript.function);
            CQuark.CQ_Value v1 = new CQuark.CQ_Value();
            v1.SetNumber(typeof(int), 150);
            CQuark.CQ_Value v2 = new CQuark.CQ_Value();
            v2.SetNumber(typeof(int), 300);
            typeOfScript._class.MemberValueSet(content, thisOfScript, "defHP1", v1);
            typeOfScript._class.MemberValueSet(content, thisOfScript, "defHP2", v2);
            //调用脚本类成员函数
            var returnvalue = typeOfScript._class.MemberCall(content, thisOfScript, "GetHP", new CQuark.CQ_Value[0]);
            result = "result=" + returnvalue;
        }

        GUI.Label(new Rect(0, 50, 200, 50), result);
    }