使用单链表的绘制方法
Draw Method using singly linked lists
背景:游戏由可点击的牡蛎组成,必须将它们移动到屏幕上它们消失的另一个位置。牡蛎(节点)有图像、矩形、位置和下一个节点数据。在 draw 方法中,我有一个代表节点数的计数器。每次迭代都会调用 traverse 方法。一旦循环完成,遍历列表的变量将重置为列表的头部。 25个节点中只绘制了一个。
_oysterSLL.placeholder = _oysterSLL.moveAddress;
GraphicsDevice.Clear(Color.CornflowerBlue);
spriteBatch.Begin();
spriteBatch.Draw(Bins.T2DrepresentativeImage, Bins.V2location, Color.White);
for (int i = _oysterSLL.count; i > 1; --i)
{
_oysterSLL.traverseList(_oysterSLL.moveAddress);
spriteBatch.Draw(_oysterSLL.moveAddress.T2DrepresentativeImage, _oysterSLL.moveAddress.V2location, Color.White);
}
_oysterSLL.moveAddress = _oysterSLL.placeholder;
spriteBatch.End();
base.Draw(gameTime);
问题:如何绘制每个节点而不是最后一个节点?
感谢您的帮助。我是编程新手,如有任何建议,我们将不胜感激!
编辑:我在下面添加了 _oysterSLL class 代码。使用的实用程序 class 唯一继承的变量是 count 变量,它是一个 int。感谢您的建议,我希望我包含的 LinkedList class 对您有所帮助。我想我想避免使用数组,因为我想在用户将牡蛎移动到 objective 时释放内存。但是,我可以看到我在不使用索引的情况下使用 for 循环是多么荒谬。
namespace Oyster
{
class LinkedList : Utility
{
private Oyster _head, _tail, _placeholder, _moveAddress;
public LinkedList()
{
}
public Oyster head
{
get { return _head; }
set { _head = value;}
}
public Oyster tail
{
get { return _tail; }
set { _tail = value; }
}
public Oyster placeholder
{
get { return _placeholder; }
set { _placeholder = value; }
}
public Oyster moveAddress
{
get { return _moveAddress; }
set { _moveAddress = value; }
}
public void oysterAddSLL(Oyster newOyster)
{
if (_head == null)
{
_head = newOyster;
_tail = newOyster;
_placeholder = newOyster;
_moveAddress = newOyster;
count++;
}
else
{
_tail = newOyster;
_head.Next = _tail;
_head = _tail;
count++;
}
}
public void traverseList(Oyster node)
{
node = node.Next;
}
public void nodeDeletion( Oyster toBeDeleted, Oyster toDirect)
{
toDirect.Next = toBeDeleted.Next;
}
}
我不知道我是否完全理解你的代码(变量命名有点让我困惑),但让我试试看:
我看到你在遍历牡蛎集合,但你总是画同一个。
如果您根本不打算使用循环的索引,那么使用 for
循环有什么意义?
我认为你的问题可以通过解决每个位置的牡蛎来解决,基本上是这样的:
for (int i = _oysterSLL.Count; i > 1; --i)
{
_oysterSLL.traverseList(_oysterSLL[i].moveAddress);
spriteBatch.Draw(_oysterSLL[i].moveAddress.T2DrepresentativeImage, _oysterSLL[i].moveAddress.V2location, Color.White);
}
如您所见,在 draw 方法中,我现在使用索引变量 (_oysterSLL[i]
) 来定位它包含的每个对象。
但是考虑到这一点,并且没有与 _oysterSLL
集合中的对象对应的代码,很难理解它的作用。
背景:游戏由可点击的牡蛎组成,必须将它们移动到屏幕上它们消失的另一个位置。牡蛎(节点)有图像、矩形、位置和下一个节点数据。在 draw 方法中,我有一个代表节点数的计数器。每次迭代都会调用 traverse 方法。一旦循环完成,遍历列表的变量将重置为列表的头部。 25个节点中只绘制了一个。
_oysterSLL.placeholder = _oysterSLL.moveAddress;
GraphicsDevice.Clear(Color.CornflowerBlue);
spriteBatch.Begin();
spriteBatch.Draw(Bins.T2DrepresentativeImage, Bins.V2location, Color.White);
for (int i = _oysterSLL.count; i > 1; --i)
{
_oysterSLL.traverseList(_oysterSLL.moveAddress);
spriteBatch.Draw(_oysterSLL.moveAddress.T2DrepresentativeImage, _oysterSLL.moveAddress.V2location, Color.White);
}
_oysterSLL.moveAddress = _oysterSLL.placeholder;
spriteBatch.End();
base.Draw(gameTime);
问题:如何绘制每个节点而不是最后一个节点?
感谢您的帮助。我是编程新手,如有任何建议,我们将不胜感激!
编辑:我在下面添加了 _oysterSLL class 代码。使用的实用程序 class 唯一继承的变量是 count 变量,它是一个 int。感谢您的建议,我希望我包含的 LinkedList class 对您有所帮助。我想我想避免使用数组,因为我想在用户将牡蛎移动到 objective 时释放内存。但是,我可以看到我在不使用索引的情况下使用 for 循环是多么荒谬。
namespace Oyster
{
class LinkedList : Utility
{
private Oyster _head, _tail, _placeholder, _moveAddress;
public LinkedList()
{
}
public Oyster head
{
get { return _head; }
set { _head = value;}
}
public Oyster tail
{
get { return _tail; }
set { _tail = value; }
}
public Oyster placeholder
{
get { return _placeholder; }
set { _placeholder = value; }
}
public Oyster moveAddress
{
get { return _moveAddress; }
set { _moveAddress = value; }
}
public void oysterAddSLL(Oyster newOyster)
{
if (_head == null)
{
_head = newOyster;
_tail = newOyster;
_placeholder = newOyster;
_moveAddress = newOyster;
count++;
}
else
{
_tail = newOyster;
_head.Next = _tail;
_head = _tail;
count++;
}
}
public void traverseList(Oyster node)
{
node = node.Next;
}
public void nodeDeletion( Oyster toBeDeleted, Oyster toDirect)
{
toDirect.Next = toBeDeleted.Next;
}
}
我不知道我是否完全理解你的代码(变量命名有点让我困惑),但让我试试看:
我看到你在遍历牡蛎集合,但你总是画同一个。
如果您根本不打算使用循环的索引,那么使用 for
循环有什么意义?
我认为你的问题可以通过解决每个位置的牡蛎来解决,基本上是这样的:
for (int i = _oysterSLL.Count; i > 1; --i)
{
_oysterSLL.traverseList(_oysterSLL[i].moveAddress);
spriteBatch.Draw(_oysterSLL[i].moveAddress.T2DrepresentativeImage, _oysterSLL[i].moveAddress.V2location, Color.White);
}
如您所见,在 draw 方法中,我现在使用索引变量 (_oysterSLL[i]
) 来定位它包含的每个对象。
但是考虑到这一点,并且没有与 _oysterSLL
集合中的对象对应的代码,很难理解它的作用。