Support spritesheets instead of individual frames for event object pics

This commit is contained in:
Marcus Huderle 2018-09-12 17:44:30 -05:00
parent 5e42b07bff
commit 23efdc2bea
5 changed files with 53 additions and 8 deletions

View file

@ -1653,6 +1653,7 @@ QList<DraggablePixmapItem *> *Editor::getObjects() {
void Editor::redrawObject(DraggablePixmapItem *item) { void Editor::redrawObject(DraggablePixmapItem *item) {
if (item) { if (item) {
item->setPixmap(item->event->pixmap); item->setPixmap(item->event->pixmap);
item->setShapeMode(QGraphicsPixmapItem::BoundingRectShape);
if (selected_events && selected_events->contains(item)) { if (selected_events && selected_events->contains(item)) {
QImage image = item->pixmap().toImage(); QImage image = item->pixmap().toImage();
QPainter painter(&image); QPainter painter(&image);

View file

@ -174,10 +174,8 @@ public:
int last_x; int last_x;
int last_y; int last_y;
void updatePosition() { void updatePosition() {
int x = event->x() * 16; int x = event->getPixelX();
int y = event->y() * 16; int y = event->getPixelY();
x -= pixmap().width() / 32 * 16;
y -= pixmap().height() - 16;
setX(x); setX(x);
setY(y); setY(y);
setZValue(event->y()); setZValue(event->y());
@ -193,6 +191,7 @@ public:
objects.append(event); objects.append(event);
event->pixmap = QPixmap(); event->pixmap = QPixmap();
editor->project->loadEventPixmaps(objects); editor->project->loadEventPixmaps(objects);
this->updatePosition();
editor->redrawObject(this); editor->redrawObject(this);
emit spriteChanged(event->pixmap); emit spriteChanged(event->pixmap);
} }

View file

@ -12,6 +12,8 @@ QString EventType::HealLocation = "event_heal_location";
Event::Event() Event::Event()
{ {
this->spriteWidth = 16;
this->spriteHeight = 16;
} }
Event* Event::createNewEvent(QString event_type, QString map_name) Event* Event::createNewEvent(QString event_type, QString map_name)
@ -126,6 +128,16 @@ Event* Event::createNewSecretBaseEvent()
return event; return event;
} }
int Event::getPixelX()
{
return (this->x() * 16) - qMax(0, (this->spriteWidth - 16) / 2);
}
int Event::getPixelY()
{
return (this->y() * 16) - qMax(0, this->spriteHeight - 16);
}
QString Event::buildObjectEventMacro(int item_index) QString Event::buildObjectEventMacro(int item_index)
{ {
int radius_x = this->getInt("radius_x"); int radius_x = this->getInt("radius_x");
@ -236,3 +248,13 @@ QString Event::buildSecretBaseEventMacro()
text += "\n"; text += "\n";
return text; return text;
} }
void Event::setPixmapFromSpritesheet(QImage spritesheet, int spriteWidth, int spriteHeight)
{
// Set first palette color fully transparent.
QImage img = spritesheet.copy(0, 0, spriteWidth, spriteHeight);
img.setColor(0, qRgba(0, 0, 0, 0));
pixmap = QPixmap::fromImage(img);
this->spriteWidth = spriteWidth;
this->spriteHeight = spriteHeight;
}

View file

@ -71,9 +71,14 @@ public:
QString buildSignEventMacro(); QString buildSignEventMacro();
QString buildHiddenItemEventMacro(); QString buildHiddenItemEventMacro();
QString buildSecretBaseEventMacro(); QString buildSecretBaseEventMacro();
void setPixmapFromSpritesheet(QImage, int, int);
int getPixelX();
int getPixelY();
QMap<QString, QString> values; QMap<QString, QString> values;
QPixmap pixmap; QPixmap pixmap;
int spriteWidth;
int spriteHeight;
}; };
#endif // EVENT_H #endif // EVENT_H

View file

@ -1292,6 +1292,9 @@ void Project::loadEventPixmaps(QList<Event*> objects) {
if (!object->pixmap.isNull()) { if (!object->pixmap.isNull()) {
continue; continue;
} }
object->spriteWidth = 16;
object->spriteHeight = 16;
QString event_type = object->get("event_type"); QString event_type = object->get("event_type");
if (event_type == EventType::Object) { if (event_type == EventType::Object) {
object->pixmap = QPixmap(":/images/Entities_16x16.png").copy(0, 0, 16, 16); object->pixmap = QPixmap(":/images/Entities_16x16.png").copy(0, 0, 16, 16);
@ -1309,16 +1312,31 @@ void Project::loadEventPixmaps(QList<Event*> objects) {
int sprite_id = constants.value(object->get("sprite")); int sprite_id = constants.value(object->get("sprite"));
QString info_label = pointers.value(sprite_id).replace("&", ""); QString info_label = pointers.value(sprite_id).replace("&", "");
QString pic_label = readCArray(info_text, info_label).value(14); QStringList gfx_info = readCArray(info_text, info_label);
QString pic_label = gfx_info.value(14);
QString dimensions_label = gfx_info.value(11);
QString subsprites_label = gfx_info.value(12);
QString gfx_label = readCArray(pic_text, pic_label).value(0); QString gfx_label = readCArray(pic_text, pic_label).value(0);
gfx_label = gfx_label.section(QRegExp("[\\(\\)]"), 1, 1); gfx_label = gfx_label.section(QRegExp("[\\(\\)]"), 1, 1);
QString path = readCIncbin(assets_text, gfx_label); QString path = readCIncbin(assets_text, gfx_label);
if (!path.isNull()) { if (!path.isNull()) {
path = fixGraphicPath(path); path = fixGraphicPath(path);
QPixmap pixmap(root + "/" + path); QImage spritesheet(root + "/" + path);
if (!pixmap.isNull()) { if (!spritesheet.isNull()) {
object->pixmap = pixmap; // Infer the sprite dimensions from the OAM labels.
int spriteWidth = spritesheet.width();
int spriteHeight = spritesheet.height();
QRegularExpression re("\\S+_(\\d+)x(\\d+)");
QRegularExpressionMatch dimensionMatch = re.match(dimensions_label);
if (dimensionMatch.hasMatch()) {
QRegularExpressionMatch oamTablesMatch = re.match(subsprites_label);
if (oamTablesMatch.hasMatch()) {
spriteWidth = dimensionMatch.captured(1).toInt();
spriteHeight = dimensionMatch.captured(2).toInt();
}
}
object->setPixmapFromSpritesheet(spritesheet, spriteWidth, spriteHeight);
} }
} }
} }