Note that there are some explanatory texts on larger screens.

plurals
  1. POXna Pixel Collision and multi-layers. Early Collision, wrong detection?
    primarykey
    data
    text
    <p>we are currently working on a Xna game for college. We are testing something first before we put in our own textures etc.</p> <p>So we watch a lot tutorials and went through a lot of code. Right now we have this little Program running: <a href="http://www.konter.at/Konter_Game.rar" rel="nofollow">http://www.konter.at/Konter_Game.rar</a></p> <p>So this the GameScreen, where we load the player and the Background and everything we want to use.</p> <pre><code>namespace Casual_Game { public class GameplayScreen : GameScreen { Player player; Camera camera; SpriteFont font; private List&lt;Layer&gt; layers; private SpriteBatch _spriteBatch; Rectangle recPlayer, recGround; bool colis = false; Collision collision; public override void LoadContent(ContentManager content, InputManager input) { camera = new Camera(Game1.reference.GraphicsDevice.Viewport) { Limits = new Rectangle(0, 0, 4800, 720) }; collision = new Collision(); _spriteBatch = new SpriteBatch(Game1.reference.GraphicsDevice); base.LoadContent(content, input); player = new Player(); player.LoadContent(content, input); font = content.Load&lt;SpriteFont&gt;("Font1"); layers = new List&lt;Layer&gt; { new Layer(camera) { Parallax = new Vector2(0.0f, 1.0f) }, new Layer(camera) { Parallax = new Vector2(0.1f, 1.0f) }, new Layer(camera) { Parallax = new Vector2(0.2f, 1.0f) }, new Layer(camera) { Parallax = new Vector2(0.3f, 1.0f) }, new Layer(camera) { Parallax = new Vector2(0.4f, 1.0f) }, new Layer(camera) { Parallax = new Vector2(0.5f, 1.0f) }, new Layer(camera) { Parallax = new Vector2(0.6f, 1.0f) }, new Layer(camera) { Parallax = new Vector2(0.8f, 1.0f) }, new Layer(camera) { Parallax = new Vector2(1.0f, 1.0f) } }; // Add one sprite to each layer }); layers[1].Sprites.Add(new Sprite { texture = content.Load&lt;Texture2D&gt;("Textures/Layer2") }); layers[2].Sprites.Add(new Sprite { texture = content.Load&lt;Texture2D&gt;("Textures/Layer3") }); layers[3].Sprites.Add(new Sprite { texture = content.Load&lt;Texture2D&gt;("Textures/Layer4") }); layers[4].Sprites.Add(new Sprite { texture = content.Load&lt;Texture2D&gt;("Textures/Layer5") }); layers[7].Sprites.Add(new Sprite { texture = content.Load&lt;Texture2D&gt;("Textures/Layer8") }); layers[8].Sprites.Add(new Sprite { texture = content.Load&lt;Texture2D&gt;("Textures/Layer9") }); // Add a few duplicates in different positions layers[7].Sprites.Add(new Sprite { texture = content.Load&lt;Texture2D&gt;("Textures/Layer8"), position = new Vector2(900, 0) }); layers[7].Sprites.Add(new Sprite { texture = content.Load&lt;Texture2D&gt;("Textures/Layer8"), position = new Vector2(1400, 0) }); layers[7].Sprites.Add(new Sprite { texture = content.Load&lt;Texture2D&gt;("Textures/Layer8"), position = new Vector2(2700, 0) }); layers[8].Sprites.Add(new Sprite { texture = content.Load&lt;Texture2D&gt;("Textures/Layer9"), position = new Vector2(1600, 0) }); layers[8].Sprites.Add(new Sprite { texture = content.Load&lt;Texture2D&gt;("Textures/Layer9"), position = new Vector2(3200, 0) }); layers[8].Sprites.Add(new Sprite { texture = content.Load&lt;Texture2D&gt;("Textures/Layer9"), position = new Vector2(4800, 0) }); } public override void UnloadContent() { base.UnloadContent(); } public override void Update(GameTime gameTime) { player.Update(gameTime); recGround = new Rectangle((int)layers[8].Sprites[0].Position.X, (int)layers[8].Sprites[0].Position.Y, layers[8].Sprites[0].Texture.Width, layers[8].Sprites[0].Texture.Height); recPlayer = new Rectangle((int)player.Position.X, (int)player.Position.Y, player.Image.Width, player.Image.Height); float elapsedTime = (float)gameTime.ElapsedGameTime.TotalSeconds; KeyboardState keyboardState = Keyboard.GetState(); if (keyboardState.IsKeyDown(Keys.Right)) camera.Move(new Vector2(200.0f * (float)gameTime.ElapsedGameTime.TotalSeconds, 0.0f), true); if (keyboardState.IsKeyDown(Keys.Left)) camera.Move(new Vector2(-200.0f * (float)gameTime.ElapsedGameTime.TotalSeconds, 0.0f), true); if (keyboardState.IsKeyDown(Keys.Down)) camera.Move(new Vector2(0.0f, 400.0f * elapsedTime), true); if (keyboardState.IsKeyDown(Keys.Up)) camera.Move(new Vector2(0.0f, -400.0f * elapsedTime), true); if (recPlayer.Intersects(recGround)) { if (collision.PixelCollision(player.Image, layers[8].Sprites[0].Texture, recPlayer, recGround)) { player.Collision = true; colis = true; } else { player.Collision = false; colis = false; } } else { player.Collision = false; colis = false; } camera.LookAt(player.Position); base.Update(gameTime); } public override void Draw(SpriteBatch spriteBatch) { Vector2 parallax = new Vector2(1.0f); _spriteBatch.Begin(SpriteSortMode.Deferred,null , null, null, null, null, camera.GetViewMatrix(parallax)); foreach (Layer layer in layers) layer.Draw(_spriteBatch); player.Draw(_spriteBatch); spriteBatch.DrawString(font, "Player X : " + player.Position.X.ToString(),new Vector2(10, 10), Color.Black); spriteBatch.DrawString(font, "CameraX :" + camera._position.X.ToString(), new Vector2(10, 25), Color.Black); spriteBatch.DrawString(font, "CameraY :" + camera._position.Y.ToString(), new Vector2(10, 40), Color.Black); spriteBatch.DrawString(font, "Col : " + colis.ToString(), new Vector2(10, 55), Color.Black); _spriteBatch.End(); } } </code></pre> <p>You see it is a Parallax Background with different Layers. On Layer[8] is the "Ground" where our player would run on later.</p> <p>The Problem now is that the Collision Detection is not working correctly. It looks like the detection is loading to slow or something.</p> <p>We have in mind, that the player will hit the ground with the detection. So he has no value where he stops on the ground. So it has to be exate.</p> <p>This is the Collision Class:</p> <pre><code> public bool PixelCollision(Texture2D sprite1, Texture2D sprite2, Rectangle player, Rectangle enemy) { Color[] colorData1 = new Color[sprite1.Width * sprite1.Height]; Color[] colorData2 = new Color[sprite2.Width * sprite2.Height]; sprite1.GetData&lt;Color&gt;(colorData1); sprite2.GetData&lt;Color&gt;(colorData2); int top, bottom, left, right; top = Math.Max(player.Top, enemy.Top); bottom = Math.Min(player.Bottom, enemy.Bottom); left = Math.Max(player.Left, enemy.Left); right = Math.Min(player.Right, enemy.Right); for (int y = top; y &lt; bottom; y++) { for (int x = left; x &lt; right; x++) { Color A = colorData1[(y - player.Top) * (player.Width) + (x - player.Left)]; Color B = colorData2[(y - enemy.Top) * (enemy.Width) + (x - enemy.Left)]; if (A.A != 0 &amp;&amp; B.A != 0) return true; } } return false; } } </code></pre> <p>We would be very happy if someone could help us figure that out. We are not that much of programmers. So we thought asking doesnt cost anything. :)</p> <p>K.</p> <p>Edit: Player.Update and Draw:</p> <pre><code>public override void Update(GameTime gameTime) { moveAnimation.IsActive = true; inputManager.Update(); if (inputManager.KeyDown(Keys.Right, Keys.A)) { moveAnimation.currentFrame = new Vector2(moveAnimation.CurrentFrame.X, 2); velocity.X = moveSpeed * (float)gameTime.ElapsedGameTime.TotalSeconds; } else if (inputManager.KeyDown(Keys.Left, Keys.A)) { moveAnimation.currentFrame = new Vector2(moveAnimation.CurrentFrame.X, 1); velocity.X = -moveSpeed * (float)gameTime.ElapsedGameTime.TotalSeconds; } else { velocity.X = 0; moveAnimation.IsActive = false; } if (inputManager.KeyDown(Keys.Up, Keys.W) &amp;&amp; jump) { velocity.Y = -jumpSpeed * (float)gameTime.ElapsedGameTime.TotalSeconds; //Position += theDirection * theSpeed * (float)theGameTime.ElapsedGameTime.TotalSeconds; jump = false; } if (!jump) velocity.Y += gravity * (float)gameTime.ElapsedGameTime.TotalSeconds; else velocity.Y = 0; moveAnimation.Position = position += velocity; jump = moveAnimation.Position.Y &gt;= 480; if (jump) position.Y = 480; base.Update(gameTime); moveAnimation.Update(gameTime); } public override void Draw(SpriteBatch spriteBatch) { moveAnimation.Draw(spriteBatch); } </code></pre> <p>Layer.Draw:</p> <pre><code>public class Layer { SpriteBatch spr1teBatch; public Layer(Camera camera) { _camera = camera; Parallax = Vector2.One; Sprites = new List&lt;Sprite&gt;(); spr1teBatch = new SpriteBatch(Game1.reference.GraphicsDevice ); } public Vector2 Parallax { get; set; } public List&lt;Sprite&gt; Sprites { get; private set; } public void Draw(SpriteBatch spriteBatch) { spr1teBatch.Begin(SpriteSortMode.Deferred, null, null, null, null, null, _camera.GetViewMatrix(Parallax)); foreach(Sprite sprite in Sprites) sprite.Draw(spr1teBatch); spr1teBatch.End(); } public Vector2 WorldToScreen(Vector2 worldPosition) { return Vector2.Transform(worldPosition, _camera.GetViewMatrix(Parallax)); } public Vector2 ScreenToWorld(Vector2 screenPosition) { return Vector2.Transform(screenPosition, Matrix.Invert(_camera.GetViewMatrix(Parallax))); } private readonly Camera _camera; } </code></pre>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload