Continue working on spritesheet generator
This commit is contained in:
@ -21,7 +21,7 @@ export default class ToggleFogCommand extends BaseEvent {
|
||||
|
||||
const args = ChatService.getArgs('fog', data.message)
|
||||
|
||||
await WeatherManager.setFogValue(args![0] ? Number(args![0]) : null);
|
||||
await WeatherManager.setFogValue(args![0] ? Number(args![0]) : null)
|
||||
callback(true)
|
||||
} catch (error: any) {
|
||||
this.logger.error('command error', error.message)
|
||||
|
@ -21,7 +21,7 @@ export default class ToggleRainCommand extends BaseEvent {
|
||||
|
||||
let args = ChatService.getArgs('rain', data.message)
|
||||
|
||||
await WeatherManager.setRainValue(args![0] ? Number(args![0]) : null);
|
||||
await WeatherManager.setRainValue(args![0] ? Number(args![0]) : null)
|
||||
callback(true)
|
||||
} catch (error: any) {
|
||||
this.logger.error('command error', error.message)
|
||||
|
@ -1,6 +1,8 @@
|
||||
import { BaseEvent } from '#application/base/baseEvent'
|
||||
import { UUID } from '#application/types'
|
||||
import SpriteRepository from '#repositories/spriteRepository'
|
||||
import { SpriteAction } from '#entities/spriteAction'
|
||||
import sharp from 'sharp'
|
||||
|
||||
type Payload = {
|
||||
id: UUID
|
||||
@ -27,13 +29,35 @@ export default class SpriteUpdateEvent extends BaseEvent {
|
||||
const sprite = await spriteRepository.getById(data.id)
|
||||
if (!sprite) return callback(false)
|
||||
|
||||
await spriteRepository.getEntityManager().populate(sprite, ['spriteActions']);
|
||||
await spriteRepository.getEntityManager().populate(sprite, ['spriteActions'])
|
||||
|
||||
// Update sprite in database
|
||||
await sprite
|
||||
.setName(data.name)
|
||||
.setSpriteActions(data.spriteActions)
|
||||
.save()
|
||||
await sprite.setName(data.name).save()
|
||||
|
||||
const existingActions = sprite.getSpriteActions()
|
||||
|
||||
// Remove all existing actions - we'll recreate the ones we need
|
||||
for (const existingAction of existingActions) {
|
||||
await spriteRepository.getEntityManager().removeAndFlush(existingAction)
|
||||
}
|
||||
|
||||
// Create new actions
|
||||
for (const actionData of data.spriteActions) {
|
||||
const spriteAction = new SpriteAction()
|
||||
spriteAction.setSprite(sprite)
|
||||
sprite.getSpriteActions().add(spriteAction)
|
||||
|
||||
spriteAction
|
||||
.setAction(actionData.action)
|
||||
.setSprites(actionData.sprites)
|
||||
.setOriginX(actionData.originX)
|
||||
.setOriginY(actionData.originY)
|
||||
.setFrameWidth(await this.calculateWidth(actionData.sprites[0]))
|
||||
.setFrameHeight(await this.calculateHeight(actionData.sprites[0]))
|
||||
.setFrameRate(actionData.frameRate)
|
||||
|
||||
await spriteRepository.getEntityManager().persistAndFlush(spriteAction)
|
||||
}
|
||||
|
||||
return callback(true)
|
||||
} catch (error) {
|
||||
@ -41,4 +65,28 @@ export default class SpriteUpdateEvent extends BaseEvent {
|
||||
return callback(false)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private async calculateWidth(base64: string): Promise<number> {
|
||||
const uri = base64.split(';base64,').pop()
|
||||
if (!uri) return 0
|
||||
|
||||
const imgBuffer = Buffer.from(uri, 'base64')
|
||||
const image = await sharp(imgBuffer).metadata()
|
||||
return image.width ?? 0
|
||||
}
|
||||
|
||||
private async calculateHeight(base64: string): Promise<number> {
|
||||
const uri = base64.split(';base64,').pop()
|
||||
if (!uri) return 0
|
||||
|
||||
const imgBuffer = Buffer.from(uri, 'base64')
|
||||
const image = await sharp(imgBuffer).metadata()
|
||||
return image.height ?? 0
|
||||
}
|
||||
|
||||
private generateSpriteSheet(sprites: string[]) {
|
||||
// In here comes a function that generates a sprite sheet from the given sprites using Sharp.
|
||||
// This function takes an array of base64 encoded sprites and generates a single png sprite sheet.
|
||||
// Then proceeds to save ths sprite sheet to the public/sprites/{spriteId}/ directory. The file name is {action}.png.
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user