⚠️ The most important rule
Why your component does not show up.
This is the cause of “I placed my image and I can't see it”.
A view only draws two things:
- its reserved components, which it builds itself;
- the components marked
extra="true".A free component without
extranever shows up.
<view name="system">
<image name="mon-decor" extra="true"> <!-- ✅ shows -->
<path>${root}/data/arts/decor.png</path>
</image>
<image name="autre-decor"> <!-- ❌ invisible -->
<path>${root}/data/arts/decor.png</path>
</image>
</view>
The other, equivalent way is to group them:
<view name="system">
<extras>
<image name="mon-decor"> … </image>
<text name="ma-legende"> … </text>
</extras>
</view>
Only SIX types can be placed freely
The free-component factory only knows how to build these:
✅ Usable as extra | ❌ Refused |
|---|---|
image · box · video · text · scrolltext · markdown | textlist · carousel · datetime · rating · sound · helpsystem · keyboard · container · ninepatch · all the menu* |
A refused type writes Extra type unknown: Rating to the log and nothing is drawn.
➡️ rating, datetime, textlist and carousel are only used under their reserved name, in a view that expects them. You cannot add a second rating or a second list.
➡️ ninepatch has no reserved name anywhere: refused as a free component, and no view builds it. It is therefore unusable in practice, despite being present in the engine.
➡️ container is not placed either, but it is not useless: the engine applies it on top of another component. In the game list, md_description declared as a <text> also sets the scrolling frame around it — pos, size and zIndex go to the frame, the rest to the text. You never write it yourself.
Three other limits
- only one
<video>per view — the second is ignored without a message; - an extra gets a
zIndexof 10 by default; - extras are sorted by
zIndexbefore display.
The exception
helpsystem keeps working even written inside an <extras> block: the view finds it back by its name. The log warning has no consequence.