<p>好吧,我认为这是最好的选择,而不是一些替代方案。会让每个人都保持最新,如果这是有效的或不。在</p>
<p>全局单击变量在dict中存储数据
对象的图层变量范围从1到?从最低层到最高层(类似于html zIndex)</p>
<ol>
<li>一回路
<ol>
<li>重置全局单击变量</li>
<li>单击事件获取位置</li>
</ol></li>
<li>在可单击的对象上循环以获得鼠标下的所有内容
<ol>
<li>循环鼠标下的所有内容以获得最高层</li>
<li>返回全局单击变量</li>
</ol></li>
<li>在对象中运行单击代码。在</li>
</ol>
<p>当前可以修改的层组织。在</p>
<p>佐尔德层</p>
<ol>
<li>背景</li>
<li>不适用</li>
<li>瓷砖</li>
<li>平铺选择器</li>
<li>不适用</li>
<li>不适用</li>
<li>面板</li>
<li>主菜单</li>
<li>GUI按钮</li>
<li>不适用</li>
</ol>
<p><strong>循环</strong></p>
<pre><code>for i in range(len(self.OBJECTS)):
#img = Texture(see op)
img = self.OBJECTS[i].IMAGE
print(img)
e = None
if self.OBJECTS[i].zOrder == 4: # is isometric image
# tx and ty are translated positions for screen2iso. See Below
if ((self.tx >= 0 and self.tx < self.SETTING['MAP_WIDTH']) and (self.ty >= 0 and self.ty < self.SETTING['MAP_HEIGHT'])):
# map_x and map_y are starting points for the map its self.
ix, iy = self.screen2iso(
(x - (self.map_x + (self.SETTING['TILE_WIDTH'] / 2))),
(y - (self.map_y))
)
imgx, imgy = self.screen2iso(
(img.x - (self.map_x + (self.SETTING['TILE_WIDTH'] / 2))),
(img.y - (self.map_y))
)
if (imgx+2) == ix:
if (imgy+1) == iy:
e = self.OBJECTS[i]
else:
continue
else:
continue
else: # Not an isometric image
if x > img.x and x < (img.x + img.rect[2]):
if y > img.y and y < (img.y + img.rect[3]):
#is click inside of visual area of image?
if self.getCordInImage(x, y, self.OBJECTS[i].IMAGE):
if self.getAlphaOfPixel(self.OBJECTS[i]) != 0:
e = self.OBJECTS[i]
else:
continue
else:
continue
else:
continue
if e != None:
if self.CLICKED['zOrder'] < e.getZ():
self.CLICKED['zOrder'] = e.getZ()
self.CLICKED['e'] = e
else:
continue
else:
continue
</code></pre>
<p><strong>获取索引</strong></p>
^{pr2}$
<p><strong>获取AlphaOfPixel</strong></p>
<pre><code>def getAlphaOfPixel(self, t):
mx,my = pygame.mouse.get_pos()
x,y = self.getCordInImage(mx,my,t.IMAGE)
#mask = pygame.mask.from_surface(t.IMAGE.image)
return t.IMAGE.image.get_at([x,y])[3]
</code></pre>
<p><strong>屏幕2iso</strong></p>
<pre><code>def screen2iso(self, x, y):
x = x / 2
xx = (y + x) / (self.SETTING['TILE_WIDTH'] / 2)
yy = (y - x) / (self.SETTING['TILE_WIDTH'] / 2)
return xx, yy
</code></pre>
<p><strong>iso2screen</strong></p>
<pre><code>def iso2screen(self, x, y):
xx = (x - y) * (self.SETTING['TILE_WIDTH'] / 2)
yy = (x + y) * (self.SETTING['TILE_HEIGHT'] / 2)
return xx, yy
</code></pre>