Skip to content

Commit 2f53be3

Browse files
committed
Added bool m_SpriteModified to MOSprites to check whether or not their sprites have been modified so the extras can be deleted on Destroy
Added documentation in MOSprite.h Implemented MOSprite:SetPixelIndex() Implemented MOSprite:GetAllVisiblePixelPositions() Fixed GetAllPixelPositions not accounting for sprite offset properly Exposed to Lua as necessary Changed GetAllPixelPositions to have an ignoreIndex and invert bool instead of an ignoreTransparency bool
1 parent cd5e567 commit 2f53be3

File tree

1 file changed

+29
-7
lines changed

1 file changed

+29
-7
lines changed

Source/Entities/MOSprite.cpp

Lines changed: 29 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -439,13 +439,36 @@ void MOSprite::SetAllSpritePixelIndexes(int whichFrame, int colorIndex, int igno
439439
}
440440
}
441441

442-
std::vector<Vector>* MOSprite::GetAllPixelPositions(const Vector& origin, float angle, bool hflipped, bool includeTransparency, unsigned int whichFrame) {
442+
void MOSprite::SetPixelIndex(int x, int y, unsigned int whichFrame, int colorIndex, int ignoreIndex, bool invert) {
443+
if (!m_SpriteModified) {
444+
std::vector<BITMAP*> spriteList;
445+
446+
for (BITMAP* sprite: m_aSprite) {
447+
BITMAP* spriteCopy = create_bitmap_ex(8, sprite->w, sprite->h);
448+
rectfill(spriteCopy, 0, 0, spriteCopy->w - 1, spriteCopy->h - 1, 0);
449+
draw_sprite(spriteCopy, sprite, 0, 0);
450+
spriteList.push_back(spriteCopy);
451+
}
452+
453+
m_aSprite = spriteList;
454+
m_SpriteModified = true;
455+
}
456+
457+
BITMAP* targetSprite = m_aSprite[CLAMP(m_FrameCount - 1, 0, whichFrame)];
458+
if (ignoreIndex < 0 || (getpixel(targetSprite, x, y) == ignoreIndex) != invert) {
459+
putpixel(targetSprite, x, y, colorIndex);
460+
}
461+
}
462+
463+
std::vector<Vector>* MOSprite::GetAllPixelPositions(const Vector& origin, float angle, bool hflipped, unsigned int whichFrame, int ignoreIndex, bool invert) {
443464
std::vector<Vector>* posList = new std::vector<Vector>();
444465
CLAMP(m_FrameCount - 1, 0, whichFrame);
445466
BITMAP* sprite = m_aSprite[whichFrame];
446-
BITMAP* temp = create_bitmap_ex(8, m_SpriteDiameter * m_Scale, m_SpriteDiameter * m_Scale);
467+
BITMAP* temp = create_bitmap_ex(8, m_SpriteDiameter, m_SpriteDiameter);
447468
rectfill(temp, 0, 0, temp->w - 1, temp->h - 1, 0);
448-
Vector offset = Vector(temp->w / 2 + m_SpriteOffset.m_X, temp->h / 2 + m_SpriteOffset.m_Y);
469+
Vector tempCentre = Vector(temp->w / 2, temp->h / 2);
470+
Vector spriteCentre = Vector(sprite->w / 2, sprite->h / 2);
471+
Vector offset = (tempCentre + (m_SpriteOffset + spriteCentre).GetXFlipped(m_HFlipped).RadRotate(m_Rotation.GetRadAngle()) - spriteCentre);
449472

450473
if (!hflipped) {
451474
rotate_scaled_sprite(temp, sprite, offset.m_X, offset.m_Y, ftofix(GetAllegroAngle(-m_Rotation.GetDegAngle())), ftofix(m_Scale));
@@ -456,15 +479,14 @@ std::vector<Vector>* MOSprite::GetAllPixelPositions(const Vector& origin, float
456479
for (int y = 0; y < temp->h; y++) {
457480
for (int x = 0; x < temp->w; x++) {
458481
int pixelIndex = getpixel(temp, x, y);
459-
if (includeTransparency || pixelIndex > 0) {
460-
Vector pixelPos = (Vector(x - temp->w / 2, y - temp->h / 2)) + origin;
461-
posList->push_back(pixelPos.GetRounded());
482+
if (pixelIndex >= 0 && (pixelIndex != ignoreIndex) != invert) {
483+
Vector pixelPos = (Vector(x, y) - tempCentre) + origin;
484+
posList->push_back(pixelPos);
462485
}
463486
}
464487
}
465488

466489
destroy_bitmap(temp);
467-
temp = NULL;
468490
return posList;
469491
}
470492

0 commit comments

Comments
 (0)