我知道通过atlas://
网址表示法可以使用地图集文件。这就是我们可以使用的代替文件名来应用地图集中的纹理。但是atlas
模块中的文档中还有另一部分,其中显示了创建实际Atlas
对象的方式,其中包含.atlas
文件的路径:
atl = Atlas('path/to/atlas')
然后我们可以对该对象执行纹理查找。根据我的期望,以下声明被认为是有效的:
Button(background_normal = atl['some_texture'])
但显然Atlas
对象上的查找会返回TextureRegion
,而不能使用atlas://
代替背景文件名。
我不坚持.format
符号的原因是我希望我的应用程序有多个主题。构建" URL"对于每个纹理(Atlas
或字符串连接)似乎是一个非常糟糕的解决方案,所以我想知道我是否可以使用class TextureResolver:
def __init__(self, atlas_path):
# atlas_path should be given without '.atlas'
self.atlas_path = 'atlas://' + atlas_path + '/'
def __getitem__(self, key):
return self.atlas_path + key
个对象来实现我的目标。
当前解决方法:创建一个自动构造给定纹理名称的URL的对象
<?php
/**
* @param string $url
* @param array $rewrites
*
* @return array
*/
function get_info(string $url, array $rewrites): array
{
$patterns = [
'original' => [],
'named' => [],
];
foreach (array_keys($rewrites) as $key => $pattern) {
$index = "pattern_{$key}";
$patterns ['original'][$index] = $pattern;
$patterns ['named'][$index] = "(?P<{$index}>{$pattern})";
}
$patternsString = '#(' . implode('|', $patterns['named']) . ')#';
$matches = [];
preg_match_all($patternsString, $url, $matches);
$matchedPatterns = [];
if (count($matches) > 0) {
foreach ($matches as $key => $match) {
if (key_exists($key, $patterns['named'])
&& count($match) > 0
&& !empty($match[0])) {
$matchedPatterns [] = $rewrites[$patterns['original'][$key]];
}
}
}
return $matchedPatterns;
}
$rewrites = [
'item[0-9].html' => ['target' => 'http://example.com'],
'-item.html' => ['target' => 'http://example1.com'],
];
$testData = [
'item1.html' => [['target' => 'http://example.com']],
'-item.html' => [['target' => 'http://example1.com']],
];
foreach ($testData as $key => $datum) {
$output = get_info($key, $rewrites);
assert($datum == $output, sprintf("\"%s\" has wrong matches.", $key));
}
答案 0 :(得分:-1)
import os
path = os.path.dirname(__file__)
atlas_path = os.path.join(path, 'atlas/')
Atlas('{}key.atlas'.format(atlas_path))