【问题标题】:Rotate an object for placement in a 2d array旋转对象以放置在二维数组中
【发布时间】:2015-12-13 14:51:59
【问题描述】:

我正在尝试创建一个基本的 RTS 样式网格。网格完美运行,我可以通过将数字设置为 0 以外的任何值来放置对象。

这是最简单的部分。目前我试图让每个放置的对象都可以旋转。可以旋转的对象可以是任意大小,例如1x1、2x1、3x4等,所有物体都有一个入口块,需要随物体旋转。

例如。

我的网格是空的

0 0 0 0 0 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0

我可以放置如下所示的对象:

1 2 1
1 1 1

哪个会像

0 0 0 0 0 0 0
0 1 2 1 0 0 0       1 2 1
0 1 1 1 0 0 0       1 1 1
0 0 0 0 0 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0

但是当旋转时它应该像这样放置

1 2 1 0 1 1 0     1 2 1   1 1  
1 1 1 0 1 2 0     1 1 1   1 2  
0 0 0 0 1 1 0             1 1  
0 1 1 0 0 0 0       1 1        
0 2 1 0 1 1 1       2 1   1 1 1
0 1 1 0 1 2 1       1 1   1 2 1

考虑到对象可以具有不同的形状,我试图弄清楚如何在代码中实现这一点? :(

1 1 2 1    1 1 1    1 1 1 1    1 1 1
1 1 1 1    1 1 1    1 1 1 1    2 1 1
1 1 1 1    1 1 2    1 2 1 1    1 1 1
           1 1 1               1 1 1

【问题讨论】:

  • 开始定义约束:矩阵的维度范围,对象的维度范围,开始时对象必须放在矩阵内的什么位置,旋转表示对象的多个副本(如您的示例)还是只有一个?如果对象位于矩阵的中间怎么办?旋转会导致重叠...
  • 然后,显然,发布你的尝试
  • 感谢您的回复:),正确的对象是一台机器,我在机器中创建入口点,因此入口点必须在机器外部。该对象将像我发布的第一个对象一样定义一次。当我单击旋转并单击以放置对象时,它会将其放置在旋转位置,而不是其定义的位置。对象的大小将根据未来的请求来定义,但到目前为止我不会让它大于 4x4。我还是不明白如何旋转对象或数组:(

标签: java c# arrays rotation 2d-games


【解决方案1】:

我想出了如何从这里的另一个板上完成此操作。

我做的第一件事是将对象存储在二维数组中,例如

1 2 1 1
1 1 1 1

然后我 transposed 数组将这个数组留给我

1 1
2 1
1 1
1 1

然后我旋转每一行,留下我最终旋转的对象

1 1
1 2
1 1
1 1

对于 180 多次旋转,我只是再次使用这种技术来达到所需的旋转 :)

我在 Unity3D C# 中的最终数组类

using UnityEngine;
using System.Collections;

namespace Arrays {

    public class Array {

        public static int[,] Rotate(int[,] array)
        {
            return Rotate90 (array);
        }

        public static int[,] Rotate90(int[,] array)
        {
            return RotateArrayRow( Transpose(array) );
        }

        public static int[,] Rotate180(int[,] array)
        {
            return Rotate90(Rotate90(array));;
        }

        public static int[,] Rotate270(int[,] array)
        {
            return Rotate90(Rotate180(array));;
        }

        private static int[,] RotateArrayRow(int[,] array){
            int x = array.GetLength(1);
            int y = array.GetLength(0);
            int[,] temp = new int[y,x];
            for(int i=0; i<y; i++)
            {
                for(int j=0; j<x; j++)
                {
                    temp[i,x-j-1] = array[i,j];
                }
            }
            return temp;
        }

        public static int[,] Transpose(int[,] array){
            int x = array.GetLength(1);
            int y = array.GetLength(0);
            int[,] temp = new int[x,y];

            for(int i=0; i<y;i++){
                for(int j=0; j<x; j++){
                    temp[j,i] = array[i,j];
                }
            }

            return temp;
        }

        public static void Log(int[,] array){
            for(int i=0; i<array.GetLength(0); i++)
            {
                string line = "";
                for(int j=0; j<array.GetLength(1); j++)
                {
                    line += array[i,j] + " ";
                }
                Debug.Log(line);
            }
        }
    }
}

【讨论】:

    【解决方案2】:

    首先要考虑的一件事是,要旋转对象,您只需要实现一个旋转功能:在一个方向上旋转 90 度。其他旋转只需重复此操作 2 或 3 次,简化您的逻辑。

    您需要考虑从原始数组到旋转数组的两种映射:

    1. 尺寸如何映射?
    2. 索引如何映射?

    1 很简单:交换尺寸。旋转的 1x4 变成 4x1。

    2 取决于您的实现,但如果您使用 2d 坐标 [x, y] =&gt; [y, -x] or [-y, x] 取决于旋转方向。

    【讨论】:

    • 我已经使用了这种方法,并在此处的另一个板上实现了它,但感谢您的回复:)
    猜你喜欢
    • 2021-11-02
    • 2019-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-07
    相关资源
    最近更新 更多