2013-07-29 2 views
0

В моем коде я вхожу 4 клавиши с различными значениями в SortedList, каждый из которых использует:SortedList ключи указывают на то же значение

animations.Add(0, new Animation("prefix", textures, timer, looped)); 

отсортированный список создается следующим образом:

private SortedList<int, Animation> animations = new SortedList<int, Animation>(); 

Однако, когда я звоню, чтобы изменить текущую Анимацию, она меняет считываемый ключ (идентификатор), но не значение. Значение всегда остается на последнем, введенном в SortedList.

Это изменение анимации метод:

private void setAnimation(int ID) 
    { 
     Utilities.Log("Animation set to: " + ID + " of " + animations.Count); 
     curAnim = animations[ID]; 
     curAnimID = ID; 
     curAnim.reset(); 
    } 

Какие выходы

[29/07/2013 08:09:00 PM] Animation set to: 1 of 4 
[29/07/2013 08:09:01 PM] Animation set to: 4 of 4 

Но визуальная анимация всегда остается неизменным. Изменения инициируются событиями клавиатуры.

Я застрял на этом весь день, если бы вы могли помочь, это было бы очень полезно. Любые другие части кода будут предоставлены по запросу.

EDITS: curAnim отображается методом getTexture() в классе Animation, который всегда возвращается так, как если бы он был введен в последнюю введенную запись.

Вставки:

 //----------------IDLE----------------// 
     TextureBank idleTb = new TextureBank(); 
     idleTb.add("idle1", c.Load<Texture2D>("idle")); 
     idleTb.add("idle1" + flip_str, Utilities.FlipHorizontal(c.Load<Texture2D>("characters/wife/idle"))); 
     animations.Add(ANIMATIONS.IDLE, new Animation("idle", idleTb, 200, true)); 

     //----------------JUMP----------------// 
     TextureBank jumpTb = new TextureBank(); 
     jumpTb.add("jump1", c.Load<Texture2D>("jump")); 
     jumpTb.add("jump1" + flip_str, Utilities.FlipHorizontal(c.Load<Texture2D>("characters/wife/jump"))); 
     animations.Add(ANIMATIONS.JUMP, new Animation("jump", jumpTb, 200, false)); 

     //----------------PUNCH----------------// 
     TextureBank punchTb = new TextureBank(); 
     punchTb.add("punch1", c.Load<Texture2D>("punch")); 
     punchTb.add("punch1" + flip_str, Utilities.FlipHorizontal(c.Load<Texture2D>("characters/wife/punch"))); 
     animations.Add(ANIMATIONS.PUNCH, new Animation("punch", punchTb, 200, false)); 

     //----------------WALK----------------// 
     TextureBank walkTb = new TextureBank(); 
     walkTb.add("walk1", c.Load<Texture2D>("walk")); 
     walkTb.add("walk1" + flip_str, Utilities.FlipHorizontal(c.Load<Texture2D>("characters/wife/walk"))); 
     walkTb.add("walk2", c.Load<Texture2D>("walk2")); 
     walkTb.add("walk2" + flip_str, Utilities.FlipHorizontal(c.Load<Texture2D>("characters/wife/walk2"))); 
     animations.Add(ANIMATIONS.WALK, new Animation("walk", walkTb, 200, true)); 

     setAnimation(ANIMATIONS.IDLE); 
+0

Как вы распространяете 'curAnim' в свой интерфейс? curAnim, вероятно, установлен правильно, но ваш пользовательский интерфейс, вероятно, по-прежнему является ссылкой на тот, который был изначально установлен. – McAden

+0

«Значение не изменяется» Я имею в виду, что при запросе префикса от ключа он возвращается так же, как и последняя запись SortedList. – Rob

+0

'animations.Add (0, новая анимация (...))' Вы всегда используете ноль, '0'? Вы можете добавить только * одну * запись для каждого 'int' в' SortedList '. –

ответ

0

Если setAnimation вызывается из другого потока, чем одно чтение из curAnim, то вам нужны блокировки, чтобы гарантировать, что дисплей нить фактически начинает использовать обновленное значение. В противном случае он может с радостью продолжать использовать предыдущий объект анимации навсегда, долго после того, как вы считаете, что заменили его.

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