Jump to content
  • Advertisement

FrozenSnake

Member
  • Content count

    34
  • Joined

  • Last visited

Community Reputation

222 Neutral

About FrozenSnake

  • Rank
    Member
  1. FrozenSnake

    Operator overloading +=, -=, *=

    I have made these two, guess I need a MyVector version of the second one public static MyVector operator*(MyVector a, MyVector b) { return (new MyVector(a.mX * b.mX, a.mY * b.mY, a.mZ * b.mZ)); } public static float operator*(MyVector a, float b) { return (a.mX * b + a.mY * b + a.mZ * b); } // Edit public static MyVector operator *(MyVector a, float b)        { return (new MyVector(a.mX * b, a.mY * b, a.mZ * b)); } // Edit     *Edit* now that Calc works too. Hopefully all the operators will work from now on If you see anything I do that should be done a different way feel free to point it out.
  2. FrozenSnake

    Operator overloading +=, -=, *=

    I do stuff like this in the C++ version: void Body::AddForce(const MyVector& x) { mForce += x; } void Body::SetVelocity(const sf::Vector2f& vec) { mPrevPos = mPos - vec * mFrames; } void Body::Update() { if (mID == 0) mForce.SetZ(0); if (mCanMove) { mForce.SetZ(0); mBodyShape.setPosition(mPos); MyVector tempPos1(mPos); MyVector tempPos2(mPrevPos); MyVector calc = (tempPos1 * 2.0f - tempPos2 + mForce * mInvertedMass * (mFrames * mFrames)); mPrevPos = mPos; mPos.x = calc.GetX(); mPos.y = calc.GetY(); } mWindow.draw(mBodyShape); DrawTrace(); ClearForce(); } At the moment I can't get this code MyVector calc = (tempPos1 * 2.0f - tempPos2 + mForce * mInvertedMass * (mFrames * mFrames)); To work in the C# version the "tempPos1 * 2.0f - tempPos2" part gives me This will probably complain about something else in this line if I fix the first problem. But this is quite confusing.   The operator overloading code looks like this: public static MyVector operator-(MyVector a, MyVector b) { a.mX -= b.mX; a.mY -= b.mY; a.mZ -= b.mZ; return a; } public static float operator -(MyVector a, float b) { return (a.mX - b + a.mY - b + a.mZ - b); } I am doing a solar system simulation and it works like a charm in C++ and I am trying to translate it to C# and mainly the operators are acting up :/   *EDIT* Currently rewriting the operators to this format: public static MyVector operator x(MyVector a, MyVector b) { return (new MyVector(a.mX x b.mX, a.mY x b.mY, a.mZ x b.mZ)); }
  3. FrozenSnake

    Operator overloading +=, -=, *=

    No, your example will: - Create a new vector (likely with mX=0,mY=0,mZ=0). - Add vec to the new vector. - Won't return a value, so all the work it's doing will be lost. In C#, all overloaded operators have to be static and have to return a value (they never modify a "this" object like you might do in C++).   I have done this now         public static MyVector operator+(MyVector a, MyVector b)         {             a.mX += b.mX;             a.mY += b.mY;             a.mZ += b.mZ;             return a;         } Hopefully that works better :)
  4. FrozenSnake

    Operator overloading +=, -=, *=

    This makes me a bit confused:  public static void operator+(MyVector vec)         {             MyVector mv = new MyVector();             mv.mX += vec.mX;             mv.mY += vec.mY;             mv.mZ += vec.mZ;         } Will it keep the value from mForce in this example. So I actually add 'x' to w/e value mForce already have or will the "new MyVector()" mess things up? mForce = mForce + x; *EDIT BELOW* Thanks for clarifying! Will my example above work as it should or should I alter that as well?
  5. FrozenSnake

    Operator overloading +=, -=, *=

    I'll take a look and see if I can figure it out.   That is because C# silently converts the code: x += y; into the code: x = x + y; Part of that is to help avoid the beginner's c++ bug of forgetting to implement all the corresponding operators, or the more nuanced bug of having slightly different behavior between the two operators. You just implement your addition operator, subtraction operator, and the rest. The +=, -=, *=, /=, %=, &=, |=, ^=, and other "op plus assign" operators will use your overloaded operation.   So I should do something like the code below to get the same behavior? I haven't been poking around in C# before so a lot of this is new to me. public static MyVector operator +(MyVector vec) { MyVector mv = new MyVector(); return (new MyVector(mv.mX + vec.mX, mv.mY + vec.mY, mv.mZ + vec.mZ)); } // This doesn't work, Type 'SFMLapp.MyVector' already defines a member called 'op_UnaryPlus' with the same parameter types public static void operator+(MyVector vec) // += in the c++ code { MyVector mv = new MyVector(); mv.mX += vec.mX; mv.mY += vec.mY; mv.mZ += vec.mZ; }
  6. I read on the MSDN that overloading += doesn't work so I should use + instead. But my problem is I already have it overloaded. I am trying to convert some of my c++ code to c# to make the same program in C#.   Here is my C++ code MyVector operator+(const MyVector& vec) { return MyVector(mX + vec.mX, mY + vec.mY, mZ + vec.mZ); }   void operator += (const MyVector& vec) { mX += vec.mX; mY += vec.mY; mZ += vec.mZ; }   MyVector operator-(const MyVector& vec) { return MyVector(mX - vec.mX, mY - vec.mY, mZ - vec.mZ); }   MyVector operator-() {   return MyVector(-mX, -mY, -mY); }   void operator -=(const MyVector& vec) { mX -= vec.mX; mY -= vec.mY; mZ -= vec.mZ; }   float operator*(const MyVector& vec) { return (mX * vec.mX + mY * vec.mY + mZ * vec.mZ); }   MyVector operator*(const float& f) { return MyVector(mX * f, mY * f, mZ * f); }   void operator*=(const float& f) { mX *= f; mY *= f; mZ *= f; } As you can see I do different stuff on the + and += for example. Is there any good way to get this to work in C#?  
  7. FrozenSnake

    Hierarchical finite state machine

      You are doing this as an assignment, right? Your class has no text about it?   The text we have about the hierarchical is:   After this he talks about a global state, which according to him didn't meet the criteria because all states are substates to the global one. So I decided to place Two other states inside AgentIsTierd but I do not know is I did the thing he asks for or something else entirely.   So we have 4 lines of text, but it doesn't really show anything that is helpful for me to understand how to implement this. This is why I looked elsewhere to find some more information but I am still unsure about if it meet the criteria, and I would prefer to get some more information about HFSM and how it can be implemented.
  8. FrozenSnake

    Hierarchical finite state machine

    Thanks for the reply ApochPiQ, do you know any good articles I can read to some more understanding? The article I checked out was this. I had a hard time finding any text about this topic.
  9. Hello! I am currently working on a FSM for a project at my university. But I have problem with figuring out if I meet the criteria for this program. I need to have a state that have sub-states (Hierarchical states). This code is about an AI I know, but the topic itself I feel is more related to general programming.   For example Combat leads to Shooting OR TakingCover. And no other state except for Combat should be able to reach these two states directly they need to go through Combat. This is how I have interpreted Hierarchical Finite State Machine anyway, so I would really like to have some feedback on this. It is not the most pretty piece of code out there so I apologize in advance. I also made a bitbucket repository if someone feel they need to dig deeper to help me, I do not wanna bloat this post with all the code. This is the code I think is the most important one and I only included the rest for people that feel they wanna study the code more.   TLDR; Is the code below hierarchical or have I misinterpreted something?   Here is my PonyStates.h file #include "State.h" class Pony; class AgentIsHungry : public State { public: static AgentIsHungry* Instance (); virtual void EnterState (Pony* p); virtual void ExitState (Pony* p); virtual void ExecuteState (Pony* p); private: // Copy construtor and assignment. AgentIsHungry() {} AgentIsHungry (const AgentIsHungry&); AgentIsHungry& operator= (const AgentIsHungry&); }; class AgentIsWorking : public State { public: static AgentIsWorking* Instance(); virtual void EnterState(Pony* p); virtual void ExitState(Pony* p); virtual void ExecuteState(Pony* p); private: AgentIsWorking() { } // Copy construtor and assignment. AgentIsWorking(const AgentIsWorking&); AgentIsWorking& operator= (const AgentIsWorking&); }; class AgentIsTierd : public State { public: static AgentIsTierd* Instance (); virtual void EnterState (Pony* p); virtual void ExitState (Pony* p); virtual void ExecuteState(Pony* p); AgentIsTierd() { } private: // Copy construtor and assignment. AgentIsTierd(const AgentIsTierd&); AgentIsTierd& operator= (const AgentIsTierd&); }; ////////////////////////////////////////////////////////////////////////////////////////////////////////// class AgentIsHavingANightmare : public AgentIsTierd { public: static AgentIsHavingANightmare* Instance(); virtual void EnterState(Pony* p); virtual void ExitState(Pony* p); virtual void ExecuteState(Pony* p); private: // Copy construtor and assignment. AgentIsHavingANightmare() {} AgentIsHavingANightmare(const AgentIsHavingANightmare&); AgentIsHavingANightmare& operator= (const AgentIsHavingANightmare&); }; class AgentIsHavingADream : public AgentIsTierd { public: static AgentIsHavingADream* Instance(); virtual void EnterState(Pony* p); virtual void ExitState(Pony* p); virtual void ExecuteState(Pony* p); private: // Copy construtor and assignment. AgentIsHavingADream() {} AgentIsHavingADream(const AgentIsHavingADream&); AgentIsHavingADream& operator= (const AgentIsHavingADream&); }; ////////////////////////////////////////////////////////////////////////////////////////////////////////// Here is my PonyStates.cpp file //////////////////////////////// ///////// AgentIsTierd ///////// //////////////////////////////// AgentIsTierd* AgentIsTierd::Instance() { static AgentIsTierd instance; return &instance; } void AgentIsTierd::EnterState(Pony* p) { if (p->WhereAmI() != Bedroom) { std::cout << GetName(p->GetID()) << " is walking to the bedroom; it is time to sleep.\n"; p->ChangeRoom(Bedroom); } } void AgentIsTierd::ExitState(Pony* p) { std::cout << GetName(p->GetID()) << " is now leaving the bedroom.\n"; } void AgentIsTierd::ExecuteState(Pony *p) { if (p->IsTierd()) { std::cout << GetName(p->GetID()) << " wishes to sleep. " << GetName(p->GetID()) << " lay down in bed to sleep! Zzz...\n"; if ((rand() % 100) % 2) p->ChangeState(AgentIsHavingADream::Instance()); else p->ChangeState(AgentIsHavingANightmare::Instance()); } else { std::cout << GetName(p->GetID()) << " wakes up refreshed! Time to go to work!\n"; p->ChangeState(AgentIsWorking::Instance()); } } ////////////////////////////////////////////////////////////////////////////////////////////////////////// // Good dream AgentIsHavingADream* AgentIsHavingADream::Instance() { static AgentIsHavingADream instance; return &instance; } void AgentIsHavingADream::EnterState(Pony* p) { // Already in bedrom. } void AgentIsHavingADream::ExitState(Pony* p) { std::cout << "\t" << GetName(p->GetID()) << " had a nice dream and is feeling refreshed.\n"; //p->ChangeState(AgentIsHungry::Instance()); } void AgentIsHavingADream::ExecuteState(Pony* p) { p->Sleep(); p->ChangeState(AgentIsHungry::Instance()); } // Nightmare AgentIsHavingANightmare* AgentIsHavingANightmare::Instance() { static AgentIsHavingANightmare instance; return &instance; } void AgentIsHavingANightmare::EnterState(Pony* p) { // Already in bedrom. } void AgentIsHavingANightmare::ExitState(Pony* p) { std::cout << "\t" << GetName(p->GetID()) << " had a nightmare and didn't sleep very well.\n"; } void AgentIsHavingANightmare::ExecuteState(Pony* p) { p->BadSleep(); p->ChangeState(AgentIsHungry::Instance()); }
  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

We are the game development community.

Whether you are an indie, hobbyist, AAA developer, or just trying to learn, GameDev.net is the place for you to learn, share, and connect with the games industry. Learn more About Us or sign up!

Sign me up!