圣者
精华
|
战斗力 鹅
|
回帖 0
注册时间 2005-8-12
|
我想了一下,确实是一个问题。
那这样的话,就只能在高度方面,也按镜头深度Z的顺序来绘制了。
对于一个3层3X3的例子来说,绘制顺序就是:
第一层
[ 1, 3, 7],
[ 2, 6, 12],
[ 5, 11, 18],
第二层
[ 4, 9, 15],
[ 8, 14, 20],
[13, 19, 24],
第三层
[10, 17, 23],
[16, 22, 26],
[21, 25, 27],
考虑主角在正中间14图块的位置,要移往19图块。
动画就应该使用绘制顺序(14+19)/2,也就是16.5。
遮挡方面:
16.5>11>6,所以能遮住下层地面;
16.5<22<25,所以不会被上层天顶挡住;
横向的交叉处的遮挡方面:
20>16.5>13,就像前面帖子里分析的也没有问题。
至于如何实现这个动画取中值绘制顺序的问题,
我来做的话,为了避免低效率的动态排序,会预先静态计算出动画时的绘制顺序。
因此干脆直接将3X3X3扩展成5X5X5:
[[[ 1. 3. 7. 14. 25.]
[ 2. 6. 13. 24. 39.]
[ 5. 12. 23. 38. 56.]
[ 11. 22. 37. 55. 74.]
[ 21. 36. 54. 73. 91.]]
[[ 4. 9. 17. 29. 44.]
[ 8. 16. 28. 43. 60.]
[ 15. 27. 42. 59. 77.]
[ 26. 41. 58. 76. 93.]
[ 40. 57. 75. 92. 106.]]
[[ 10. 19. 32. 48. 65.]
[ 18. 31. 47. 64. 81.]
[ 30. 46. 63. 80. 96.]
[ 45. 62. 79. 95. 108.]
[ 61. 78. 94. 107. 116.]]
[[ 20. 34. 51. 69. 86.]
[ 33. 50. 68. 85. 100.]
[ 49. 67. 84. 99. 111.]
[ 66. 83. 98. 110. 118.]
[ 82. 97. 109. 117. 122.]]
[[ 35. 53. 72. 90. 105.]
[ 52. 71. 89. 104. 115.]
[ 70. 88. 103. 114. 121.]
[ 87. 102. 113. 120. 124.]
[101. 112. 119. 123. 125.]]]
其中,奇数层奇数行奇数列,表示静态图块的绘制顺序,
而偶数层偶数行偶数列,表示其相邻的2个静态图块之间的移动动画的绘制顺序。
还是上面的例子,正中间的图块63,向下移动到图块94时,就应该使用其中间的图块79作为绘制顺序。
附上个这种顺序生成的示例代码:
- #! python3
- # coding: utf-8
- import numpy as np
- def order3(max_x, max_y, max_h):
- arr = np.zeros([max_h, max_y, max_x])
- depth = 0
- idx = 1
- while depth <= max_x + max_y + max_h - 3:
- for h in range(max_h):
- for x in range(max_x):
- y = depth - h - x
- if not 0 <= y < max_y:
- continue
- arr[h][y][x] = idx
- idx += 1
- depth += 1
- return arr
- if __name__ == '__main__':
- arr3 = order3(3, 3, 3)
- print('3 x 3 x 3')
- print(arr3)
- arr5 = order3(5, 5, 5)
- print('5 x 5 x 5')
- print(arr5)
-
复制代码
|
|