我在QML中有一个XmlListModel
XmlListModel {
id: model
source: "qrc:/Config/myConfig.xml"
query: "/levels/level"
XmlRole { name: "levName"; query: "@levName/string()" }
XmlRole { name: "from"; query: "from/number()" }
XmlRole { name: "to"; query: "to/number()" }
}
读取此XML文件
<levels parId = "3">
<level levelName = "level1">
<from>0</from>
<to>1</to
</level>
<level levelName = "level2">
<from>1</from>
<to>2</to>
</level>
</levels>
我还有一个文本元素:
Text {
id: myText
x: 0; y:0
text: ""
}
我需要遍历XmlListModel
,以便根据我在myText.text
中找到的内容myList.get(3).value
分配myList
,其中ListModel
是{ {1}}。
例:
如果myList.get(3).value
介于0
(已包含)和1
之间(已排除),则必须设置myText.text = "level1"
,如果它位于1
(已包含)和{{之间1}}(已排除)我必须设置2
,依此类推......
有什么建议吗?
答案 0 :(得分:0)
很遗憾,您无法像give me the value, where x is between role from and role to
那样在XmlListModel
中查询您的XmlListModel。
对您有好处,您有一个有序列表,因此您可以在O(log n)
上执行二进制搜索。算法基本上是这样的:
首先检查您的搜索值是否与中间的搜索值重合。如果它较小,则在下半部分的中间搜索,如果它较大,则在上半部分搜索......依此类推。
有了这个,您可以在n
中找到自己的价值,其中XmlListModel
是Text {
text: binarySearch(model, myList.get(3).value).levName
}
中的条目数。
https://docs.unity3d.com/ScriptReference/Material.SetFloat.html
如果您已实现此功能,则可以使用JavaScript或C ++或Python来处理您的模型......您可以这样:
for(int x=0;x<mapX;x++){
for(int y=mapY-1;y>-1;y--){
try{
if(map[x][y] instanceof LightSource)
lightmap[x][y]=19;
else{
else{
if(x-1>-1&&lightmap[x][y]<lightmap[x-1][y])
lightmap[x][y]=lightmap[x-1][y]-map[x][y].translucency;
if(x+1<lv.map.length-1&&lightmap[x][y]<lightmap[x+1][y])
lightmap[x][y]=lightmap[x+1][y]-map[x][y].translucency;
if(y+1<lv.map[0].length-1&&lightmap[x][y]<lightmap[x][y+1])
lightmap[x][y]=lightmap[x][y+1]-map[x][y].translucency;
if(y-1>0&&lightmap[x][y]<lightmap[x][y-1])
lightmap[x][y]=lightmap[x][y-1]-map[x][y].translucency;
}
}
}catch(Exception e){}
}
}
实施此算法时,请务必处理差距。