From 960faa653938a59f97950cf7e78f71a256c2a22f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E4=B9=8B=E9=98=B3?= <51194195+luoliwoshang@users.noreply.github.com> Date: Thu, 7 Mar 2024 11:15:23 +0800 Subject: [PATCH] feat: add default sprite in default project (#151) * feat:add default sprite in default project * feat:add 'Update zorder when editing sprite list' logic to SpriteList * docs:add comment of costume position * fix:modify the use of removing and adding spriteList --- spx-gui/src/assets/image/default_sprite.png | Bin 0 -> 24443 bytes spx-gui/src/class/asset-list.ts | 27 ++++++++++++++++++-- spx-gui/src/class/project.ts | 22 +++++++++++----- spx-gui/src/store/modules/sprite/index.ts | 14 +++------- 4 files changed, 45 insertions(+), 18 deletions(-) create mode 100644 spx-gui/src/assets/image/default_sprite.png diff --git a/spx-gui/src/assets/image/default_sprite.png b/spx-gui/src/assets/image/default_sprite.png new file mode 100644 index 0000000000000000000000000000000000000000..24147724234e7147be07e9a0b85c1cc8bbdef976 GIT binary patch literal 24443 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

@bqd&pL)`+sikKuy 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 { public list: T[] = []; @@ -22,6 +22,29 @@ export abstract class AssetList { } } -export class SpriteList extends AssetList { } +export class SpriteList extends AssetList { + project: Project + + constructor(project: Project) { + super() + this.project = project + } + add(...sprites: Sprite[]): void { + super.add(...sprites) + sprites.forEach((sprite) => { + this.project.backdrop.config.zorder.push(sprite.name) + }) + } + remove(sprite: Sprite | string): Sprite | null { + const removeSprite = typeof sprite === 'string' ? super.remove(sprite) : super.remove(sprite) + if (removeSprite) { + const index = this.project.backdrop.config.zorder.indexOf(removeSprite) + if (index !== -1) { + this.project.backdrop.config.zorder.splice(index, 1) + } + } + return removeSprite + } +} export class SoundList extends AssetList { } \ No newline at end of file diff --git a/spx-gui/src/class/project.ts b/spx-gui/src/class/project.ts index ad2785127..0490d1575 100644 --- a/spx-gui/src/class/project.ts +++ b/spx-gui/src/class/project.ts @@ -16,7 +16,8 @@ import { Sprite } from './sprite' import { Sound } from './sound' import type { Config } from '@/interface/file' import FileWithUrl from '@/class/file-with-url' -import defaultScene from '@/assets/image/default_scene.png' +import defaultSceneImage from '@/assets/image/default_scene.png' +import defaultSpriteImage from '@/assets/image/default_sprite.png' export enum ProjectSource { local, cloud @@ -133,9 +134,10 @@ export class Project implements ProjectDetail, ProjectSummary { constructor() { this.name = '' - this.sprite = new SpriteList() this.sound = new SoundList() this.backdrop = new Backdrop() + this.sprite = new SpriteList(this) + this.sound = new SoundList() this.entryCode = '' this.unidentifiedFile = {} this._temporaryId = Project.TEMPORARY_ID_PREFIX + nanoid() @@ -246,12 +248,20 @@ export class Project implements ProjectDetail, ProjectSummary { async loadBlankProject() { this.name = 'Untitled' - const response = await fetch(defaultScene) - const blob = await response.blob() - const file = new File([blob], 'default_scene.png', { type: blob.type }) + const sceneBlob = await (await fetch(defaultSceneImage)).blob() + const spriteBlob = await (await fetch(defaultSpriteImage)).blob() + const sceneFile = new File([sceneBlob], 'default_scene.png', { type: sceneBlob.type }) + const spriteFile = new File([spriteBlob], 'default_sprite.png', { type: spriteBlob.type }) this.backdrop.addScene([ - { name: 'default_scene', file: new FileWithUrl(file, URL.createObjectURL(file)) } + { name: 'default_scene', file: new FileWithUrl(sceneFile, URL.createObjectURL(sceneFile)) } ]) + const defaultSprite = new Sprite('default_sprite', [spriteFile]) + defaultSprite.config.size = 1 + // The size of the costume is 110 * 100, so setting the center point of the image to half of its height and width + // can make the costume of sprite render at the center point of the stage. + defaultSprite.config.costumes[0].x=55 + defaultSprite.config.costumes[0].y=50 + this.sprite.add(defaultSprite) } diff --git a/spx-gui/src/store/modules/sprite/index.ts b/spx-gui/src/store/modules/sprite/index.ts index 6051317e1..7ac35ae33 100644 --- a/spx-gui/src/store/modules/sprite/index.ts +++ b/spx-gui/src/store/modules/sprite/index.ts @@ -2,8 +2,8 @@ * @Author: Zhang Zhi Yang * @Date: 2024-02-07 21:43:44 * @LastEditors: Zhang Zhi Yang - * @LastEditTime: 2024-03-04 14:22:36 - * @FilePath: \builder\spx-gui\src\store\modules\sprite\index.ts + * @LastEditTime: 2024-03-07 11:05:21 + * @FilePath: \spx-gui\src\store\modules\sprite\index.ts * @Description: */ import { defineStore, storeToRefs } from 'pinia' @@ -26,14 +26,13 @@ export const useSpriteStore = defineStore('sprite', () => { watch( () => project.value, () => { - console.log("current clear") + console.log('current clear') current.value = null } ) + function addItem(item: Sprite) { project.value.sprite.add(item) - // TODO: consider the zorder update dependent on the addition and removal of sprite in project instance instead operate in sprite store's add/remove function - project.value.backdrop.config.zorder.push(item.name) } function setCurrentByName(name: string) { @@ -49,11 +48,6 @@ export const useSpriteStore = defineStore('sprite', () => { current.value = list.value[0] || null } project.value.sprite.remove(sprite) - // TODO: consider the zorder update dependent on the addition and removal of sprite in project instance instead operate in sprite store's add/remove function - project.value.backdrop.config.zorder.splice( - project.value.backdrop.config.zorder.indexOf(sprite.name), - 1 - ) } }