我正在尝试将我的播放器列表的名称和分数转储到临时数组中进行排序,以便它们可以显示在记分板上.
由于某种原因,似乎保持对值的引用而不是值本身.排序后,记分板为每个条目读取"玩家4 - 得分4".我知道排序方法有效,我以前在另一个游戏中使用过它.
初始值为player1 - 1 player2 - 2 player3 - 3 player4 - 4
缺少的一件事是每次更新都会将分数转储到分数列表中.在尝试重新排列以使其工作之后我把它拿出来了.
请帮助我理解为什么会这样.我在这里阅读这篇文章并没有多大帮助. http://msdn.microsoft.com/en-us/library/0f66670z(v=vs.71).aspx
初始化
ScoresList = DumpListToArray(PlayerManager.PlayerList);
Run Code Online (Sandbox Code Playgroud)
更新
SortKillScores(ScoresList);
Run Code Online (Sandbox Code Playgroud)
画
private static void DrawKillScores(SpriteBatch spriteBatch)
{
for (int i = 0; i < 4; i++)
{
spriteBatch.DrawString(font, "" + ScoresList[i].Name + " - " + ScoresList[i].KillScore, new Vector2(900, 0 + 20 * i), Color.White, 0f, Vector2.Zero, 0.5f, SpriteEffects.None, 1f);
}
}
Run Code Online (Sandbox Code Playgroud)
方法
private static ScoreHolder[] DumpListToArray(List<Player> tempList)
{
ScoreHolder[] tempArray = new ScoreHolder[4];
for (int i = 0; i < 4; i++)
{
tempArray[i] = new ScoreHolder();
tempArray[i].Name = tempList[i].PlayerName;
tempArray[i].KillScore = tempList[i].KillScore;
tempArray[i].TimeScore = tempList[i].TimeScore;
tempArray[i].PointScore = tempList[i].PointScore;
}
return tempArray;
}
private static void SortKillScores(ScoreHolder[] array)
{
for (int i = 0; i < array.Length; i++)
{
for (int k = i; k > 0 && array[k].KillScore > array[k - 1].KillScore; k--)
{
int score = array[k].KillScore;
string name = array[k].Name;
array[k] = array[k - 1];
array[k - 1].KillScore = score;
array[k - 1].Name = name;
}
}
}
Run Code Online (Sandbox Code Playgroud)
而不是尝试将属性从一个单元格复制到另一个单元格,只需交换单元格:
private static void SortKillScores(ScoreHolder[] array)
{
for (int i = 0; i < array.Length; i++)
{
for (int k = i; k > 0 && array[k].KillScore > array[k - 1].KillScore; k--)
{
var temp = array[k];
array[k] = array[k - 1];
array[k - 1] = temp;
}
}
}
Run Code Online (Sandbox Code Playgroud)
你遇到了什么是复制到同一项目的参考array[k],然后编辑该项目中k-1哪个是同一项目!
int score = array[k].KillScore;
string name = array[k].Name;
array[k] = array[k - 1]; // cells k and k-1 are the same item!
array[k - 1].KillScore = score; // this changes both k and k-1
array[k - 1].Name = name; // and so does this!
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
120 次 |
| 最近记录: |