【问题标题】:How to programmatically center align drawn objects in a specific way如何以特定方式以编程方式居中对齐绘制的对象
【发布时间】:2019-01-05 15:47:42
【问题描述】:

如果你听说过这个,请阻止我。

所以,我在屏幕上有一艘船(在此处使用 Android Java),用于我自己的 Galaga 版本。在我的版本中可能有不止一艘被捕获的船,它们移动到玩家船的前面以充当肉盾。

问题是试图让他们坐好。我可以拥有任意数量的船只,因此我想确保我可以根据玩家连接到它们的数量来动态排列它们。

当存在一艘被捕获的船时,它可以与玩家船对齐。

当出现偶数艘捕获的船只时,它们会均匀地分布在玩家船只正中心的一个中心点上,但它们会覆盖玩家。

Even Number of Captured Ships

当出现奇数艘被俘船只时,它们与玩家位置相同,然后整齐地坐在两边。

Odd Number of Captured Ships

有没有办法以编程方式做到这一点?这些船必须与玩家一起移动,因此尝试使用内置组或其他东西似乎并不明智。但如果我错过了 API 中有用的内容,请告诉我。

感谢阅读。我焦急地等待你的帮助。

【问题讨论】:

    标签: java android actor centering


    【解决方案1】:

    肯定有办法做到这一点,你只需要有创意。这是一些 Java 伪代码,可以满足您的要求。让mainX 是主飞船的 x 位置,numShips 是你拥有的护盾飞船的数量,shipLength 是飞船的水平长度(我假设它们都是一样的),让 shieldX[] 是盾牌飞船的 x 位置数组。然后,要使用您想要的值填充shieldX[] 的代码,我们有(还假设所有这些都是整数,但如果不是,则可以轻松更改。):

     // Assume numShips, mainX, and shipLength have already been declared 
     int[] shieldX = new int[numShips];
     // Determine if odd or even number of ships
     boolean isOdd = numShips % 2; 
     if (isOdd) {
         // Middle shield ship index will be aligned with main Ship
         int mid = (numShips - 1)/ 2;
         shieldX[mid] = mainX; 
         // Place the ships on right and left sequentially. 
         for (int i = 1; i <= mid; i++) {
             // Calculate offset for every pair of ships.
             int offset = i * shipLength;
             shieldX[mid - i] = mainX - offset;
             shieldX[mid + i] = mainX + offset;
         }
    } else {
        // First calculate the half length of the ships. 
        int half = shipLength / 2; 
        // Left Middle shield ship index will be half aligned with main Ship
        int midL = numShips / 2 - 1; 
        // Right middle shield ship index will be half aligned with main ship
        int midR = numShips / 2;
        // If we are even, then we can go straight into the for loops, similar to above
        for (int i = 0; i < midR; i++) {
            // Again calculate offset. This time include half lengths.
            int offsetL = i * shipLength + (shipLength / 2);
            // Now set values
            shieldX[midL - i] = mainX - offset;
            shieldX[midR + i] = mainX + offset;
        }
    }
    

    请注意,我写得有点快,还没有测试它(想相对快速地给你一个答案,如果我发现一个错误的错误或类似的东西,我会编辑答案),但是这个想法应该在那里。我希望我正在回答您的问题并且没有误解它,如果我这样做了,请告诉我。希望这会有所帮助!

    【讨论】:

    • 非常感谢。效果很好!我曾尝试做类似的事情,而且效果要好得多。一方面,它比我的数学更优雅。其中一些东西不是我最擅长的。我要坚持这个sn-p。在游戏游戏中还有其他地方有用。也几乎没有改变,主要是在这里和那里添加相关信息。
    • 是的,没问题,很高兴我能帮上忙。如果您对此还有其他问题,请告诉我。
    猜你喜欢
    • 2015-03-09
    • 1970-01-01
    • 1970-01-01
    • 2021-10-27
    • 2014-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-06
    相关资源
    最近更新 更多