From 71ba1d608ee78cd7996073aefe8763c331f3fade Mon Sep 17 00:00:00 2001 From: sam-astro <77079540+sam-astro@users.noreply.github.com> Date: Thu, 13 Jan 2022 19:45:03 -0500 Subject: [PATCH] Optimization, graphics and builtin updates, and continued working on pong game in Slang --- Slang/Main.cpp | 191 ++++++++++++++++++++++------------------------ Slang/builtin.h | 7 ++ Slang/builtin.slg | 21 +++++ Slang/graphics.h | 69 ++++++++++++++--- Slang/script.slg | 93 +++++++++++++++++++--- Slang/strops.cpp | 20 +++++ Slang/strops.h | 4 +- 7 files changed, 283 insertions(+), 122 deletions(-) diff --git a/Slang/Main.cpp b/Slang/Main.cpp index f63ddbc..b3258a4 100644 --- a/Slang/Main.cpp +++ b/Slang/Main.cpp @@ -29,7 +29,7 @@ boost::any GetVariableValue(const string& varName, const unordered_map 0) { - classSubComponent = rangeInStr(varName, indexInStr(varName, '.')+1, -1); + classSubComponent = varName.substr(indexInStr(varName, '.')+1, -1); baseName = split(varName, '.')[0]; } @@ -243,7 +243,7 @@ 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))); if (determinant == "==") return AnyAsString(valARealValue) == AnyAsString(valBRealValue); else if (determinant == "!=") @@ -264,55 +264,63 @@ bool BooleanLogic(const string& valA, const string& determinant, const string& v int varOperation(const vector& str, unordered_map& variableValues) { - if (count(str[0], '.') > 0) + try { - if (IsVar(split(str[0], '.')[0], variableValues)) + if (count(str[0], '.') > 0) { - //InterpreterLog(unWrapVec(vector(str.begin() + 2, str.end()))); - variableValues[split(str[0], '.')[0]] = EditClassSubComponent(variableValues[split(str[0], '.')[0]], str[1], EvalExpression(unWrapVec(vector(str.begin() + 2, str.end())), variableValues), split(str[0], '.')[1]); + if (IsVar(split(str[0], '.')[0], variableValues)) + { + //InterpreterLog(unWrapVec(vector(str.begin() + 2, str.end()))); + variableValues[split(str[0], '.')[0]] = EditClassSubComponent(variableValues[split(str[0], '.')[0]], str[1], EvalExpression(unWrapVec(vector(str.begin() + 2, str.end())), variableValues), split(str[0], '.')[1]); + return 0; + } + else if (IsVar(split(str[0], '.')[0], globalVariableValues)) + { + //InterpreterLog(unWrapVec(vector(str.begin() + 2, str.end()))); + globalVariableValues[split(str[0], '.')[0]] = EditClassSubComponent(globalVariableValues[split(str[0], '.')[0]], str[1], EvalExpression(unWrapVec(vector(str.begin() + 2, str.end())), variableValues), split(str[0], '.')[1]); + return 0; + } + } + else if (IsVar(str[0], variableValues)) + { + if (str[1] == "=") + variableValues[str[0]] = EvalExpression(unWrapVec(vector(str.begin() + 2, str.end())), variableValues); + else if (str[1] == "+=") + variableValues[str[0]] = EvalExpression(str[0] + "+(" + unWrapVec(vector(str.begin() + 2, str.end())) + ")", variableValues); + else if (str[1] == "-=") + variableValues[str[0]] = AnyAsFloat(variableValues[str[0]]) - AnyAsFloat(EvalExpression(unWrapVec(vector(str.begin() + 2, str.end())), variableValues)); + else if (str[1] == "*=") + variableValues[str[0]] = AnyAsFloat(variableValues[str[0]]) * AnyAsFloat(EvalExpression(unWrapVec(vector(str.begin() + 2, str.end())), variableValues)); + else if (str[1] == "/=") + variableValues[str[0]] = AnyAsFloat(variableValues[str[0]]) / AnyAsFloat(EvalExpression(unWrapVec(vector(str.begin() + 2, str.end())), variableValues)); + else + LogWarning("unrecognized operator \'" + str[1] + "\'"); return 0; } - else if (IsVar(split(str[0], '.')[0], globalVariableValues)) + else if (IsVar(str[0], globalVariableValues)) { - //InterpreterLog(unWrapVec(vector(str.begin() + 2, str.end()))); - globalVariableValues[split(str[0], '.')[0]] = EditClassSubComponent(globalVariableValues[split(str[0], '.')[0]], str[1], EvalExpression(unWrapVec(vector(str.begin() + 2, str.end())), variableValues), split(str[0], '.')[1]); + if (str[1] == "=") + globalVariableValues[str[0]] = EvalExpression(unWrapVec(vector(str.begin() + 2, str.end())), variableValues); + else if (str[1] == "+=") + globalVariableValues[str[0]] = EvalExpression(str[0] + "+(" + unWrapVec(vector(str.begin() + 2, str.end())) + ")", variableValues); + else if (str[1] == "-=") + globalVariableValues[str[0]] = AnyAsFloat(variableValues[str[0]]) - AnyAsFloat(EvalExpression(unWrapVec(vector(str.begin() + 2, str.end())), variableValues)); + else if (str[1] == "*=") + globalVariableValues[str[0]] = AnyAsFloat(variableValues[str[0]]) * AnyAsFloat(EvalExpression(unWrapVec(vector(str.begin() + 2, str.end())), variableValues)); + else if (str[1] == "/=") + globalVariableValues[str[0]] = AnyAsFloat(variableValues[str[0]]) / AnyAsFloat(EvalExpression(unWrapVec(vector(str.begin() + 2, str.end())), variableValues)); + else + LogWarning("unrecognized operator \'" + str[1] + "\'"); return 0; } + LogWarning("uninitialized variable or typo in \'" + str[0] + "\'"); + return 1; } - else if (IsVar(str[0], variableValues)) + catch (const std::exception&) { - if (str[1] == "=") - variableValues[str[0]] = EvalExpression(unWrapVec(vector(str.begin() + 2, str.end())), variableValues); - else if (str[1] == "+=") - variableValues[str[0]] = EvalExpression(str[0] + "+(" + unWrapVec(vector(str.begin() + 2, str.end())) + ")", variableValues); - else if (str[1] == "-=") - variableValues[str[0]] = AnyAsFloat(variableValues[str[0]]) - AnyAsFloat(EvalExpression(unWrapVec(vector(str.begin() + 2, str.end())), variableValues)); - else if (str[1] == "*=") - variableValues[str[0]] = AnyAsFloat(variableValues[str[0]]) * AnyAsFloat(EvalExpression(unWrapVec(vector(str.begin() + 2, str.end())), variableValues)); - else if (str[1] == "/=") - variableValues[str[0]] = AnyAsFloat(variableValues[str[0]]) / AnyAsFloat(EvalExpression(unWrapVec(vector(str.begin() + 2, str.end())), variableValues)); - else - LogWarning("unrecognized operator \'" + str[1] + "\'"); - return 0; + LogWarning("uninitialized variable or typo in \'" + str[0] + "\'"); + return 1; } - else if (IsVar(str[0], globalVariableValues)) - { - if (str[1] == "=") - globalVariableValues[str[0]] = EvalExpression(unWrapVec(vector(str.begin() + 2, str.end())), variableValues); - else if (str[1] == "+=") - globalVariableValues[str[0]] = EvalExpression(str[0] + "+(" + unWrapVec(vector(str.begin() + 2, str.end())) + ")", variableValues); - else if (str[1] == "-=") - globalVariableValues[str[0]] = AnyAsFloat(variableValues[str[0]]) - AnyAsFloat(EvalExpression(unWrapVec(vector(str.begin() + 2, str.end())), variableValues)); - else if (str[1] == "*=") - globalVariableValues[str[0]] = AnyAsFloat(variableValues[str[0]]) * AnyAsFloat(EvalExpression(unWrapVec(vector(str.begin() + 2, str.end())), variableValues)); - else if (str[1] == "/=") - globalVariableValues[str[0]] = AnyAsFloat(variableValues[str[0]]) / AnyAsFloat(EvalExpression(unWrapVec(vector(str.begin() + 2, str.end())), variableValues)); - else - LogWarning("unrecognized operator \'" + str[1] + "\'"); - return 0; - } - LogWarning("uninitialized variable or typo in \'" + str[0] + "\'"); - return 1; } boost::any ProcessLine(const vector>& words, int lineNum, unordered_map& variableValues) @@ -362,7 +370,7 @@ boost::any ProcessLine(const vector>& words, int lineNum, unorder // Check existing variables: If matches, then it means // the variables value is getting changed with an operator - else if (IsVar(words[lineNum][0], variableValues) || IsVar(words[lineNum][0], globalVariableValues)) + else if (count(words[lineNum][0], '.') == 0 && (IsVar(words[lineNum][0], variableValues) || IsVar(words[lineNum][0], globalVariableValues))) { // Evaluates what the operator (ex. '=', '+=') does to the value on the left by the value on the right varOperation(vector(words[lineNum].begin(), words[lineNum].end()), variableValues); @@ -370,7 +378,7 @@ boost::any ProcessLine(const vector>& words, int lineNum, unorder } // Check existing variables: To see if class sub component matches - else if (IsVar(split(words[lineNum][0], '.')[0], variableValues) || IsVar(split(words[lineNum][0], '.')[0], globalVariableValues)) + 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(words[lineNum].begin(), words[lineNum].end()), variableValues); @@ -380,7 +388,7 @@ boost::any ProcessLine(const vector>& words, int lineNum, unorder // Gathers while loop contents else if (words[lineNum][0] == "while") { - vector whileContents; + vector> whileContents; vector whileParameters; for (int w = 1; w < (int)words[lineNum].size(); w++) @@ -392,24 +400,16 @@ boost::any ProcessLine(const vector>& words, int lineNum, unorder numOfBrackets += countInVector(words[p], "{") - countInVector(words[p], "}"); if (numOfBrackets == 0) break; - whileContents.push_back(""); - for (int w = 0; w < (int)words[p].size(); w++) - { - whileContents[(int)whileContents.size() - 1] += words[p][w] + " "; - } + whileContents.push_back(words[p]); } - whileContents = removeTabs(whileContents, 1); - - vector> innerWords; - for (int i = 0; i < (int)whileContents.size(); i++) - innerWords.push_back(split(whileContents[i], ' ')); + whileContents = removeTabsWdArry(whileContents, 1); while (BooleanLogic(whileParameters[0], whileParameters[1], whileParameters[2], variableValues)) { //Iterate through all lines in while loop for (int lineNum = 0; lineNum < (int)whileContents.size(); lineNum++) { - boost::any returnVal = ProcessLine(innerWords, lineNum, variableValues); + boost::any returnVal = ProcessLine(whileContents, lineNum, variableValues); if (!returnVal.empty()) return returnVal; } @@ -420,7 +420,7 @@ boost::any ProcessLine(const vector>& words, int lineNum, unorder // Gathers if statement contents else if (words[lineNum][0] == "if") { - vector ifContents; + vector> ifContents; vector ifParameters; for (int w = 1; w < (int)words[lineNum].size(); w++) @@ -433,62 +433,54 @@ boost::any ProcessLine(const vector>& words, int lineNum, unorder numOfBrackets += countInVector(words[lineNum], "{") - countInVector(words[lineNum], "}"); if (numOfBrackets == 0) break; - ifContents.push_back(""); - for (int w = 0; w < (int)words[lineNum].size(); w++) - { - ifContents[(int)ifContents.size() - 1] += words[lineNum][w] + " "; - } + ifContents.push_back(words[lineNum]); lineNum++; } - ifContents = removeTabs(ifContents, 1); - - vector> innerWords; - for (int i = 0; i < (int)ifContents.size(); i++) - innerWords.push_back(split(ifContents[i], ' ')); + ifContents = removeTabsWdArry(ifContents, 1); if (BooleanLogic(ifParameters[0], ifParameters[1], ifParameters[2], variableValues)) { //Iterate through all lines in if statement for (int l = 0; l < (int)ifContents.size(); l++) { - boost::any returnVal = ProcessLine(innerWords, l, variableValues); + boost::any returnVal = ProcessLine(ifContents, l, variableValues); if (!returnVal.empty()) return returnVal; } } - else if (words.size() > lineNum + 1) - if (words[lineNum + 1][0] == "else") - { - lineNum += 1; + //else if (words.size() > lineNum + 1) + // if (words[lineNum + 1][0] == "else") + // { + // lineNum += 1; - vector elseContents; + // vector elseContents; - int numOfBrackets = 1; - while (lineNum < (int)words.size()) - { - numOfBrackets += countInVector(words[lineNum], "{") - countInVector(words[lineNum], "}"); - if (numOfBrackets == 0) - break; - elseContents.push_back(""); - for (int w = 0; w < (int)words[lineNum].size(); w++) - { - elseContents[(int)elseContents.size() - 1] += words[lineNum][w] + " "; - } - lineNum++; - } - elseContents = removeTabs(elseContents, 2); + // int numOfBrackets = 1; + // while (lineNum < (int)words.size()) + // { + // numOfBrackets += countInVector(words[lineNum], "{") - countInVector(words[lineNum], "}"); + // if (numOfBrackets == 0) + // break; + // elseContents.push_back(""); + // for (int w = 0; w < (int)words[lineNum].size(); w++) + // { + // elseContents[(int)elseContents.size() - 1] += words[lineNum][w] + " "; + // } + // lineNum++; + // } + // elseContents = removeTabs(elseContents, 2); - vector> innerWords; - for (int i = 0; i < (int)elseContents.size(); i++) - innerWords.push_back(split(elseContents[i], ' ')); + // vector> innerWords; + // for (int i = 0; i < (int)elseContents.size(); i++) + // innerWords.push_back(split(elseContents[i], ' ')); - //Iterate through all lines in else statement - for (int lineNum = 0; lineNum < (int)elseContents.size(); lineNum++) - { - ProcessLine(innerWords, lineNum, variableValues); - } - return nullType; - } + // //Iterate through all lines in else statement + // for (int lineNum = 0; lineNum < (int)elseContents.size(); lineNum++) + // { + // ProcessLine(innerWords, lineNum, variableValues); + // } + // return nullType; + // } return nullType; } //// Gathers else statement contents @@ -516,17 +508,16 @@ boost::any ExecuteFunction(const string& functionName, const vector& //Iterate through all lines in function for (int lineNum = 1; lineNum < (int)words.size(); lineNum++) { - boost::any returnVal = 0; try { - returnVal = ProcessLine(words, lineNum, variableValues); + boost::any returnVal = ProcessLine(words, lineNum, variableValues); + if (!returnVal.empty()) + return returnVal; } catch (const std::exception&) { LogCriticalError("\'" + unWrapVec(words[lineNum]) + "\'\n In function: " + functionName + "\n Line: " + to_string(lineNum)); } - if (!returnVal.empty()) - return returnVal; } return nullType; } diff --git a/Slang/builtin.h b/Slang/builtin.h index 5a22bff..11fc2c5 100644 --- a/Slang/builtin.h +++ b/Slang/builtin.h @@ -129,6 +129,11 @@ boost::any EditClassSubComponent(boost::any value, string oper, boost::any other return nullType; } +bool AxisAlignedCollision(const Sprite& a, const Sprite& b) +{ + +} + // Initial script processing, which loads variables and functions from builtin int GetBuiltins(const string& s) { @@ -217,6 +222,8 @@ boost::any CPPFunction(const string& name, const vector& args) return AnyAsInt(args[0]); else if (name == "CPP.Math.Lerp") return lerp(AnyAsFloat(args[0]), AnyAsFloat(args[1]), AnyAsFloat(args[2])); + else if (name == "CPP.Math.Abs") + return abs(AnyAsFloat(args[0])); else if (name == "CPP.Graphics.Init") { InterpreterLog("Init graphics"); diff --git a/Slang/builtin.slg b/Slang/builtin.slg index 3f5284d..8e3baac 100644 --- a/Slang/builtin.slg +++ b/Slang/builtin.slg @@ -52,6 +52,27 @@ func Lerp(a, b, t) return out } +// Get absolute value of x +func Abs(x) +{ + float out = CPP.Math.Abs(x) + return out +} + +// Convert radians to degrees +func RadToDeg(x) +{ + float out = (x * PI) / 180 + return out +} + +// Convert degrees to radians +func DegToRad(x) +{ + float out = (x * 180) / PI + return out +} + // Clamps input between min and max func Clamp(input, min, max) { diff --git a/Slang/graphics.h b/Slang/graphics.h index 1c5c903..ea6a8e6 100644 --- a/Slang/graphics.h +++ b/Slang/graphics.h @@ -349,7 +349,7 @@ class Sprite { public: Sprite(std::string path, Vec2 position, Vec2 scale, double angle) - : position(position), angle(angle), path(path) + : position(position), angle(angle), path(path), scale(scale) { rect.x = static_cast(position.x); rect.y = static_cast(position.y); @@ -369,6 +369,7 @@ public: int Draw() { + rect.x = static_cast(position.x); rect.y = static_cast(position.y); SDL_RenderCopy(gRenderer, texture, NULL, &rect); return 0; @@ -382,24 +383,30 @@ public: 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; } Sprite EditSubComponent(std::string componentName, std::string oper, boost::any otherVal) { if (componentName == "position") { - if(oper == "=") + if (oper == "=") position = any_cast(otherVal); - else if(oper == "+=") + else if (oper == "+=") position += any_cast(otherVal); - else if(oper == "-=") + else if (oper == "-=") position -= any_cast(otherVal); - else if(oper == "*=") + else if (oper == "*=") position *= AnyAsFloat(otherVal); - else if(oper == "/=") + else if (oper == "/=") position /= AnyAsFloat(otherVal); } - if (componentName == "position.x") + else if (componentName == "position.x") { if (oper == "=") position.x = AnyAsFloat(otherVal); @@ -412,7 +419,7 @@ public: else if (oper == "/=") position.x /= AnyAsFloat(otherVal); } - if (componentName == "position.y") + else if (componentName == "position.y") { if (oper == "=") position.y = AnyAsFloat(otherVal); @@ -425,11 +432,53 @@ public: else if (oper == "/=") position.y /= AnyAsFloat(otherVal); } + + else if (componentName == "scale") + { + if (oper == "=") + scale = any_cast(otherVal); + else if (oper == "+=") + scale += any_cast(otherVal); + else if (oper == "-=") + scale -= any_cast(otherVal); + else if (oper == "*=") + scale *= AnyAsFloat(otherVal); + else if (oper == "/=") + scale /= AnyAsFloat(otherVal); + } + else if (componentName == "scale.x") + { + if (oper == "=") + scale.x = AnyAsFloat(otherVal); + else if (oper == "+=") + scale.x += AnyAsFloat(otherVal); + else if (oper == "-=") + scale.x -= AnyAsFloat(otherVal); + else if (oper == "*=") + scale.x *= AnyAsFloat(otherVal); + else if (oper == "/=") + scale.x /= AnyAsFloat(otherVal); + } + else if (componentName == "scale.y") + { + if (oper == "=") + scale.y = AnyAsFloat(otherVal); + else if (oper == "+=") + scale.y += AnyAsFloat(otherVal); + else if (oper == "-=") + scale.y -= AnyAsFloat(otherVal); + else if (oper == "*=") + scale.y *= AnyAsFloat(otherVal); + else if (oper == "/=") + scale.y /= AnyAsFloat(otherVal); + } return *this; } Vec2 position; + Vec2 scale; double angle; + std::string path; SDL_Rect rect{}; SDL_Texture* texture; @@ -732,8 +781,8 @@ int initGraphics(std::string windowTitle, int width, int height) SDL_Init(SDL_INIT_VIDEO); TTF_Init(); - gWindow = SDL_CreateWindow(windowTitle.c_str(), 40, 40, WINDOW_WIDTH, WINDOW_HEIGHT, SDL_WINDOW_SHOWN); - gRenderer = SDL_CreateRenderer(gWindow, -1, 0, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC); + gWindow = SDL_CreateWindow(windowTitle.c_str(), 40, 40, WINDOW_WIDTH, WINDOW_HEIGHT, SDL_WINDOW_SHOWN | SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC); + gRenderer = SDL_CreateRenderer(gWindow, -1, 0); //Get window surface gScreenSurface = SDL_GetWindowSurface(gWindow); diff --git a/Slang/script.slg b/Slang/script.slg index f63ab55..c28b3da 100644 --- a/Slang/script.slg +++ b/Slang/script.slg @@ -4,7 +4,9 @@ int SCREENH = 600 int scoreOne = 0 int scoreTwo = 0 -float paddleMoveSpeed = 200 +float ballSpeed = -3 + +float paddleMoveSpeed = 7 func Main(input, in) { @@ -25,23 +27,29 @@ func Start() Vec2 lPaddlePosition = NVec2(15, yPosPaddle) global Vec2 lPaddleTargetPosition = NVec2(15, yPosPaddle) - float rOffset = SCREENW - 15 + float rOffset = SCREENW - (paddleScale.x + 15) Vec2 rPaddlePosition = NVec2(rOffset, yPosPaddle) - global Vec2 rPaddleTargetPosition = NVec2(15, yPosPaddle) + global Vec2 rPaddleTargetPosition = NVec2(rOffset, yPosPaddle) - global Sprite ballSprite = CPP.Graphics.Sprite("./square.png", ballPosition, ballScale, 0) + global Sprite ballSpr = CPP.Graphics.Sprite("./square.png", ballPosition, 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 Vec2 ballVelocity = NVec2(ballSpeed, 0) } func Update(deltaTime) { - //print deltaTime + float FPS = 1 / deltaTime + print "FPS: " + FPS + + // Handles Left Paddle Movement + // if GetKey("W") == true { float newX = lPaddle.position.x // Subtract from Y to move up, because vertical coordinates are reversed - float newY = lPaddleTargetPosition.y - paddleMoveSpeed * deltaTime + float newY = lPaddleTargetPosition.y - paddleMoveSpeed newY = Clamp(newY, 0, SCREENH - 70) lPaddleTargetPosition = NVec2(newX, newY) } @@ -49,23 +57,86 @@ func Update(deltaTime) { float newX = lPaddle.position.x // Add to Y to move down, because vertical coordinates are reversed - float newY = lPaddleTargetPosition.y + paddleMoveSpeed * deltaTime + float newY = lPaddleTargetPosition.y + paddleMoveSpeed newY = Clamp(newY, 0, SCREENH - 70) lPaddleTargetPosition = NVec2(newX, newY) } // Lerps from old position to destination smoothly float oldY = lPaddle.position.y - float stopSpeed = deltaTime * 15 + float stopSpeed = deltaTime * 6 float newY = lPaddleTargetPosition.y float lerpedY = Lerp(oldY, newY, stopSpeed) - //print "0 < " + newY + " < " + SCREENH lPaddle.position = NVec2(newX, lerpedY) - print "FPS: " + 1 / deltaTime + // Handles Right Paddle Movement + // + if GetKey("UP") == true + { + float newX = rPaddle.position.x + // Subtract from Y to move up, because vertical coordinates are reversed + float newY = rPaddleTargetPosition.y - paddleMoveSpeed + newY = Clamp(newY, 0, SCREENH - 70) + rPaddleTargetPosition = NVec2(newX, newY) + } + if GetKey("DOWN") == true + { + float newX = rPaddle.position.x + // Add to Y to move down, because vertical coordinates are reversed + float newY = rPaddleTargetPosition.y + paddleMoveSpeed + newY = Clamp(newY, 0, SCREENH - 70) + rPaddleTargetPosition = NVec2(newX, newY) + } + // Lerps from old position to destination smoothly + float oldY = rPaddle.position.y + float stopSpeed = deltaTime * 6 + float newY = rPaddleTargetPosition.y + float lerpedY = Lerp(oldY, newY, stopSpeed) + rPaddle.position = NVec2(newX, lerpedY) + ballSpr.position += ballVelocity + + HandleBallBounce() // Finally draws all of the sprites - CPP.Graphics.Draw(ballSprite) + CPP.Graphics.Draw(ballSpr) CPP.Graphics.Draw(lPaddle) CPP.Graphics.Draw(rPaddle) } + +func HandleBallBounce() +{ + float ballX = ballSpr.position.x + float ballY = ballSpr.position.y + // Checks if the ball is on the same X coordinate as the left paddle + if ballX <= lPaddle.position.x + { + // Then check if ball is lower than the top edge + float positionAdjustedOffset = lPaddle.position.y + positionAdjustedOffset += lPaddle.scale.y + if ballY <= positionAdjustedOffset + { + // Finally check if ball is higher than the bottom edge + positionAdjustedOffset = lPaddle.position.y + positionAdjustedOffset -= lPaddle.scale.y + print positionAdjustedOffset + if ballY >= positionAdjustedOffset + { + float difference = lPaddle.position.y + difference -= ballY + + // float normalizedRelativeIntersectionY = (difference/(lPaddle.scale.y/2)) + // float bounceAngle = normalizedRelativeIntersectionY * 1.3089 + + // float ballVx = ballSpeed*Cos(bounceAngle) + // float ballVy = ballSpeed*-Sin(bounceAngle) + + // // Reflect horizontally + // if difference < 10 + // { + // float newX = Sin(DegToRad()) + // ballVelocity + // } + } + } + } +} \ No newline at end of file diff --git a/Slang/strops.cpp b/Slang/strops.cpp index 3cc700d..5735166 100644 --- a/Slang/strops.cpp +++ b/Slang/strops.cpp @@ -205,6 +205,26 @@ vector removeTabs(const vector& str, const int& amnt) { return newStr; } +vector> removeTabsWdArry(const vector>& str, const int& amnt) { + vector> newWds; + + for (int i = 0; i < (int)str.size(); i++) + { + //newWds.push_back(rangeInVec(str[i], amnt, -1)); + newWds.push_back(vector()); + + for (int c = 0; c < (int)str[i].size(); c++) + { + if (str[i][c][0] != '\t' || c >= amnt) + newWds[i].push_back(str[i][c]); + else + newWds[i].push_back(str[i][c].substr(1, -1)); + } + } + + return newWds; +} + vector rangeInVec(const vector& str, const int& min, int max) { if (max == -1) max = (int)str.size(); diff --git a/Slang/strops.h b/Slang/strops.h index ca924af..abf0353 100644 --- a/Slang/strops.h +++ b/Slang/strops.h @@ -39,9 +39,11 @@ int countInVector(const vector& str, const string& ch); string Vec2Str(const vector& str); +vector> removeTabsWdArry(const vector>& str, const int& amnt); + vector removeTabs(const vector& str, const int& amnt); -vector rangeInVec(const vector& str, const int& min, const int& max); +vector rangeInVec(const vector& str, const int& min, int max); vector slice(vector const& v, int min, int max);