Updated graphics, got pong physics working

This commit is contained in:
sam-astro 2022-01-14 23:21:44 -05:00
parent f5895477aa
commit c1dda8efd8
9 changed files with 379 additions and 199 deletions

View File

@ -25,12 +25,12 @@ unordered_map<string, vector<vector<string>>> functionValues;
boost::any GetVariableValue(const string& varName, const unordered_map<string, boost::any>& variableValues)
{
string classSubComponent;
string baseName = varName;
string baseName = trim(varName);
if (count(varName, '.') > 0)
{
classSubComponent = varName.substr(indexInStr(varName, '.')+1, -1);
baseName = split(varName, '.')[0];
classSubComponent = trim(varName.substr(indexInStr(varName, '.') + 1, -1));
baseName = trim(split(varName, '.')[0]);
}
boost::any outputValue = nullType;
@ -52,7 +52,7 @@ boost::any GetVariableValue(const string& varName, const unordered_map<string, b
bool IsVar(const string& varName, const unordered_map<string, boost::any>& variableValues)
{
if (variableValues.find(split(varName, '.')[0]) != variableValues.end() && split(varName, '.')[0] != "CPP")
if (variableValues.find(split(varName, '.')[0]) != variableValues.end() && split(varName, '.')[0] != "SLB")
return true;
else
return false;
@ -66,8 +66,8 @@ vector<boost::any> VarValues(const vector<string>& varNames, unordered_map<strin
{
string varName = trim(varNames[varIndex]);
realValues.push_back(EvalExpression(varName, variableValues));
/*auto iA = variableValues.find(varName);
//realValues.push_back(EvalExpression(varName, variableValues));
auto iA = variableValues.find(varName);
if (iA != variableValues.end())
{
realValues.push_back(iA->second);
@ -78,8 +78,9 @@ vector<boost::any> VarValues(const vector<string>& varNames, unordered_map<strin
if (iB != globalVariableValues.end())
realValues.push_back(iB->second);
else
realValues.push_back(varName);
}*/
realValues.push_back(EvalExpression(varName, variableValues));
}
//InterpreterLog(varName + " " + AnyAsString(realValues[realValues.size() - 1]));
}
return realValues;
@ -92,9 +93,9 @@ bool IsFunction(const string& funcName)
else
return false;
}
bool IsCPPFunction(const string& funcName)
bool IsSLBFunction(const string& funcName)
{
if (funcName[0] == 'C' && funcName[1] == 'P' && funcName[2] == 'P' && funcName[2] == '.')
if (funcName[0] == 'S' && funcName[1] == 'L' && funcName[2] == 'B' && funcName[2] == '.')
return true;
else
return false;
@ -105,10 +106,12 @@ boost::any EvalExpression(const string& ex, unordered_map<string, boost::any>& v
string expression = trim(ex);
bool inQuotes = false;
//InterpreterLog("OLDEXPRESSION: |" + expression + "|");
InterpreterLog("OLDEXPRESSION: |" + expression + "|");
bool isFunc = IsFunction(split(expression, '(')[0]);
bool isSLB = split(expression, '.')[0] == "SLB";
// If no operations are applied, then return self
if ((count(expression, '+') == 0 && count(expression, '-') == 0 && count(expression, '*') == 0 && count(expression, '/') == 0 && count(expression, '^') == 0) || split(expression, '.')[0] == "CPP")
if ((countOutsideParenthesis(expression, '+') == 0 && countOutsideParenthesis(expression, '-') == 0 && countOutsideParenthesis(expression, '*') == 0 && countOutsideParenthesis(expression, '/') == 0 && countOutsideParenthesis(expression, '^') == 0) || split(expression, '.')[0] == "SLB")
{
bool isFunc = IsFunction(split(expression, '(')[0]);
if (isFunc && !inQuotes)
@ -122,10 +125,9 @@ boost::any EvalExpression(const string& ex, unordered_map<string, boost::any>& v
y++;
}
//InterpreterLog(split(expression, '(')[0] + " " + AnyAsString(GetVariableValue(split(argContents, ',')[0], variableValues)));
return ExecuteFunction(split(expression, '(')[0], VarValues(split(argContents, ','), variableValues));
}
else if (split(expression, '.')[0] == "CPP" && !inQuotes)
else if (split(expression, '.')[0] == "SLB" && !inQuotes)
{
string argContents = "";
int y = indexInStr(expression, '(') + 1;
@ -135,8 +137,7 @@ boost::any EvalExpression(const string& ex, unordered_map<string, boost::any>& v
y++;
}
//InterpreterLog(split(expression, '(')[0] + " " + argContents);
return CPPFunction(split(expression, '(')[0], VarValues(split(argContents, ','), variableValues));
return SLBFunction(split(expression, '(')[0], VarValues(split(argContents, ','), variableValues));
}
else
return GetVariableValue(expression, variableValues);
@ -177,7 +178,7 @@ boost::any EvalExpression(const string& ex, unordered_map<string, boost::any>& v
newExpression += returnVal;
//cout << newExpression << endl;
}
else if (split(name, '.')[0] == "CPP" && !inQuotes)
else if (split(name, '.')[0] == "SLB" && !inQuotes)
{
string argContents = "";
int y = indexInStr(expression, '(') + 1;
@ -188,7 +189,7 @@ boost::any EvalExpression(const string& ex, unordered_map<string, boost::any>& v
y++;
}
//cout << split(expression, '(')[0] << " " << argContents << endl;
string returnVal = AnyAsString(CPPFunction(split(name, '(')[0], VarValues(split(argContents, ','), variableValues)));
string returnVal = AnyAsString(SLBFunction(split(name, '(')[0], VarValues(split(argContents, ','), variableValues)));
newExpression += returnVal;
}
else
@ -206,7 +207,7 @@ boost::any EvalExpression(const string& ex, unordered_map<string, boost::any>& v
newExpression += expression[i];
}
}
//InterpreterLog("NEW EXPRESSION: |" + newExpression + "|");
InterpreterLog("NEW EXPRESSION: |" + newExpression + "|");
bool addStrings = false;
for (int i = 0; i < (int)newExpression.size(); i++)
@ -243,11 +244,11 @@ bool BooleanLogic(const string& valA, const string& determinant, const string& v
{
boost::any valARealValue = EvalExpression(valA, variableValues);
boost::any valBRealValue = EvalExpression(valB, variableValues);
//InterpreterLog(AnyAsString(valARealValue) + " " + determinant + " " + AnyAsString(valBRealValue) + " : " + to_string(AnyAsString(valARealValue) == AnyAsString(valBRealValue)));
//InterpreterLog(AnyAsString(valARealValue) + " " + determinant + " " + AnyAsString(valBRealValue) + " : " + AnyAsString(valA) + " " + determinant + " " + AnyAsString(valB) + " : " + to_string(AnyAsString(valARealValue) == AnyAsString(valBRealValue)));
if (determinant == "==")
return AnyAsString(valARealValue) == AnyAsString(valBRealValue);
return any_compare(valARealValue, valBRealValue);
else if (determinant == "!=")
return AnyAsString(valARealValue) != AnyAsString(valBRealValue);
return !any_compare(valARealValue, valBRealValue);
else if (determinant == ">=")
return AnyAsFloat(valARealValue) >= AnyAsFloat(valBRealValue);
else if (determinant == "<=")
@ -264,63 +265,82 @@ bool BooleanLogic(const string& valA, const string& determinant, const string& v
int varOperation(const vector<string>& str, unordered_map<string, boost::any>& variableValues)
{
try
{
if (count(str[0], '.') > 0)
if (IsVar(str[0], variableValues))
{
if (IsVar(split(str[0], '.')[0], variableValues))
// Checks if type is simple, like int or string
if (any_type(variableValues[str[0]]) <= 3)
{
//InterpreterLog(unWrapVec(vector<string>(str.begin() + 2, str.end())));
variableValues[split(str[0], '.')[0]] = EditClassSubComponent(variableValues[split(str[0], '.')[0]], str[1], EvalExpression(unWrapVec(vector<string>(str.begin() + 2, str.end())), variableValues), split(str[0], '.')[1]);
return 0;
if (str[1] == "=")
variableValues[str[0]] = EvalExpression(unWrapVec(vector<string>(str.begin() + 2, str.end())), variableValues);
else if (str[1] == "+=")
variableValues[str[0]] = EvalExpression(str[0] + "+(" + unWrapVec(vector<string>(str.begin() + 2, str.end())) + ")", variableValues);
else if (str[1] == "-=")
variableValues[str[0]] = AnyAsFloat(variableValues[str[0]]) - AnyAsFloat(EvalExpression(unWrapVec(vector<string>(str.begin() + 2, str.end())), variableValues));
else if (str[1] == "*=")
variableValues[str[0]] = AnyAsFloat(variableValues[str[0]]) * AnyAsFloat(EvalExpression(unWrapVec(vector<string>(str.begin() + 2, str.end())), variableValues));
else if (str[1] == "/=")
variableValues[str[0]] = AnyAsFloat(variableValues[str[0]]) / AnyAsFloat(EvalExpression(unWrapVec(vector<string>(str.begin() + 2, str.end())), variableValues));
else
LogWarning("unrecognized operator \'" + str[1] + "\'");
}
else if (IsVar(split(str[0], '.')[0], globalVariableValues))
// Else it is a Vec2. No other complex class can be operated on it's base form (ex. you can't do: Sprite += Sprite)
else if(any_type(variableValues[str[0]]) == 5)
{
//InterpreterLog(unWrapVec(vector<string>(str.begin() + 2, str.end())));
globalVariableValues[split(str[0], '.')[0]] = EditClassSubComponent(globalVariableValues[split(str[0], '.')[0]], str[1], EvalExpression(unWrapVec(vector<string>(str.begin() + 2, str.end())), variableValues), split(str[0], '.')[1]);
return 0;
boost::any otherExpression = EvalExpression(unWrapVec(vector<string>(str.begin() + 2, str.end())), variableValues);
if (str[1] == "=")
variableValues[str[0]] = otherExpression;
else if (str[1] == "+=")
variableValues[str[0]] = AnyAsVec2(variableValues[str[0]]) + AnyAsVec2(otherExpression);
else if (str[1] == "-=")
variableValues[str[0]] = AnyAsVec2(variableValues[str[0]]) - AnyAsVec2(otherExpression);
else if (str[1] == "*=")
variableValues[str[0]] = AnyAsVec2(variableValues[str[0]]) * AnyAsFloat(otherExpression);
else if (str[1] == "/=")
variableValues[str[0]] = AnyAsVec2(variableValues[str[0]]) / AnyAsFloat(otherExpression);
else
LogWarning("unrecognized operator \'" + str[1] + "\'");
}
}
else if (IsVar(str[0], variableValues))
{
if (str[1] == "=")
variableValues[str[0]] = EvalExpression(unWrapVec(vector<string>(str.begin() + 2, str.end())), variableValues);
else if (str[1] == "+=")
variableValues[str[0]] = EvalExpression(str[0] + "+(" + unWrapVec(vector<string>(str.begin() + 2, str.end())) + ")", variableValues);
else if (str[1] == "-=")
variableValues[str[0]] = AnyAsFloat(variableValues[str[0]]) - AnyAsFloat(EvalExpression(unWrapVec(vector<string>(str.begin() + 2, str.end())), variableValues));
else if (str[1] == "*=")
variableValues[str[0]] = AnyAsFloat(variableValues[str[0]]) * AnyAsFloat(EvalExpression(unWrapVec(vector<string>(str.begin() + 2, str.end())), variableValues));
else if (str[1] == "/=")
variableValues[str[0]] = AnyAsFloat(variableValues[str[0]]) / AnyAsFloat(EvalExpression(unWrapVec(vector<string>(str.begin() + 2, str.end())), variableValues));
else
LogWarning("unrecognized operator \'" + str[1] + "\'");
return 0;
}
else if (IsVar(str[0], globalVariableValues))
{
if (str[1] == "=")
globalVariableValues[str[0]] = EvalExpression(unWrapVec(vector<string>(str.begin() + 2, str.end())), variableValues);
else if (str[1] == "+=")
globalVariableValues[str[0]] = EvalExpression(str[0] + "+(" + unWrapVec(vector<string>(str.begin() + 2, str.end())) + ")", variableValues);
else if (str[1] == "-=")
globalVariableValues[str[0]] = AnyAsFloat(variableValues[str[0]]) - AnyAsFloat(EvalExpression(unWrapVec(vector<string>(str.begin() + 2, str.end())), variableValues));
else if (str[1] == "*=")
globalVariableValues[str[0]] = AnyAsFloat(variableValues[str[0]]) * AnyAsFloat(EvalExpression(unWrapVec(vector<string>(str.begin() + 2, str.end())), variableValues));
else if (str[1] == "/=")
globalVariableValues[str[0]] = AnyAsFloat(variableValues[str[0]]) / AnyAsFloat(EvalExpression(unWrapVec(vector<string>(str.begin() + 2, str.end())), variableValues));
else
LogWarning("unrecognized operator \'" + str[1] + "\'");
// Checks if type is simple, like int or string
if (any_type(globalVariableValues[str[0]]) <= 3)
{
if (str[1] == "=")
globalVariableValues[str[0]] = EvalExpression(unWrapVec(vector<string>(str.begin() + 2, str.end())), variableValues);
else if (str[1] == "+=")
globalVariableValues[str[0]] = EvalExpression(str[0] + "+(" + unWrapVec(vector<string>(str.begin() + 2, str.end())) + ")", variableValues);
else if (str[1] == "-=")
globalVariableValues[str[0]] = AnyAsFloat(globalVariableValues[str[0]]) - AnyAsFloat(EvalExpression(unWrapVec(vector<string>(str.begin() + 2, str.end())), variableValues));
else if (str[1] == "*=")
globalVariableValues[str[0]] = AnyAsFloat(globalVariableValues[str[0]]) * AnyAsFloat(EvalExpression(unWrapVec(vector<string>(str.begin() + 2, str.end())), variableValues));
else if (str[1] == "/=")
globalVariableValues[str[0]] = AnyAsFloat(globalVariableValues[str[0]]) / AnyAsFloat(EvalExpression(unWrapVec(vector<string>(str.begin() + 2, str.end())), variableValues));
else
LogWarning("unrecognized operator \'" + str[1] + "\'");
}
// Else it is a Vec2. No other complex class can be operated on it's base form (ex. you can't do: Sprite += Sprite)
else if (any_type(globalVariableValues[str[0]]) == 5)
{
boost::any otherExpression = EvalExpression(unWrapVec(vector<string>(str.begin() + 2, str.end())), variableValues);
if (str[1] == "=")
globalVariableValues[str[0]] = otherExpression;
else if (str[1] == "+=")
globalVariableValues[str[0]] = AnyAsVec2(globalVariableValues[str[0]]) + AnyAsVec2(otherExpression);
else if (str[1] == "-=")
globalVariableValues[str[0]] = AnyAsVec2(globalVariableValues[str[0]]) - AnyAsVec2(otherExpression);
else if (str[1] == "*=")
globalVariableValues[str[0]] = AnyAsVec2(globalVariableValues[str[0]]) * AnyAsFloat(otherExpression);
else if (str[1] == "/=")
globalVariableValues[str[0]] = AnyAsVec2(globalVariableValues[str[0]]) / AnyAsFloat(otherExpression);
else
LogWarning("unrecognized operator \'" + str[1] + "\'");
}
return 0;
}
LogWarning("uninitialized variable or typo in \'" + str[0] + "\'");
return 1;
}
catch (const std::exception&)
{
LogWarning("uninitialized variable or typo in \'" + str[0] + "\'");
return 1;
}
}
boost::any ProcessLine(const vector<vector<string>>& words, int lineNum, unordered_map<string, boost::any>& variableValues)
@ -331,10 +351,10 @@ boost::any ProcessLine(const vector<vector<string>>& words, int lineNum, unorder
if (words[lineNum][0][0] == '/' && words[lineNum][0][1] == '/')
return nullType;
// If print statement (deprecated, now use CPP.System.Print() function)
// If print statement (deprecated, now use SLB.System.Print() function)
else if (words[lineNum][0] == "print")
{
cout << AnyAsString(EvalExpression(unWrapVec(vector<string>(words[lineNum].begin() + 1, words[lineNum].end())), variableValues)) << endl;
cout << StringRaw(AnyAsString(EvalExpression(unWrapVec(vector<string>(words[lineNum].begin() + 1, words[lineNum].end())), variableValues))) << endl;
return nullType;
}
@ -342,14 +362,17 @@ boost::any ProcessLine(const vector<vector<string>>& words, int lineNum, unorder
else if (words[lineNum][0] == "return")
return EvalExpression(unWrapVec(vector<string>(words[lineNum].begin() + 1, words[lineNum].end())), variableValues);
// Check if it is CPP Builtin function
else if (words[lineNum][0][0] == 'C' && words[lineNum][0][1] == 'P' && words[lineNum][0][2] == 'P' && words[lineNum][0][3] == '.')
// Check if it is SLB Builtin function
else if (words[lineNum][0][0] == 'S' && words[lineNum][0][1] == 'L' && words[lineNum][0][2] == 'B' && words[lineNum][0][3] == '.')
return EvalExpression(unWrapVec(words[lineNum]), variableValues);
// Check if it is function
else if (IsFunction(trim(split(words[lineNum][0], '(')[0])))
{
ExecuteFunction(trim(split(words[lineNum][0], '(')[0]), VarValues(split(RMParenthesis(replace(unWrapVec(words[lineNum]), trim(split(words[lineNum][0], '(')[0]), "")), ','), variableValues));
if(count(words[lineNum][0], '(') >0 && count(words[lineNum][0], ')') > 0)
ExecuteFunction(trim(split(words[lineNum][0], '(')[0]), vector<boost::any>());
else
ExecuteFunction(trim(split(words[lineNum][0], '(')[0]), VarValues(split(RMParenthesis("(" + split(unWrapVec(rangeInVec(words[lineNum], 0, (int)words[lineNum].size()-1)), '(')[1]), ','), variableValues));
return nullType;
}
@ -380,8 +403,10 @@ boost::any ProcessLine(const vector<vector<string>>& words, int lineNum, unorder
// Check existing variables: To see if class sub component matches
else if (count(words[lineNum][0], '.') > 0 && IsVar(split(words[lineNum][0], '.')[0], variableValues) || IsVar(split(words[lineNum][0], '.')[0], globalVariableValues))
{
// Evaluates what the operator (ex. '=', '+=') does to the value on the left by the value on the right
varOperation(vector<string>(words[lineNum].begin(), words[lineNum].end()), variableValues);
if (IsVar(split(words[lineNum][0], '.')[0], variableValues))
variableValues[split(words[lineNum][0], '.')[0]] = EditClassSubComponent(variableValues[split(words[lineNum][0], '.')[0]], words[lineNum][1], EvalExpression(unWrapVec(vector<string>(words[lineNum].begin() + 2, words[lineNum].end())), variableValues), split(words[lineNum][0], '.')[1]);
else if (IsVar(split(words[lineNum][0], '.')[0], globalVariableValues))
globalVariableValues[split(words[lineNum][0], '.')[0]] = EditClassSubComponent(globalVariableValues[split(words[lineNum][0], '.')[0]], words[lineNum][1], EvalExpression(unWrapVec(vector<string>(words[lineNum].begin() + 2, words[lineNum].end())), variableValues), split(words[lineNum][0], '.')[1]);
return nullType;
}
@ -502,7 +527,7 @@ boost::any ExecuteFunction(const string& functionName, const vector<boost::any>&
for (int i = 0; i < (int)inputVarVals.size(); i++) {
variableValues[args[i]] = inputVarVals[i];
//cout << "\x1B[33m" << args[i] << " == " << AnyAsString(inputVarVals[i]) << "\033[0m\t\t" << endl;
//cout << functionName + " \x1B[33m" << args[i] << " == " << AnyAsString(inputVarVals[i]) << "\033[0m\t\t" << endl;
}
//Iterate through all lines in function
@ -543,12 +568,13 @@ int parseSlang(string script)
string functName = split(words[lineNum][1], '(')[0];
string args = "";
for (int w = 1; w < (int)words[lineNum].size(); w++) // Get all words from the instantiation line: these are the args
{
args += replace(replace(words[lineNum][w], "(", " "), ")", "");
}
if (indexInStr(unWrapVec(words[lineNum]), ')') - indexInStr(unWrapVec(words[lineNum]), '(') > 1)
for (int w = 1; w < (int)words[lineNum].size(); w++) // Get all words from the instantiation line: these are the args
{
args += replace(replace(words[lineNum][w], "(", " "), ")", "");
}
args = replace(args, functName + " ", "");
args = trim(replace(args, functName + " ", ""));
//InterpreterLog(args);
functionContents.push_back(split(args, ','));

View File

@ -9,6 +9,7 @@ using namespace boost;
using namespace std;
int LogWarning(const string& warningText);
int any_type(const boost::any& val);
// Gets if any is NullType
bool any_null(const boost::any& val)
@ -45,7 +46,7 @@ bool AnyAsBool(const boost::any& val)
}
catch (boost::bad_any_cast) // Does not convert, return
{
LogWarning("invalid conversion to type \'bool\'");
LogWarning("invalid conversion from " + to_string(any_type(val)) + " to type \'bool\'");
return false;
}
}
@ -84,7 +85,7 @@ string AnyAsString(const boost::any& val)
}
catch (boost::bad_any_cast) // Does not convert, return
{
LogWarning("invalid conversion to type \'string\'");
LogWarning("invalid conversion from " + to_string(any_type(val)) + " to type \'string\'");
return "";
}
}
@ -123,7 +124,7 @@ float AnyAsFloat(const boost::any& val)
}
catch (boost::bad_any_cast e) // Does not convert, return
{
LogWarning("invalid conversion to type \'float\'");
LogWarning("invalid conversion from " + to_string(any_type(val)) + " to type \'float\'");
return 0;
}
}
@ -162,7 +163,7 @@ int AnyAsInt(const boost::any& val)
}
catch (boost::bad_any_cast) // Does not convert, return
{
LogWarning("invalid conversion to type \'int\'");
LogWarning("invalid conversion from " + to_string(any_type(val)) + " to type \'int\'");
return 0;
}
}
@ -170,8 +171,38 @@ int AnyAsInt(const boost::any& val)
}
}
// Will get type 'any' val to a Vec2
Vec2 AnyAsVec2(const boost::any& val)
{
if (any_null(val))
return Vec2(0, 0);
try // Try converting to Vec2
{
return any_cast<Vec2>(val);
}
catch (boost::bad_any_cast)
{
try // Try converting to float then Vec2
{
return Vec2(any_cast<float>(val), any_cast<float>(val));
}
catch (boost::bad_any_cast)
{
try // Try converting to int then Vec2
{
return Vec2(any_cast<int>(val), any_cast<int>(val));
}
catch (boost::bad_any_cast) // Does not convert, return
{
LogWarning("invalid conversion from " + to_string(any_type(val)) + " to type \'Vec2\'");
return Vec2(0, 0);
}
}
}
}
// Gets type of 'any' val
// 0 -> int; 1 -> float; 2 -> bool; 3 -> string; 4 -> Sprite; 5 -> Vec2;
// 0 -> int; 1 -> float; 2 -> bool; 3 -> string; 4 -> Sprite; 5 -> Vec2; 6 -> Text;
int any_type(const boost::any& val)
{
try // Try converting to int
@ -214,10 +245,18 @@ int any_type(const boost::any& val)
Vec2 v = any_cast<Vec2>(val);
return 5;
}
catch (boost::bad_any_cast) // Does not convert, return
catch (boost::bad_any_cast) // Try converting to Text
{
LogWarning("variable has no type");
return -1;
try
{
Text t = any_cast<Text>(val);
return 6;
}
catch (boost::bad_any_cast) // Does not convert, return
{
LogWarning("variable has no type");
return -1;
}
}
}
}
@ -226,4 +265,27 @@ int any_type(const boost::any& val)
}
}
// Compares two 'any' values to see if they contain the same data
bool any_compare(const boost::any& a, const boost::any& b)
{
int aType = any_type(a);
int bType = any_type(b);
// If they are different types, then they can't possibly be equal
if ((aType > 3 && bType <= 3) || (aType <= 3 && bType > 3))
return false;
// If it is a float, int, bool, or string, then they can easily be compared in their string form
if (aType <= 3)
return AnyAsString(a) == AnyAsString(b);
// If it is a Sprite, then compare separately after converted
else if (aType == 4)
return any_cast<Sprite>(a) == any_cast<Sprite>(b);
// If it is a Vec2, then compare separately after converted
else if (aType == 5)
return any_cast<Vec2>(a) == any_cast<Vec2>(b);
}
#endif

