Fix collision mask when adding new sprites with default, full image mask (#5523)

This commit is contained in:
Clément Pasteau
2023-07-31 17:17:39 +02:00
committed by GitHub
parent fa003374ba
commit 56c2aa0dc6
2 changed files with 37 additions and 0 deletions

View File

@@ -13,6 +13,7 @@ import {
allDirectionSpritesHaveSameCollisionMasksAs,
deleteSpritesFromAnimation,
duplicateSpritesInAnimation,
isFirstSpriteUsingFullImageCollisionMask,
} from './Utils/SpriteObjectHelper';
import ResourcesLoader from '../../../ResourcesLoader';
import {
@@ -295,6 +296,9 @@ const SpritesList = ({
allDirectionSpritesHaveSameCollisionMasks,
allDirectionSpritesHaveSamePoints,
} = checkDirectionPointsAndCollisionsMasks(direction);
const shouldUseFullImageCollisionMask = isFirstSpriteUsingFullImageCollisionMask(
spriteConfiguration
);
const spritesCountBeforeAdding = direction.getSpritesCount();
const resources = await resourceManagementProps.onChooseResource({
@@ -315,6 +319,9 @@ const SpritesList = ({
if (allDirectionSpritesHaveSameCollisionMasks) {
copySpritePolygons(direction.getSprite(0), sprite);
}
if (shouldUseFullImageCollisionMask) {
sprite.setFullImageCollisionMask(true);
}
onSpriteAdded(sprite); // Call the callback before `addSprite`, as `addSprite` will store a copy of it.
direction.addSprite(sprite);
sprite.delete();
@@ -342,6 +349,7 @@ const SpritesList = ({
onSpriteUpdated,
onSpriteAdded,
onFirstSpriteUpdated,
spriteConfiguration,
]
);
@@ -355,6 +363,9 @@ const SpritesList = ({
allDirectionSpritesHaveSameCollisionMasks,
allDirectionSpritesHaveSamePoints,
} = checkDirectionPointsAndCollisionsMasks(direction);
const shouldUseFullImageCollisionMask = isFirstSpriteUsingFullImageCollisionMask(
spriteConfiguration
);
try {
setExternalEditorOpened(true);
@@ -409,6 +420,9 @@ const SpritesList = ({
copySpritePolygons(direction.getSprite(0), sprite);
}
}
if (shouldUseFullImageCollisionMask) {
sprite.setFullImageCollisionMask(true);
}
onSpriteAdded(sprite); // Call the callback before `addSprite`, as `addSprite` will store a copy of it.
newDirection.addSprite(sprite);
sprite.delete();
@@ -457,6 +471,7 @@ const SpritesList = ({
resourceManagementProps,
resourcesLoader,
onChangeName,
spriteConfiguration,
]
);

View File

@@ -275,6 +275,28 @@ export const allSpritesHaveSameCollisionMasksAs = (
);
};
export const isFirstSpriteUsingFullImageCollisionMask = (
spriteObject: gdSpriteObject
) => {
if (
spriteObject.getAnimationsCount() > 0 &&
spriteObject.getAnimation(0).getDirectionsCount() > 0 &&
spriteObject
.getAnimation(0)
.getDirection(0)
.getSpritesCount() > 0
) {
// We look at the first sprite of the first animation as the reference.
const firstSprite = spriteObject
.getAnimation(0)
.getDirection(0)
.getSprite(0);
return firstSprite.isFullImageCollisionMask();
}
return false;
};
export const deleteSpritesFromAnimation = (
animation: gdAnimation,
spritePtrs: {