• Content count

  • Joined

  • Last visited

Community Reputation

111 Neutral

About sultanofswing.90

  • Rank
  1. Hello, I'm developing a collision system for my little isometric engine. I have a PlayerEntity Class with a property [source lang="csharp"]/// <summary> /// Get or set the position of this entity /// </summary> public Vector2 Location { get { return _location; } set { _location = value; Rectangle = new Rectangle( (int)value.X, (int)value.Y, Rectangle.Width, Rectangle.Height ); if( Fixture != null ) Fixture.Location = value; } } private Vector2 _location;[/source] The rectangle field doesn't need any explanation. Well, what is a fixture? the Fixture is a Class needed for collision detection. Every fixture has his shape, for example [source lang="csharp"]public enum FixtureShape { Rectangle, Circle, Rhomb, MouseMap, None }[/source] For example, [img][/img] here the violet circle is the fixture for the player entity. For other shapes is similiar. If mouse map is choosen, the texture is thresholded and for every pixel with an alpha value different from zero, that pixel is set to black. Well, for collision detection i use per pixel collision algorithm, for now i use that from microsoft sample. Here's the function [source lang="csharp"]public bool CheckCollision( Fixture f ) { Rectangle f2Rect = f.Rectangle; Color[] f2Data = f.FixtureData; // Find the bounds of the rectangle intersection int top = Math.Max( Rectangle.Top, f2Rect.Top ); int bottom = Math.Min( Rectangle.Bottom, f2Rect.Bottom ); int left = Math.Max( Rectangle.Left, f2Rect.Left ); int right = Math.Min( Rectangle.Right, f2Rect.Right ); // Check every point within the intersection bounds for( int y = top; y < bottom; y++ ) { for( int x = left; x < right; x++ ) { // Get the color of both pixels at this point Color colorA = FixtureData[ ( x - Rectangle.Left ) + ( y - Rectangle.Top ) * Rectangle.Width ]; Color colorB = f2Data[ ( x - f2Rect.Left ) + ( y - f2Rect.Top ) * f2Rect.Width ]; // If both pixels are not completely transparent, if( colorA.A != 0 && colorB.A != 0 ) { // then an intersection has been found return true; } } } // No intersection found return false; }[/source] And here's how i use it. I have a list of fixtures that are currently in the visible part of the screen, viewedFixtures. Here's the function where i check collision between objects and player [source lang="csharp"]public bool IsPlayerColliding( List<Fixture> viewedFixtures, Vector2 MoveDirection ) { if( PlayerFixture == null ) return false; //take a clone of player fixture Fixture t = (Fixture)PlayerFixture.Clone(); t.Location += MoveDirection; foreach( Fixture f in viewedFixtures ) { if( t.CheckCollision( f ) ) //there's a collision return true; } return false; }[/source] what i do here is checking for collision between the player fixture, [u]moved along the direction the user choosed[/u], and the near fixtures, and this is the function that let the user to move the player in the map: [source lang="csharp"]public void MovePlayer( Vector2 moveDirection ) { if( Player == null ) return; if( !CollisionSystem.IsPlayerColliding( Map.ViewedFixtures, moveDirection ) ) { Player.Location += moveDirection; } }[/source] here, if the fixture in the new location is not colliding, finally move the player and the player fixture along the choosed direction. Finally, here's the update method of the game source: [source lang="csharp"]/// <summary> /// Allows the game to run logic such as updating the world, /// checking for collisions, gathering input, and playing audio. /// </summary> /// <param name="gameTime">Provides a snapshot of timing values.</param> protected override void Update( GameTime gameTime ) { // Allows the game to exit if( GamePad.GetState( PlayerIndex.One ).Buttons.Back == Microsoft.Xna.Framework.Input.ButtonState.Pressed ) this.Exit(); GamePadState padState = GamePad.GetState( PlayerIndex.One ); Vector2 MoveDirection = Vector2.Zero; #region Movement section #region North-west if( padState.DPad.Left == Microsoft.Xna.Framework.Input.ButtonState.Pressed && padState.DPad.Up == Microsoft.Xna.Framework.Input.ButtonState.Pressed ) { MoveDirection = new Vector2( -2, -1 ); } else #endregion North-west #region North-east if( padState.DPad.Right == Microsoft.Xna.Framework.Input.ButtonState.Pressed && padState.DPad.Up == Microsoft.Xna.Framework.Input.ButtonState.Pressed ) { MoveDirection = new Vector2( 2, -1 ); } #endregion North-east #region South-west else if( padState.DPad.Left == Microsoft.Xna.Framework.Input.ButtonState.Pressed && padState.DPad.Down == Microsoft.Xna.Framework.Input.ButtonState.Pressed ) { MoveDirection = new Vector2( -2, 1 ); } #endregion South-west #region South-east else if( padState.DPad.Right == Microsoft.Xna.Framework.Input.ButtonState.Pressed && padState.DPad.Down == Microsoft.Xna.Framework.Input.ButtonState.Pressed ) { MoveDirection = new Vector2( 2, 1 ); } #endregion South-east #region North else if( padState.DPad.Up == Microsoft.Xna.Framework.Input.ButtonState.Pressed ) { MoveDirection = new Vector2( 0, -1 ); } #endregion North #region South else if( padState.DPad.Down == Microsoft.Xna.Framework.Input.ButtonState.Pressed ) { MoveDirection = new Vector2( 0, 1 ); } #endregion South #region West else if( padState.DPad.Left == Microsoft.Xna.Framework.Input.ButtonState.Pressed ) { MoveDirection = new Vector2( -2, 0 ); } #endregion West #region East else if( padState.DPad.Right == Microsoft.Xna.Framework.Input.ButtonState.Pressed ) { MoveDirection = new Vector2( 2, 0 ); } #endregion East #endregion Movement section if( MoveDirection != Vector2.Zero ) world.MovePlayer( MoveDirection ); base.Update( gameTime ); }[/source] Ok. There's a problem but i can't find it. Here's some screenshot: [img][/img] [img][/img] The problem is that the fixture go 'inside' the other fixture...anyone has a suggestion? (sorry for my bad english) Thanks, bye
  2. If you like rock music...

    Hi everyone =) i want to share with you what i done! i'm taking part in a rock guitar contest and i want to know what do you think of my solo. Here's my video [media][/media] sorry for the bad quality =\ bye ;)
  3. 2d Isometric slopes fix

    implement it as a standard height map? Does this mean that i can store all the height in a (for example) integer matrix as big as the map? Ok but every time i have to check the tiles "transition" when i move up/down one...and in certain cases i've to modify a lot of tiles...
  4. 2d Isometric slopes fix

    up? [img][/img]
  5. Hi guys, i'm developing a full 2d iso engine with xna (here's a demo [url=""][/url]), but now i need an algorithm to raise/fix automatically every tile around a previously moved up/down tile. i.e if i move up a tile at height 0, the 8 tiles around must be modified...etc... What i can do? In my video i modified every single tile... here's a video showing what i need(from 00:26) [url=""][/url] bye =)
  6. [XNA 4] Isometric block placement issue

    ok it was a stupid error =) well, i fixed all, that's the result [url=""][img][/img][/url] thanks ;)
  7. [XNA 4] Isometric block placement issue

    [quote name='MasterEvilAce' timestamp='1316977972' post='4865827'] Look at how you're actually drawing the tiles. Just looking at the top row you can see what's going on. (Ignoring the Y for now) you're rendering 0,0 then 1,0 then 2,0. If you look at the arrangements of those tiles you SHOULD be rendering 0,0 then 2,0 then 4,0 (etc) THEN render 1,0 and 3,0, etc. 2,0 is physically setup to be behind 1,0, so it needs to render first. As far as the solution goes, I'm not sure the best course of action. But that's what your problem is. I think the best solution might be to setup your grid to where the first actual row is 0,0 then 1,0 then 2,0 then 3,0. The next row (shifted over) is 0,1 then 1,1 then 2,1 then 3,1. However, the rest of your math for click tiles, etc. would have to be modified as well. [/quote] hmm ok i tried this: [source]private void drawBlocks(SpriteBatch batch) { for (int y = 0; y < Height; y++) { for (int x = 0; x < Width; x+=2) { if (objectMap[x, y] != null) objectMap[x, y].Draw(batch); } for (int x = 1; x < Width; x += 2) { if (objectMap[x, y] != null) objectMap[x, y].Draw(batch); } } }[/source] but,again, when i click(for example) tiles 2,2 ,4,2 , 3,1 the result is [url=""][img][/img][/url] =|
  8. [XNA 4] Isometric block placement issue

    [quote name='iEat_Babies' timestamp='1316969407' post='4865796'] What did you do to get to the last screenshot... what "caused" it? [/quote] nothing special....only placed blocks close togheter. The two previous screenshot are two different situation. In the first the blocks have a certain distance, in the second all the blocks are close togheter, but drawed in the wrong order...
  9. Hi people, i'm currently working on a simple 2D isometric engine using a staggered map, i'm thinking about a simcity clone... Drawing the map and the tile picking are ok, but here's the painful part: block placement in the map. So, here's what i've done: I've a map class containing [source]terrainBlock terrain[,]; int height; int width; mapObject objectMap[,]; ...[/source] terrain holds all terrain blocks,object holds the blocks the user can place in the map. Here's the map [url=""][img][/img][/url] When i click on a terrain block i have something like this [url=""][img][/img][/url] and this is my Update method: [source]public void Update(MouseState m1) { Point selectedTileCoord = ChechTilePicking(m1); //if we selected a valid tile if (selectedTileCoord.X != -1 && selectedTileCoord.Y != -1) { //if user press the left button if (m1.LeftButton == ButtonState.Pressed) { if (objectMap[selectedTileCoord.X, selectedTileCoord.Y] == null) { //create a new block objectMap[selectedTileCoord.X, selectedTileCoord.Y] = new mapObject(Content, this, selectedTileCoord); } } } }[/source] seems ok but...look at this now: [url=""][img][/img][/url] Oh no! What's happening here? I don't know how to render all the blocks in the right order, once placed in the map. Here's my draw method: [source]public void Draw(SpriteBatch batch) { batch.Begin(); drawTiles(batch); batch.End(); batch.Begin(); drawBlocks(batch); batch.End(); }[/source] so, i draw first all the terrain blocks(right?), then i draw all the map blocks. Here's the drawBlock method: [source]private void drawBlocks(SpriteBatch batch) { for (int y = 0; y < Height; y++) { for (int x = 0; x < Width; x++) { if (objectMap[x, y] != null) objectMap[x, y].Draw(batch); } } }[/source] and this is the draw method for the mapObject class: [source]public void Draw(SpriteBatch batch) { batch.Draw(texture, rect, Color.White); }[/source] where rect is the destination rectangle in the screen. However, the drawBlocks method should draw every block left to right,top to bottom...but it doesn't work correctly! How can i render correctly every block in the map? =\