使用单链表绘制方法

时间:2015-03-20 04:39:48

标签: c# linked-list xna draw

背景:游戏由可点击的牡蛎组成,必须将它们移动到屏幕上消失的另一个位置。牡蛎(节点)具有图像,矩形,位置和下一节点数据。在draw方法中,我有一个表示节点数的计数器。每次迭代都会调用遍历方法。循环完成后,遍历列表的变量将重置为列表的头部。只绘制了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类代码。使用的实用程序类中唯一的继承变量是count变量,它是一个int。感谢您的建议,我希望我包含LinkedList类是有帮助的。我想我想避免使用数组,因为当用户将牡蛎移动到目标时我想释放内存。但是,我可以看到我在不使用索引的情况下使用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;
    }
} 

1 个答案:

答案 0 :(得分:1)

我不知道我是否完全理解你的代码(变量命名让我感到困惑),或者不是,但让我试一试:

我可以看到你正在迭代牡蛎的集合,但你总是绘制相同的牡蛎。

如果您根本不使用循环索引,那么使用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集合中的对象相对应的代码,很难理解它的作用。