mwkenna

Members
  • Content count

    40
  • Joined

  • Last visited

Community Reputation

143 Neutral

About mwkenna

  • Rank
    Member
  1. Collision Response

    I have implemented sliding collision response. Using a recursive collision response I am seeing some strange behavior and I believe it's because I am moving the player to the point of contact and then sliding them along the edge.   Question: I have seen a-lot of tutorials that say to move "very close to point of contact". Moving exactly to the point of contact before calculating the slide vector means that t=0 collisions are being registered and causing unnecessary recursion. Could someone provide some pseudocode to detail the correct process for recursive correction?     Thanks, Mark.
  2. This works well, the only problem I am having is dealing with multiple collisions on edges. Seems that some extra collision sorting is in order.   Would it be the case that you have to create a list of collisions for each step and resolve them in order?
  3. Basic Swept SAT Collision Response

    Thanks for that... but in my post I did mention that I don't want to implement rigid body dynamics. All I am trying to achieve is the simplest collision response where a polygon cannot penetrate other polygons.   Thanks, Mark.
  4. All   I am trying to understand swept sat following the Olli's tutorials. I have implemented the collision detection and understand all that code very well. What I am not sure on is how to handle the response. From his tutorials I can see that he implements "Basic arcade collision response" but I do not want to implement rigid body dynamics yet.   I have tried to modify the example code to remove all but the simplest collision resolution where we modify the players position based on MTD or time of impact but I'm getting some strange results.   Does anyone have a tutorial on how to correctly handle the response for t<0, t==0 and t>0 ?   Would really appreciate any help!   Thanks, Mark.
  5. 2D Multiple Collision Response SAT

    After debugging the code further I believe the problem is now a case of how to deal with "touching" collisions.   What's happening is that when I detect a future collision and update the players position to "hug" the colliding object, the collision code is continuously detecting the "touching state" and not applying the position offset.   I have attached my code: protected override void Update(GameTime gameTime) { // Allows the game to exit if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed) this.Exit(); //player position update float amount = 10; Vector2 offset = Vector2.Zero; KeyboardState state = Keyboard.GetState(); if (state.IsKeyDown(Keys.Up)) offset += new Vector2(0, -amount); if (state.IsKeyDown(Keys.Down)) offset += new Vector2(0, amount); if (state.IsKeyDown(Keys.Left)) offset += new Vector2(-amount, 0); if (state.IsKeyDown(Keys.Right)) offset += new Vector2(amount, 0); foreach (Polygon p in polygons) { float t = 1.0f; Vector2 N = Vector2.Zero; Vector2 relPos = redPoly.Position - p.Position; Vector2 relDisplacement = offset; if (Collide(redPoly, p, relPos, relDisplacement, ref N, ref t)) { if (t < 0) { //process teh current overlap redPoly.Position -= N * t; offset = Vector2.Zero; } else { if (t == 0) { //the objects are just touching } else { //process an overlap forward in time redPoly.Position += offset * t; offset = Vector2.Zero; } } } } redPoly.Position += offset; base.Update(gameTime); }
  6. 2D Multiple Collision Response SAT

    I am trying to accomplish the "Basic Arcade Collision Response" from the PolyColly tutorial, but without the physics. All I want is for it to be basic but correct). This is what I have modified the code to but I'm not getting the functionality that I would expect, the player is sticking to the polygons and sometimes penetrating the surface.   Again.. trying to keep it simple just using the arrow keys to modify the offset of the player (redPoly). protected override void Update(GameTime gameTime) { // Allows the game to exit if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed) this.Exit(); //player position update float amount = 40; Vector2 offset = Vector2.Zero; KeyboardState state = Keyboard.GetState(); if (state.IsKeyDown(Keys.Up)) offset += new Vector2(0, -amount); if (state.IsKeyDown(Keys.Down)) offset += new Vector2(0, amount); if (state.IsKeyDown(Keys.Left)) offset += new Vector2(-amount, 0); if (state.IsKeyDown(Keys.Right)) offset += new Vector2(amount, 0); //get the list of collisions List<CollisionResult> collisions = new List<CollisionResult>(); foreach (Polygon p in polygons) { float t = 1.0f; Vector2 N = Vector2.Zero; Vector2 relPos = redPoly.Position - p.Position; Vector2 relDisplacement = offset; if (Collide(redPoly, p, relPos, relDisplacement, ref N, ref t)) { if (t < 0) { ProcessOverlap(ref redPoly, N, t); } else { ProcessCollision(ref redPoly, N, t, ref offset); } } } redPoly.Position += offset; base.Update(gameTime); } Does this look correct to you guys?   Thanks, Mark.
  7. 2D Multiple Collision Response SAT

    Here is the collision code that I am using. Note that I am currently trying to understand it so I'm not worried about that fact that it's not very efficient yet. Also note that it's the current collisions which are not working correctly.   Thanks, Mark. protected override void Update(GameTime gameTime) { // Allows the game to exit if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed) this.Exit(); //player position update float amount = 50; Vector2 offset = Vector2.Zero; KeyboardState state = Keyboard.GetState(); if (state.IsKeyDown(Keys.Up)) offset += new Vector2(0, -amount); if (state.IsKeyDown(Keys.Down)) offset += new Vector2(0, amount); if (state.IsKeyDown(Keys.Left)) offset += new Vector2(-amount, 0); if (state.IsKeyDown(Keys.Right)) offset += new Vector2(amount, 0); redPoly.Position += offset; //player velocity update Vector2 displacement = new Vector2(0, 0); MouseState mouseState = Mouse.GetState(); Vector2 mousePos = Vector2.Zero; if (mouseState.LeftButton == ButtonState.Pressed) { mousePos = new Vector2(mouseState.X - (boxWidth / 2), mouseState.Y - (boxHeight / 2)); redPoly.Displacement = mousePos - redPoly.Position; } //get the list of collisions List<CollisionResult> collisions = new List<CollisionResult>(); foreach (Polygon p in polygons) { var collision = Collide(redPoly, p, redPoly.Position - p.Position, redPoly.Displacement - p.Displacement); if (collision != null) { collisions.Add(collision); } } var futureTimes = (from a in collisions where a.CollisionType == CollisionResultType.Future select a.T).ToList(); if (futureTimes.Count > 0) { futureTimes.Sort(); collPos = redPoly.Position + redPoly.Displacement * futureTimes.First(); } else { if (mouseState.LeftButton == ButtonState.Pressed) collPos = mousePos; } Vector2 mtd = Vector2.Zero; var currentCollisions = (from a in collisions where a.CollisionType == CollisionResultType.Current select a).ToList(); if (currentCollisions.Count > 0) { collPos = Vector2.Zero; //find the largest MTD required to push the player out foreach (var currentCol in currentCollisions) { Vector2 a = currentCol.CollisionNormal * currentCol.T; if (Math.Abs(a.X) > Math.Abs(mtd.X)) mtd.X = a.X; if (Math.Abs(a.Y) > Math.Abs(mtd.Y)) mtd.Y = a.Y; } } if (mtd != Vector2.Zero) redPoly.Position -= mtd; base.Update(gameTime); }
  8. Hi All   I'm learning GameDev by developing a tile-based game.   I've implemented swept SAT using the great PolyColly tutorials. My "future-collision" response code is working very well but the "current-collision" response code is having trouble when resolving multiple collisions (like on an inside edge). Note that I am disregarding edges that are marked as "empty" as suggested by the great MetaNet tutorials.    I've included 2 screenshots of the problem. I can provide code on request.   I would really like to understand what is happening here.   Thanks, Mark.
  9. Could a moderator please close this post, I realise that there is a better forum suited to this.
  10. Hi All   I am trying to follow the Metanet tutorial which shows a great method of disregarding the "inside edges" of a bunch of tiles so as to eliminate unwanted collisions.   Please forgive me, but,.. What is the best method for determining the edge that we are colliding with? Currently I am using the MTD to reverse-lookup the edge we are projecting out of but that seems wrong and likely to break under certain circumstances.    If anyone has a better solution I would love to hear it.   Thanks, Mark.
  11. Hi All   I am having a strange issue with a custom content processor for processing map levels.   I have the following code which imports a PNG image. When I use the serialized data in the spriteBatch.Draw(..) call, the renderer does not see magenta as transparent and the magenta color is left on the screen: var extRef = new ExternalReference<Texture2DContent>(path); var texture = context.BuildAsset<Texture2DContent, Texture2DContent>(extRef, null, data, null, asset); If I modify the code to use a TextureContent type along with the required importer and processor types, along with some casting on the game-code-side the transparency is fine and there is no magenta shown: var extRef = new ExternalReference<TextureContent>(path); var texture = context.BuildAsset<TextureContent, TextureContent>(extRef, "TextureProcessor", data, "TextureImporter", asset); Could someone please shed some light on what is going on here?   Thanks, Mark.    
  12. 2D Camera Transformation

    Hi Aimee   Thanks for the advice, I am actually trying to slow it down a notch. I'm working through a book which only deals with the SpriteBatch (for 2D) - I am on transformations and how to model a simple camera, but the rotation/translation in the camera seemed wrong to me (non-axis aligned) so I thought I would post to see if there was a way to "fix" it.   Thanks for all your replies.   Mark.
  13. 2D Camera Transformation

    Hi Aimee   I've been looking over your code (which is really well put together) but it's made me try to jump too far forward in my learning process.   Is it possible to alter the code so that it still uses the SpriteBatch which, as I understand it, does not require the use of a projection matrix at all?   Thanks, Mark.
  14. 2D Camera Transformation

    Thanks Aimee - the solution seems to do what, I will be taking apart the code in detail and learning what each part does.   Morphex - Do you think you could also post that sample code with the trigonometric positioning - I'm guessing that's still using the spritebatch right?   Thanks, Mark.
  15. 2D Camera Transformation

    Exactly, I have tried applying the rotation before the transform but it will always rotate around (0,0). I want to always rotate around the current screen center (camera.position.x + viewport.width * 0.5, camera.position.y + viewport.height * 0.5) if that makes any sense? So the camera movement will go according to screen axis, the rotation will always happen at the current camera focus (center of the screen). Thanks, Mark.