2012-06-01 2 views
0

Я хочу нарисовать нескольких игроков на клиенте. Он отлично работает без поворотов foreach, но когда я добавляю вращение foreach, он обновляет оба игрока с вращением друг от друга вместо игрока, для которого предназначен поворот.foreach внутри foreach с 2 различными словарями

foreach (var kvp in positions) 
{ 
    foreach (var kvr in rotations) 
    { 
     // draw player 
     spriteBatch.Draw(texture, kvp.Value, null, Color.White, 
     kvr.Value, new Vector2(texture.Width/2, texture.Height/2), 1f, 
     SpriteEffects.None, 1f); 
    } 
} 

У каждого игрока есть уникальный идентификатор, который я храню как ключ в словарях BOTH. Есть ли способ, чтобы я мог объединить эти словари для достижения правильного результата?

Прямо сейчас позиции диктатуры содержат (long, Vector2 (x, y)), где long - уникальный идентификатор пользователя , а вращения содержат (long, float), где long - это тот же идентификатор пользователя, что и в позициях, а float - вращение.

Редактировать: Это прекрасно работает, но не обновляет вращение, поскольку оно установлено.

foreach (var kvp in positions) 
{ 
    // draw player 
    spriteBatch.Draw(texture, kvp.Value, null, Color.White, 1f, 
    new Vector2(texture.Width/2, texture.Height/2), 1f, 
    SpriteEffects.None, 1f); 
} 
+3

Пожалуйста, отсканируйте свой код правильно, это значительно упростит чтение. –

+0

У меня нет прямого опыта, но я слышал, что время выполнения xbox может иметь проблемы с производительностью сборки мусора, используя foreach в циклах рендеринга из итераторов. – asawyer

+0

Извините, позвольте мне изменить его. И это только для Windows, поскольку я использую Lidgren Network. Но это нелогично. –

ответ

0

Разве это не так просто, как:

foreach (var kvp in positions) 
     { 
      kvr = rotations[kvp.Key]; 
      // draw player 
      spriteBatch.Draw(texture, kvp.Value, null, Color.White, 
      kvr.Value, new Vector2(texture.Width/2, texture.Height/2), 1f, 
      SpriteEffects.None, 1f); 
     } 
+0

Простое решение! Большое спасибо, это прекрасное временное решение. –

2

Почему вы не создать класс игрока, который содержит всю информацию об игроке.

class Player 
{ 
    public Vector2 Position { get; set; } 
    public float Rotation { get; set; } 
} 

и просто держать один словарь, который с помощью петли, здесь я покажу вам очень простой класс игры, который привлекает 5 игроков с вращениями, мы надеемся, что это поможет :)

public class Game1 : Microsoft.Xna.Framework.Game 
{ 
GraphicsDeviceManager graphics; 
SpriteBatch spriteBatch; 

Dictionary<int, Player> players; 
Texture2D texture; 

public Game1() 
{ 
    graphics = new GraphicsDeviceManager(this); 
    Content.RootDirectory = "Content"; 
} 

protected override void LoadContent() 
{ 
    spriteBatch = new SpriteBatch(GraphicsDevice); 
    texture = Content.Load<Texture2D>("player"); 

    Random rnd = new Random(); 

    players = new Dictionary<int, Player>() 
     { 
      // Add 5 new players, their location is random and so is their rotation. 
      {0, new Player() { Position = new Vector2(rnd.Next(1024),rnd.Next(768)), Rotation = rnd.Next(360), Size = new Vector2(texture.Width, texture.Height)}}, 
      {1, new Player() { Position = new Vector2(rnd.Next(1024),rnd.Next(768)), Rotation = rnd.Next(360), Size = new Vector2(texture.Width, texture.Height)}}, 
      {2, new Player() { Position = new Vector2(rnd.Next(1024),rnd.Next(768)), Rotation = rnd.Next(360), Size = new Vector2(texture.Width, texture.Height)}}, 
      {3, new Player() { Position = new Vector2(rnd.Next(1024),rnd.Next(768)), Rotation = rnd.Next(360), Size = new Vector2(texture.Width, texture.Height)}}, 
      {4, new Player() { Position = new Vector2(rnd.Next(1024),rnd.Next(768)), Rotation = rnd.Next(360), Size = new Vector2(texture.Width, texture.Height)}}, 
     }; 
} 

protected override void Draw(GameTime gameTime) 
{ 
    GraphicsDevice.Clear(Color.CornflowerBlue); 

    spriteBatch.Begin(); 
    for (int i = 0; i < players.Count; i++) 
    { 
     Player targetPlayer = players[i]; 
     spriteBatch.Draw(texture, targetPlayer.PlayerRectangle, null, Color.White, targetPlayer.Rotation, targetPlayer.Centre, SpriteEffects.None, 0.0f); 
    } 
    spriteBatch.End(); 

    base.Draw(gameTime); 
} 
} 

class Player 
{ 
Rectangle playerRectangle; 
Vector2 position; 
Vector2 size; 
Vector2 center; 

public Vector2 Position { get { return position; } set { position = value; UpdateRectangleAndCentre(); } } 
public Vector2 Size { get { return size; } set { size = value; UpdateRectangleAndCentre(); } } 
public float Rotation { get; set; } 
public Rectangle PlayerRectangle { get { return playerRectangle; } } 
public Vector2 Centre { get { return center; } } 

void UpdateRectangleAndCentre() 
{ 
    playerRectangle = new Rectangle((int)Position.X, (int)Position.Y, (int)Size.X, (int)Size.Y); 
    center = new Vector2(size.X/2, size.Y/2); 
} 
} 
+0

Спасибо за это решение, я добавлю класс игрока, когда буду немного дальше. –

+0

Если вы хотите тестер, я здесь! Мне нравится тестировать игры других народов: D – Andy

+0

Всякий раз, когда я готов к тестированию, я сообщу вам :) Спасибо за этот ответ. –

Смежные вопросы