View File

@ -97,28 +97,26 @@ int LogCriticalError(const string& errorText)
boost::any GetClassSubComponent(boost::any value, string subComponentName)
{
// If a Sprite Class
if (any_type(value) == 4)
{
return any_cast<Sprite>(value).SubComponent(subComponentName);
}
// If a Vec2 Class
if (any_type(value) == 5)
{
return any_cast<Vec2>(value).SubComponent(subComponentName);
}
// If a Sprite Class
if (any_type(value) == 4)
// If a Text Class
if (any_type(value) == 6)
{
return any_cast<Sprite>(value).SubComponent(subComponentName);
return any_cast<Text>(value).SubComponent(subComponentName);
}
return nullType;
}
boost::any EditClassSubComponent(boost::any value, string oper, boost::any otherVal, string subComponentName)
{
// If a Vec2 Class
if (any_type(value) == 5)
{
Vec2 v = any_cast<Vec2>(value);
v.EditSubComponent(subComponentName, oper, otherVal);
return v;
}
// If a Sprite Class
if (any_type(value) == 4)
{
@ -126,20 +124,42 @@ boost::any EditClassSubComponent(boost::any value, string oper, boost::any other
v.EditSubComponent(subComponentName, oper, otherVal);
return v;
}
// If a Vec2 Class
if (any_type(value) == 5)
{
Vec2 v = any_cast<Vec2>(value);
v.EditSubComponent(subComponentName, oper, otherVal);
return v;
}
// If a Text Class
if (any_type(value) == 6)
{
Text t = any_cast<Text>(value);
t.EditSubComponent(subComponentName, oper, otherVal);
return t;
}
return nullType;
}
bool AxisAlignedCollision(const Sprite& a, const Sprite& b) // AABB - AABB collision
{
// collision x-axis?
bool collisionX = a.position.x + a.scale.x >= b.position.x &&
b.position.x + b.scale.x >= a.position.x;
// collision y-axis?
bool collisionY = a.position.y + a.scale.y >= b.position.y &&
b.position.y + b.scale.y >= b.position.y;
// collision only if on both axes
return collisionX && collisionY;
}
// collision x-axis?
bool collisionX = a.position.x + a.scale.x >= b.position.x &&
b.position.x + b.scale.x >= a.position.x;
// collision y-axis?
bool collisionY = a.position.y + a.scale.y >= b.position.y &&
b.position.y + b.scale.y >= a.position.y;
//// collision x-axis?
//bool collisionX = a.position.x - a.scale.x / 2 >= b.position.x + b.scale.x / 2 ||
// a.position.x + a.scale.x / 2 <= b.position.x - b.scale.x / 2;
//// collision y-axis?
//bool collisionY = a.position.y - a.scale.y / 2 >= b.position.y + b.scale.y / 2 ||
// a.position.y + a.scale.y / 2 <= b.position.y - b.scale.y / 2;
// collision only if on both axes
return collisionX && collisionY;
}
// Initial script processing, which loads variables and functions from builtin
int GetBuiltins(const string& s)
@ -217,56 +237,60 @@ int GetBuiltins(const string& s)
}
// Executes
boost::any CPPFunction(const string& name, const vector<boost::any>& args)
boost::any SLBFunction(const string& name, const vector<boost::any>& args)
{
if (name == "CPP.Math.Sin")
if (name == "SLB.Math.Sin")
return sin(AnyAsFloat(args[0]));
else if (name == "CPP.Math.Cos")
else if (name == "SLB.Math.Cos")
return cos(AnyAsFloat(args[0]));
else if (name == "CPP.Math.Tan")
else if (name == "SLB.Math.Tan")
return tan(AnyAsFloat(args[0]));
else if (name == "CPP.Math.Round")
else if (name == "SLB.Math.Round")
return AnyAsInt(args[0]);
else if (name == "CPP.Math.Lerp")
else if (name == "SLB.Math.Lerp")
return lerp(AnyAsFloat(args[0]), AnyAsFloat(args[1]), AnyAsFloat(args[2]));
else if (name == "CPP.Math.Abs")
else if (name == "SLB.Math.Abs")
return abs(AnyAsFloat(args[0]));
else if (name == "CPP.Graphics.Init")
else if (name == "SLB.Graphics.Init")
{
InterpreterLog("Init graphics");
initGraphics(StringRaw(AnyAsString(args[0])), AnyAsInt(args[1]), AnyAsInt(args[2]));
}
else if (name == "CPP.Graphics.Sprite")
else if (name == "SLB.Graphics.Sprite")
{
Sprite s(StringRaw(AnyAsString(args[0])), any_cast<Vec2>(args[1]), any_cast<Vec2>(args[2]), AnyAsFloat(args[3]));
return s;
}
else if (name == "CPP.Graphics.Draw")
else if (name == "SLB.Graphics.Draw")
any_cast<Sprite>(args[0]).Draw();
else if (name == "CPP.Graphics.Text")
else if (name == "SLB.Graphics.Load")
any_cast<Sprite>(args[0]).Load();
else if (name == "SLB.Graphics.Text")
{
Text t(StringRaw(AnyAsString(args[0])), any_cast<Vec2>(args[1]), any_cast<Vec2>(args[2]), AnyAsFloat(args[3]), AnyAsFloat(args[4]), AnyAsFloat(args[5]), AnyAsFloat(args[6]), AnyAsFloat(args[7]));
Text t(StringRaw(AnyAsString(args[0])), StringRaw(AnyAsString(args[1])), any_cast<Vec2>(args[2]), AnyAsFloat(args[3]), AnyAsFloat(args[4]), AnyAsFloat(args[5]), AnyAsFloat(args[6]), AnyAsFloat(args[7]));
return t;
}
else if (name == "CPP.Graphics.DrawText")
else if (name == "SLB.Graphics.DrawText")
any_cast<Text>(args[0]).Draw();
else if (name == "CPP.Physics.AxisAlignedCollision")
else if (name == "SLB.Graphics.LoadText")
any_cast<Text>(args[0]).Load();
else if (name == "SLB.Physics.AxisAlignedCollision")
{
return AxisAlignedCollision(any_cast<Sprite>(args[0]), any_cast<Sprite>(args[1]));
}
else if (name == "CPP.Input.GetKey")
else if (name == "SLB.Input.GetKey")
return KEYS[StringRaw(any_cast<string>(args[0]))] == 1;
else if (name == "CPP.System.Print")
else if (name == "SLB.System.Print")
cout << StringRaw(AnyAsString(args[0]));
else if (name == "CPP.System.PrintLine")
else if (name == "SLB.System.PrintLine")
cout << StringRaw(AnyAsString(args[0])) << endl;
else if (name == "CPP.System.Vec2")
else if (name == "SLB.System.Vec2")
{
Vec2 v(AnyAsFloat(args[0]), AnyAsFloat(args[1]));
return v;
}
else
LogWarning("CPP function \'" + name + "\' does not exist.");
LogWarning("SLB function \'" + name + "\' does not exist.");
return nullType;
}

