• Announcements

    • khawk

      Download the Game Design and Indie Game Marketing Freebook   07/19/17

      GameDev.net and CRC Press have teamed up to bring a free ebook of content curated from top titles published by CRC Press. The freebook, Practices of Game Design & Indie Game Marketing, includes chapters from The Art of Game Design: A Book of Lenses, A Practical Guide to Indie Game Marketing, and An Architectural Approach to Level Design. The GameDev.net FreeBook is relevant to game designers, developers, and those interested in learning more about the challenges in game development. We know game development can be a tough discipline and business, so we picked several chapters from CRC Press titles that we thought would be of interest to you, the GameDev.net audience, in your journey to design, develop, and market your next game. The free ebook is available through CRC Press by clicking here. The Curated Books The Art of Game Design: A Book of Lenses, Second Edition, by Jesse Schell Presents 100+ sets of questions, or different lenses, for viewing a game’s design, encompassing diverse fields such as psychology, architecture, music, film, software engineering, theme park design, mathematics, anthropology, and more. Written by one of the world's top game designers, this book describes the deepest and most fundamental principles of game design, demonstrating how tactics used in board, card, and athletic games also work in video games. It provides practical instruction on creating world-class games that will be played again and again. View it here. A Practical Guide to Indie Game Marketing, by Joel Dreskin Marketing is an essential but too frequently overlooked or minimized component of the release plan for indie games. A Practical Guide to Indie Game Marketing provides you with the tools needed to build visibility and sell your indie games. With special focus on those developers with small budgets and limited staff and resources, this book is packed with tangible recommendations and techniques that you can put to use immediately. As a seasoned professional of the indie game arena, author Joel Dreskin gives you insight into practical, real-world experiences of marketing numerous successful games and also provides stories of the failures. View it here. An Architectural Approach to Level Design This is one of the first books to integrate architectural and spatial design theory with the field of level design. The book presents architectural techniques and theories for level designers to use in their own work. It connects architecture and level design in different ways that address the practical elements of how designers construct space and the experiential elements of how and why humans interact with this space. Throughout the text, readers learn skills for spatial layout, evoking emotion through gamespaces, and creating better levels through architectural theory. View it here. Learn more and download the ebook by clicking here. Did you know? GameDev.net and CRC Press also recently teamed up to bring GDNet+ Members up to a 20% discount on all CRC Press books. Learn more about this and other benefits here.

mwkenna

Members
  • Content count

    40
  • Joined

  • Last visited

Community Reputation

143 Neutral

About mwkenna

  • Rank
    Member
  1. 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. 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. 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. 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. 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. 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. 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. 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. 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.