【问题标题】:How to display a set of indexes to screen in array如何在数组中显示一组索引到屏幕
【发布时间】:2023-08-16 03:51:01
【问题描述】:

我正在使用 BaseItem 列表,我想在每次按下某个按钮时显示数组中的不同索引范围。

这是我尝试添加不可堆叠的不同项目的示例。

Public class BaseItem
{
    public string name {get;set;}
    public string descrip {get;set;}
    public bool isStackable {get;set;}
    public int stackSize {get;set;}
    public int maxStackSize {get;set;}
    public Texture2D texure{get;set}
}

我使用了我通过搜索在本网站上找到的这部分代码。

Vector2 Pos;
int ItemsPerPage = 6;
int Columns = 1;
int Rows = 255;
int CurrentPage = 1;
int MaxPages;
BaseItem[,] items = new Baseitem[Columns,Rows];

public void Draw(SpriteBatch spriteBatch)
{

       for(int X = 0; i < Columns; X ++)
       {
          for(int X = 0; i < Columns; X ++)
          {
              int DrawX = Pos.X +(X * (slothSize +2);
              int DrawY = Pos.Y +(Y * (slothSize +2);
              spriteBatch.Draw(items[X,Y].texure, new Rectangle(DrawX, DrawY, 32,32), Color.Whie);
          }

       }

}

我的问题,如何每页显示 6 个项目,所以多余的项目将移动到下一页,

所以如果我有 30 件物品,我需要有 5 页,全部有 6 件物品。

我的主要问题是如何使用var itemsPerPage. 逐页设置和移动页面并在每页上显示 x 数量的项目

所以基本上在额外的页面上移动额外的项目并添加基于itemes.length / ItemsPerPage = maxPages的number var maxpages

我尝试过使用一维数组 我当时也不能画更多的项目。他们都画在同一个位置。 如果我使用 For 循环 2 次……使它成为 X 和 Y 位置……它不会绘制。 这是一个例子:

BaseItem items[,] = new BaseItem[] {} 


public void Draw(SpriteBatch spriteBatch)
{
     var result = Items.Cast<double>().Skip(ItemsPerPage * Currentpage).Take(itemsPerPage);
    foreach(item in result)
    {
        for(int X = 0; X < Columns; X++)
        {
            for(int Y = 0;Y < Rows; Y++)
             { 
                 int DrawX = pos.X + (X * (SlowtWidth +2);
                 int DrawY = pos.Y + (Y * (SlowtWidth +2);
                 if(items[X,Y] != null)
                 {
                      spriteBatch.Draw(items[X,Y], new Rectangle(DrawX,DrawY,SlotWidth, SlotHeight) new Rectangle(0,0,SlotWidth, SlotHeight),Color.White)  
                 }
             {
        {
    }
}

public void Update(GameTime gameTime)
{
    if(CurrentPage <= 0)
    {
       CurrentPage = MaxPages;
    }

    if(CurrentPage => MaxPages)
    {
       CurrentPage = 1;
    }
    if(Input.KeyPressed(Keys.A))
    { 
        CurrentPage++;
    {
    if(Input.KeyPressed(Keys.D))
    { 
        CurrentPage--;
    {
    Input.Update(gameTime)
}

现在它根本不会将项目绘制到屏幕上...如果我只是用 items(list) 替换结果,它将绘制但不会用 ItemsPerPage 限制列表

我可以使用columns and rows 设置“插槽”的数量,但是我如何更改页面...也就是跳过数组中的数字并显示下一个索引...类似于一维数组.skip(20).take(29) 芽在二维中完成数组?

【问题讨论】:

  • 代码中“页面”的概念在哪里?它应该很简单,像这样:spriteBatch.Draw(...); DrawPage(pageNumber); numDrawnOnThisPage++; if (numDrawnOnThisPage == 6) { pageNumber++; numDrawnOnThisPage = 0; }.
  • 我在想MaxPages = math.celling(items.length / ItemsPerPage); 所以当我按下某个按钮时,它使用 CurrentPage 作为值来更改页面并显示每页的 x 数量。所以我需要帮助解决这个小问题。
  • 你需要计算一个MaxPages吗?为什么不只在每页一次绘制 6 个项目,直到项目用完为止。如果您想知道页面的数量,您可以在创建它们时计算它们。但是是的,您可以计算它,您的 Math.Ceiling() 将起作用,但您需要先将至少一个参数转换为浮点数,否则整数除法将首先截断结果:Math.Ceiling((float)items.Length / ItemsPerPage) 应该起作用。
  • 如何设置一次可以绘制多少个项目。如果我说 6...并且页面是 2...它将需要从 5 绘制到 11 等等。如何设置每页的最大项目数?
  • 所以基本上想在第 1 页从 0 到 5 绘制,第 2 页从 6 到 11 等等。当我将Currentpage 中的值减少/增加 1 时,在该数组中绘制该组索引。

标签: c# xna monogame


【解决方案1】:

在您的 Draw 方法中,您有两个 Rectangle:第一个将 DrawX 和 DrawY 设置为位置,第二个设置为 0,0。我认为,您可以使用第二个而不是第一个。

【讨论】:

  • 我这样做了,但我得到了错误foreach(item in result) Erorr 部分指向;我现在没有做那个例子......
  • 前 2 个参数是 X 和 Y 位置,秒是物体的重量和高度。对于两个矩形...你的意思是我替换了第一个 0,0.sw、sh 和第二个 DrawX、DrawY、Sw、sh Sw = slotwidth、sh = slotheight?
  • 当我在foreach(item in result)中将二维数组转换为双精度时
  • 在 foreach 循环之前var result = items.Cast&lt;double&gt;().Skip(3).Take(1) 我看不到 foreah 循环 item.texture 等的内部。我仍然使用 items[X,Y].Textrue....而且 itmes 仍然在绘制超过 ItemsPerPage = 3
  • 这个答案没有帮助。
最近更新 更多