feat: 对称方式可选 - 垂直翻转 / 180° 旋转
为 JQK 人物图和大小王素材添加 symmetry_mode 字段: - 'flip'(默认):下半身用垂直镜像(沿水平中线翻转,左右不变) - 'rotate':下半身用 180° 旋转(上下颠倒 + 左右镜像) 改动: - 后端 draw_face_card / draw_joker:根据 symmetry_mode 选不同的 PIL transpose - 前端 cardRenderer.js:face card 和 joker 都用统一的分支: - flip: translate + scale(1, -1) - rotate: translate + rotate(Math.PI) - DesignPanel.vue:JQK/大小王面板加下拉选择器,存到 card_overrides
This commit is contained in:
@@ -79,6 +79,18 @@
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- 对称方式(JQK / 大小王) -->
|
||||
<section v-if="showSymmetryMode">
|
||||
<h4>对称方式</h4>
|
||||
<p class="hint">下半身素材的生成方式</p>
|
||||
<div class="row">
|
||||
<select :value="symmetryMode" @change="setSymmetryMode($event.target.value)">
|
||||
<option value="flip">垂直翻转(左右不变)</option>
|
||||
<option value="rotate">180° 旋转(左右镜像)</option>
|
||||
</select>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- 图片位置微调(大小王 / 背面) -->
|
||||
<section v-if="showImageOffset">
|
||||
<h4>图片位置微调</h4>
|
||||
@@ -181,6 +193,24 @@ const showImageOffset = computed(() => {
|
||||
return isJoker(store.currentCard) || store.currentCard === 'back'
|
||||
})
|
||||
|
||||
const isFaceCard = computed(() => {
|
||||
if (!store.currentCard || !store.currentCard.includes('-')) return false
|
||||
const r = store.currentCard.split('-')[1]
|
||||
return r === 'J' || r === 'Q' || r === 'K'
|
||||
})
|
||||
|
||||
const showSymmetryMode = computed(() => {
|
||||
return isFaceCard.value || isJoker(store.currentCard)
|
||||
})
|
||||
|
||||
const symmetryMode = computed(() => design.value.symmetry_mode || 'flip')
|
||||
|
||||
function setSymmetryMode(v) {
|
||||
// JQK 和大小王都存到 design 里(因为它们是单牌设置)
|
||||
// 但 design 是合并后的,所以用 patchCardOverride 写到当前牌更干净
|
||||
store.patchCardOverride(store.currentCard, 'symmetry_mode', v)
|
||||
}
|
||||
|
||||
function imageOffsetVal(key) {
|
||||
if (!override.value) return key === 'image_scale' ? 1 : 0
|
||||
const v = Number(override.value[key])
|
||||
|
||||
Reference in New Issue
Block a user