draw sprites based on movement type

This commit is contained in:
garak 2019-04-02 19:51:33 -04:00 committed by huderlem
parent d7287ce54b
commit 0a0eaba788
6 changed files with 65 additions and 5 deletions

View file

@ -74,18 +74,21 @@ public:
QJsonObject buildSignEventJSON();
QJsonObject buildHiddenItemEventJSON();
QJsonObject buildSecretBaseEventJSON();
void setPixmapFromSpritesheet(QImage, int, int);
void setPixmapFromSpritesheet(QImage, int, int, int, bool);
int getPixelX();
int getPixelY();
QMap<QString, bool> getExpectedFields();
void readCustomValues(QJsonObject values);
void addCustomValuesTo(QJsonObject *obj);
void setFrameFromMovement(QString);
QMap<QString, QString> values;
QMap<QString, QString> customValues;
QPixmap pixmap;
int spriteWidth;
int spriteHeight;
int frame = 0;
bool hFlip = false;
bool usingSprite;
};

View file

@ -43,6 +43,7 @@ public:
QStringList *bgEventFacingDirections = nullptr;
QMap<QString, int> metatileBehaviorMap;
QMap<int, QString> metatileBehaviorMapInverse;
QMap<QString, QString> facingDirections;
QMap<QString, Map*> *map_cache;
Map* loadMap(QString);
@ -106,6 +107,7 @@ public:
void readFlagNames();
void readVarNames();
void readMovementTypes();
void readInitialFacingDirections();
void readMapTypes();
void readMapBattleScenes();
void readWeatherNames();
@ -126,6 +128,7 @@ public:
QStringList readCArray(QString text, QString label);
QString readCIncbin(QString text, QString label);
QMap<QString, int> readCDefines(QString text, QStringList prefixes);
QMap<QString, QString> readNamedIndexCArray(QString text, QString label);
static int getNumTilesPrimary();
static int getNumTilesTotal();

View file

@ -342,13 +342,35 @@ QJsonObject Event::buildSecretBaseEventJSON()
return secretBaseObj;
}
void Event::setPixmapFromSpritesheet(QImage spritesheet, int spriteWidth, int spriteHeight)
void Event::setPixmapFromSpritesheet(QImage spritesheet, int spriteWidth, int spriteHeight, int frame, bool hFlip)
{
// Set first palette color fully transparent.
QImage img = spritesheet.copy(0, 0, spriteWidth, spriteHeight);
QImage img = spritesheet.copy(frame * spriteWidth % spritesheet.width(), 0, spriteWidth, spriteHeight);
if (hFlip) {
img = img.transformed(QTransform().scale(-1, 1));
}
img.setColor(0, qRgba(0, 0, 0, 0));
pixmap = QPixmap::fromImage(img);
this->spriteWidth = spriteWidth;
this->spriteHeight = spriteHeight;
this->usingSprite = true;
}
void Event::setFrameFromMovement(QString facingDir) {
// defaults
this->frame = 0;
this->hFlip = false;
if (facingDir == "DIR_NORTH") {
this->frame = 1;
this->hFlip = false;
} else if (facingDir == "DIR_SOUTH") {
this->frame = 0;
this->hFlip = false;
} else if (facingDir == "DIR_WEST") {
this->frame = 2;
this->hFlip = false;
} else if (facingDir == "DIR_EAST") {
this->frame = 2;
this->hFlip = true;
}
}

View file

@ -761,6 +761,8 @@ void Editor::displayMapEvents() {
DraggablePixmapItem *Editor::addMapEvent(Event *event) {
DraggablePixmapItem *object = new DraggablePixmapItem(event, this);
event->setFrameFromMovement(project->facingDirections.value(event->get("movement_type")));
object->updatePixmap();
if (!event->usingSprite) {
object->setOpacity(0.7);
}
@ -1202,7 +1204,7 @@ QList<DraggablePixmapItem *> *Editor::getObjects() {
void Editor::redrawObject(DraggablePixmapItem *item) {
if (item) {
item->setPixmap(item->event->pixmap);
item->setPixmap(item->event->pixmap.copy(item->event->frame * item->event->spriteWidth % item->event->pixmap.width(), 0, item->event->spriteWidth, item->event->spriteHeight));
item->setShapeMode(QGraphicsPixmapItem::BoundingRectShape);
if (selected_events && selected_events->contains(item)) {
QImage image = item->pixmap().toImage();

View file

@ -600,6 +600,7 @@ void MainWindow::loadDataStructures() {
project->readFlagNames();
project->readVarNames();
project->readMovementTypes();
project->readInitialFacingDirections();
project->readMapTypes();
project->readMapBattleScenes();
project->readWeatherNames();
@ -1452,6 +1453,11 @@ void MainWindow::updateSelectedObjects() {
if (!editor->project->movementTypes->contains(value)) {
combo->addItem(value);
}
connect(combo, static_cast<void (QComboBox::*)(const QString &)>(&QComboBox::currentTextChanged),
this, [this, item, frame](QString value){
item->event->setFrameFromMovement(editor->project->facingDirections.value(value));
item->updatePixmap();
});
combo->addItems(*editor->project->movementTypes);
combo->setToolTip("The object's natural movement behavior when the player is not interacting with it.");
} else if (key == "weather") {

View file

@ -1535,6 +1535,11 @@ void Project::readMovementTypes() {
readCDefinesSorted(filepath, prefixes, movementTypes);
}
void Project::readInitialFacingDirections() {
QString text = readTextFile(root + "/src/event_object_movement.c");
facingDirections = readNamedIndexCArray(text, "gInitialMovementTypeFacingDirections");
}
void Project::readMapTypes() {
QString filepath = root + "/include/constants/map_types.h";
QStringList prefixes = (QStringList() << "MAP_TYPE_");
@ -1708,7 +1713,7 @@ void Project::loadEventPixmaps(QList<Event*> objects) {
spriteHeight = dimensionMatch.captured(2).toInt();
}
}
object->setPixmapFromSpritesheet(spritesheet, spriteWidth, spriteHeight);
object->setPixmapFromSpritesheet(spritesheet, spriteWidth, spriteHeight, object->frame, object->hFlip);
}
}
}
@ -1760,6 +1765,25 @@ QStringList Project::readCArray(QString text, QString label) {
return list;
}
QMap<QString, QString> Project::readNamedIndexCArray(QString text, QString label) {
QMap<QString, QString> map;
QRegularExpression re_text(QString("\\b%1\\b\\s*\\[?\\s*\\]?\\s*=\\s*\\{([^\\}]*)\\}").arg(label));
text = re_text.match(text).captured(1).replace(QRegularExpression("\\s*"), "");
QRegularExpression re("\\[(?<index>[A-Za-z1-9_]*)\\]=(?<value>[A-Za-z1-9_]*)");
QRegularExpressionMatchIterator iter = re.globalMatch(text);
while (iter.hasNext()) {
QRegularExpressionMatch match = iter.next();
QString key = match.captured("index");
QString value = match.captured("value");
map.insert(key, value);
}
return map;
}
QString Project::readCIncbin(QString text, QString label) {
QString path;