View File

@ -6,21 +6,21 @@ float EulersNumber = 2.71828183
// Trigonometric function Sin
func Sin(input)
{
float out = CPP.Math.Sin(input)
float out = SLB.Math.Sin(input)
return out
}
// Trigonometric function Cos
func Cos(input)
{
float out = CPP.Math.Cos(input)
float out = SLB.Math.Cos(input)
return out
}
// Trigonometric function Tan
func Tan(input)
{
float out = CPP.Math.Tan(input)
float out = SLB.Math.Tan(input)
return out
}
@ -41,21 +41,21 @@ func Tanh(input)
// Rounds input to nearest integer value
func Round(input)
{
float out = CPP.Math.Round(input)
float out = SLB.Math.Round(input)
return out
}
// Linearly interpolates between a and b by t
func Lerp(a, b, t)
{
float out = CPP.Math.Lerp(a, b, t)
float out = SLB.Math.Lerp(a, b, t)
return out
}
// Get absolute value of x
func Abs(x)
{
float out = CPP.Math.Abs(x)
float out = SLB.Math.Abs(x)
return out
}
@ -90,45 +90,45 @@ func Clamp(input, min, max)
// Sets color of pixel to RGB value
func SetPixel(x, y, r, g, b)
{
string out = CPP.Graphics.SetPixel(x, y, r, g, b)
string out = SLB.Graphics.SetPixel(x, y, r, g, b)
return out
}
// Prints input value to console
func Print(in)
{
CPP.System.Print(in)
SLB.System.Print(in)
}
// Prints input value to console with appended newline '\n'
func Printl(in)
{
CPP.System.PrintLine(in)
SLB.System.PrintLine(in)
}
// Creates new sprite class
func NSprite(path, x, y, r)
{
Sprite s = CPP.Graphics.Sprite(path, x, y, r)
Sprite s = SLB.Graphics.Sprite(path, x, y, r)
return s
}
// Draws sprite to window
func Draw(spr)
{
CPP.Graphics.Draw(spr)
SLB.Graphics.Draw(spr)
}
// Creates new Vector2 class
func NVec2(x, y)
{
Vec2 v = CPP.System.Vec2(x, y)
Vec2 v = SLB.System.Vec2(x, y)
return v
}
// Gets if key is down
func GetKey(keyName)
{
bool b = CPP.Input.GetKey(keyName)
bool b = SLB.Input.GetKey(keyName)
return b
}

View File

@ -1,4 +1,4 @@
// CPP program to evaluate a given expression
// SLB program to evaluate a given expression
#include <iostream>
#include <fstream>
#include <string>
@ -35,7 +35,8 @@ float applyOp(const float& a, const float& b, const char& op) {
// Function that returns value of
// expression after evaluation.
float evaluate(const string& t) {
float evaluate(const string& t)
{
string tokens = replace(t, " ", "");
float i;
@ -44,16 +45,11 @@ float evaluate(const string& t) {
stack <char> ops;
bool negative = false;
for (i = 0; i < tokens.length(); i++) {
// Current token is a whitespace,
// skip it.
if (tokens[i] == ' ')
continue;
for (i = 0; i < tokens.length(); i++)
{
// Current token is an opening
// brace, push it to 'ops'
else if (tokens[i] == '(')
if (tokens[i] == '(')
{
ops.push(tokens[i]);
}
@ -116,7 +112,7 @@ float evaluate(const string& t) {
// Current token is an operator.
else
{
if (tokens[i] == '-' && (i == 0 || tokens[i-1] == '*' || tokens[i-1] == '/' || tokens[i-1] == '+' || tokens[i-1] == '-' || tokens[i-1] == '^'))
if (tokens[i] == '-' && (i == 0 || tokens[i-1] == '*' || tokens[i-1] == '/' || tokens[i-1] == '+' || tokens[i-1] == '-' || tokens[i-1] == '^' || tokens[i-1] == '(' || tokens[i-1] == ')'))
{
negative = true;
continue;

View File

@ -206,6 +206,11 @@ public:
return *this;
}
bool operator==(Vec2 other)
{
return x == other.x && y == other.y;
}
boost::any SubComponent(std::string componentName)
{
if (componentName == "x")
@ -376,6 +381,11 @@ public:
return 0;
}
bool operator==(Sprite other)
{
return position == other.position && angle == other.angle && scale == other.scale && texture == other.texture;
}
boost::any SubComponent(std::string componentName)
{
if (componentName == "position")
@ -394,6 +404,7 @@ public:
Sprite EditSubComponent(std::string componentName, std::string oper, boost::any otherVal)
{
//cout << ("ComponentName = " + componentName + " Op = " + oper + " OtherVal = " + AnyAsString(otherVal)) << endl;
if (componentName == "position")
{
if (oper == "=")
@ -500,15 +511,17 @@ public:
int Load()
{
TTF_Font* font = TTF_OpenFont(pathToFont, fontSize);
TTF_Font* font = TTF_OpenFont(pathToFont.c_str(), fontSize);
SDL_Color color = {r, g, b};
SDL_Surface* surface = TTF_RenderText_Solid(font, content, color);
SDL_Surface* surface = TTF_RenderText_Solid(font, content.c_str(), color);
texture = SDL_CreateTextureFromSurface(gRenderer, surface);
TTF_SizeText(font, Message, &rect.w, &rect.h);
TTF_SizeText(font, content.c_str(), &rect.w, &rect.h);
scale.x = rect.w;
scale.y = rect.h;
SDL_FreeSurface(surface);
return 0;
@ -516,20 +529,25 @@ public:
int Draw()
{
rect.x = position.x;
rect.y = position.y;
SDL_RenderCopy(gRenderer, texture, NULL, &rect);
return 0;
}
boost::any SubComponent(std::string componentName)
{
//cerr << componentName << endl;
if (componentName == "position")
return position;
if (componentName == "position.x")
return position.x;
if (componentName == "position.y")
return position.y;
if (componentName == "scale")
return scale;
if (componentName == "scale.x")
return scale.x;
if (componentName == "scale.y")
return scale.y;
if (componentName == "fontSize")
return fontSize;
if (componentName == "content")
@ -538,8 +556,9 @@ public:
return pathToFont;
}
Sprite EditSubComponent(std::string componentName, std::string oper, boost::any otherVal)
Text EditSubComponent(const std::string componentName, const std::string oper, const boost::any otherVal)
{
//cerr << componentName << " " << AnyAsString(otherVal) << endl;
if (componentName == "position")
{
if (oper == "=")
@ -645,6 +664,7 @@ public:
}
Vec2 position;
Vec2 scale;
float fontSize;
double angle;
int r;

View File

@ -4,16 +4,16 @@ int SCREENH = 600
int scoreOne = 0
int scoreTwo = 0
float ballSpeed = 3
float ballSpeed = 8
float paddleMoveSpeed = 7
float paddleMoveSpeed = 16
// Main is always run at the VERY BEGINNING. Start() is the start of GRAPHICS
// so if you never call CPP.Grapgics.Init, then Start won't run
// so if you never call SLB.Grapgics.Init, then Start won't run
func Main(input, in)
{
// Immediately creates the window, then Start(), then the game loop. The game loop calls Update() every frame
CPP.Graphics.Init("This is a pong game", SCREENW, SCREENH)
SLB.Graphics.Init("This is a pong game", SCREENW, SCREENH)
}
func Start()
@ -22,11 +22,12 @@ func Start()
float centerY = SCREENH / 2
global Vec2 centerOfScreen = NVec2(centerX, centerY)
Vec2 ballScale = NVec2(16, 16)
Vec2 ballPos = centerOfScreen - ballScale
Vec2 ballScale = NVec2(10, 10)
Vec2 ballPos = centerOfScreen
ballPos -= ballScale
Vec2 paddleScale = NVec2(16, 70)
float yPosPaddle = yPosBall - paddleScale.y / 2
Vec2 paddleScale = NVec2(4, 70)
float yPosPaddle = ballPos.y - (paddleScale.y / 2)
Vec2 lPaddlePosition = NVec2(15, yPosPaddle)
global Vec2 lPaddleTargetPosition = NVec2(15, yPosPaddle)
@ -35,13 +36,18 @@ func Start()
Vec2 rPaddlePosition = NVec2(rOffset, yPosPaddle)
global Vec2 rPaddleTargetPosition = NVec2(rOffset, yPosPaddle)
global Sprite ballSpr = CPP.Graphics.Sprite("./square.png", ballPos, ballScale, 0)
global Sprite lPaddle = CPP.Graphics.Sprite("./square.png", lPaddlePosition, paddleScale, 0)
global Sprite rPaddle = CPP.Graphics.Sprite("./square.png", rPaddlePosition, paddleScale, 0)
global Sprite ballSpr = SLB.Graphics.Sprite("./square.png", ballPos, ballScale, 0)
global Sprite lPaddle = SLB.Graphics.Sprite("./square.png", lPaddlePosition, paddleScale, 0)
global Sprite rPaddle = SLB.Graphics.Sprite("./square.png", rPaddlePosition, paddleScale, 0)
// global Text scoreTextOne = CPP.Graphics.Text("score", "./Arial.ttf", centerOfScreen, 20, 0, 255, 255, 255)
float leftOffset = SCREENW / 4
Vec2 scoreOnePos = NVec2(leftOffset - 40, 30)
global Text scoreTextOne = SLB.Graphics.Text("score", "./arial.ttf", scoreOnePos, 40, 0, 255, 255, 255)
float rightOffset = SCREENW - (SCREENW / 4)
Vec2 scoreTwoPos = NVec2(rightOffset - 40, 30)
global Text scoreTextTwo = SLB.Graphics.Text("score", "./arial.ttf", scoreTwoPos, 40, 0, 255, 255, 255)
global Vec2 ballVelocity = NVec2(ballSpeed, 0)
global Vec2 ballVelocity = NVec2(ballSpeed, ballSpeed)
}
func Update(deltaTime)
@ -58,6 +64,7 @@ func Update(deltaTime)
float newY = lPaddleTargetPosition.y - paddleMoveSpeed
newY = Clamp(newY, 0, SCREENH - 70)
lPaddleTargetPosition = NVec2(newX, newY)
print "MOVE UP"
}
if GetKey("S") == true
{
@ -66,6 +73,7 @@ func Update(deltaTime)
float newY = lPaddleTargetPosition.y + paddleMoveSpeed
newY = Clamp(newY, 0, SCREENH - 70)
lPaddleTargetPosition = NVec2(newX, newY)
print "MOVE DOWN"
}
// Lerps from old position to destination smoothly
float oldY = lPaddle.position.y
@ -102,11 +110,12 @@ func Update(deltaTime)
ballSpr.position += ballVelocity
// Finally draws all of the sprites
CPP.Graphics.Draw(ballSpr)
CPP.Graphics.Draw(lPaddle)
CPP.Graphics.Draw(rPaddle)
SLB.Graphics.Draw(ballSpr)
SLB.Graphics.Draw(lPaddle)
SLB.Graphics.Draw(rPaddle)
// scoreTextOne.DrawText()
SLB.Graphics.DrawText(scoreTextOne)
SLB.Graphics.DrawText(scoreTextTwo)
HandleBallBounce()
}
@ -117,39 +126,52 @@ func HandleBallBounce()
float ballY = ballSpr.position.y
float scaleY = ballSpr.scale.y
float topEdge = ballY - scaleY
// Checks if the ball is touching the ceiling
if ballY - scaleY <= 0
if topEdge <= 0
{
ballVelocity = NVec2(ballVelocity.x, -ballVelocity.y)
float vX = ballVelocity.x
float vY = ballVelocity.y
vY *= -1
ballVelocity = NVec2(vX, vY)
return 0
}
float bottomEdge = ballY + scaleY
// Checks if the ball is touching the floor
if ballY + scaleY >= SCREENH
if bottomEdge >= SCREENH
{
ballVelocity = NVec2(ballVelocity.x, -ballVelocity.y)
float vX = ballVelocity.x
float vY = ballVelocity.y
vY *= -1
ballVelocity = NVec2(vX, vY)
return 0
}
// Checks if ball is in player 1 goal
if ballX < 0
{
Vec2 ballScale = NVec2(16, 16)
Vec2 ballPos = centerOfScreen - ballScale
Vec2 ballPos = centerOfScreen
ballPos -= ballSpr.scale
ballPos.x -= SCREENW / 3
scoreTwo += 1
ballSpr.position = ballPos
ballVelocity = NVec2(ballSpeed, 0)
return 0
scoreTextTwo.content = Round(scoreTwo)
print scoreTextTwo.content
SLB.Graphics.LoadText(scoreTextTwo)
}
// Checks if ball is in player 2 goal
if ballX > SCREENW
{
Vec2 ballScale = NVec2(16, 16)
Vec2 ballPos = centerOfScreen - ballScale
Vec2 ballPos = centerOfScreen
ballPos -= ballSpr.scale
ballPos.x += SCREENW / 3
scoreOne += 1
ballSpr.position = ballPos
ballVelocity = NVec2(-ballSpeed, 0)
// scoreTextOne.content = scoreOne
return 0
scoreTextOne.content = Round(scoreOne)
print scoreTextOne.content
SLB.Graphics.LoadText(scoreTextOne)
}
// Checks if colliding with left paddle
@ -158,12 +180,15 @@ func HandleBallBounce()
{
float difference = lPaddle.position.y
difference -= ballY
float normalizedRelativeIntersectionY = (difference/(lPaddle.scale.y/2))
float bounceAngle = normalizedRelativeIntersectionY * 1.30899694
float ballVx = ballSpeed*Cos(bounceAngle)
float ballVy = ballSpeed*-Sin(bounceAngle)
float paddleHeight = lPaddle.scale.y
float normalizedRelativeIntersectionY = difference / (paddleHeight / 2)
float bounceAngle = normalizedRelativeIntersectionY * 0.523599
float ballVx = ballSpeed
ballVx *= Cos(bounceAngle)
float ballVy = ballSpeed
ballVy *= Sin(bounceAngle)
ballVy *= -1
ballVelocity = NVec2(ballVx, ballVy)
return 0
}
// Checks if colliding with right paddle
bool coll = Colliding(ballSpr, rPaddle)
@ -171,17 +196,20 @@ func HandleBallBounce()
{
float difference = rPaddle.position.y
difference -= ballY
float normalizedRelativeIntersectionY = (difference/(rPaddle.scale.y/2))
float bounceAngle = normalizedRelativeIntersectionY * 1.30899694
float ballVx = ballSpeed*Cos(bounceAngle)
float ballVy = ballSpeed*-Sin(bounceAngle)
float paddleHeight = rPaddle.scale.y
float normalizedRelativeIntersectionY = difference / (paddleHeight / 2)
float bounceAngle = normalizedRelativeIntersectionY * 0.523599
float ballVx = ballSpeed
ballVx *= Cos(bounceAngle)
ballVx *= -1
float ballVy = ballSpeed
ballVy *= Sin(bounceAngle)
ballVelocity = NVec2(ballVx, ballVy)
return 0
}
}
func Colliding(a, b)
{
bool b = CPP.Physics.AxisAlignedCollision(a, b)
bool b = SLB.Physics.AxisAlignedCollision(a, b)
return b
}

View File

@ -131,7 +131,8 @@ int count(const string& str, const char& ch) {
return cnt;
}
int countNoOverlap(const string& str, const char& ch1, const char& ch2) {
int countNoOverlap(const string& str, const char& searchFor, const char& ch1, const char& ch2)
{
int cnt = 0;
bool waitingForClose = false;
@ -141,10 +142,28 @@ int countNoOverlap(const string& str, const char& ch1, const char& ch2) {
if (str[i] == ch1)
waitingForClose = true;
else if (str[i] == ch2 && waitingForClose == true)
{
cnt++;
waitingForClose = false;
}
else if (str[i] == searchFor && waitingForClose == true)
cnt++;
}
return cnt;
}
int countOutsideParenthesis(const string& str, const char& searchFor)
{
int cnt = 0;
bool waitingForClose = false;
for (int i = 0; i < (int)str.size(); i++)
{
if (str[i] == '(')
waitingForClose = true;
else if (str[i] == ')' && waitingForClose == true)
waitingForClose = false;
else if (str[i] == searchFor && waitingForClose == false)
cnt++;
}
return cnt;

View File

@ -7,6 +7,9 @@ using namespace std;
float AnyAsFloat(const boost::any& val);
string AnyAsString(const boost::any& val);
int AnyAsInt(const boost::any& val);
bool AnyAsBool(const boost::any& val);
bool isNumber(const string& str);
@ -29,7 +32,9 @@ vector<string> split(const string& str, const char& del);
int count(const string& str, const char& ch);
int countNoOverlap(const string& str, const char& ch1, const char& ch2);
int countNoOverlap(const string& str, const char& searchFor, const char& ch1, const char& ch2);
int countOutsideParenthesis(const string& str, const char& searchFor);
int indexInStr(const string& str, const char& ch);