Refactoring EditableCanvas in DrawboxEditable and other classes

This commit is contained in:
2026-03-23 15:07:55 +03:00
parent 3b81412eb2
commit ab30acd69a
26 changed files with 498 additions and 186 deletions

View File

@ -32,6 +32,8 @@ import org.xml.sax.SAXException;
import events.EntityDrawboxChangedEvent;
import events.EntityDrawboxChangedListener;
import events.EntityHitboxChangedEvent;
import events.EntityHitboxChangedListener;
import exception.DuplicateEntryException;
import launch.Launcher;
import model.Entity;
@ -41,7 +43,7 @@ import model.Entity;
* Класс данных, который оперирует их сохранением, загрузкой, и хранением в памяти.
* ВАЖНО: данный класс хранит так же актуальную копию XML-представления файла
* */
public class Project implements Iterable<Entity>, EntityDrawboxChangedListener {
public class Project implements Iterable<Entity>, EntityDrawboxChangedListener, EntityHitboxChangedListener {
/**
* Путь к XML по-умолчанию.
@ -125,7 +127,7 @@ public class Project implements Iterable<Entity>, EntityDrawboxChangedListener {
}
/**
* Загружает типы сущностей из файла с заданным именем и расположением.<br>
* Загружает типы сущностей из файла с заданным именем и расположением.<br>0
* */
public void load() throws SAXException, IOException, ParserConfigurationException {
listEntity.clear();
@ -237,14 +239,14 @@ public class Project implements Iterable<Entity>, EntityDrawboxChangedListener {
Element drawboxProperty = document.createElement("property");
drawboxProperty.setAttribute("name", "drawbox");
drawboxProperty.setAttribute("type", "string");
drawboxProperty.setAttribute("default", ""); // empty, because on creation there is no drawbox yet
drawboxProperty.setAttribute("default", "0 0 0 0 0 0 0 0"); // empty, because on creation there is no drawbox yet
objecttypeElement.appendChild(drawboxProperty);
// format: <property name="hitbox" type="string" default="HITBOX_TYPE OFFSET_X OFFSET_Y SIZE"/>
Element hitboxProperty = document.createElement("property");
hitboxProperty.setAttribute("name", "hitbox");
hitboxProperty.setAttribute("type", "string");
hitboxProperty.setAttribute("default", ""); // empty, no hitbox yet
hitboxProperty.setAttribute("default", "Rectangle 0 0 0 0"); // empty, no hitbox yet
objecttypeElement.appendChild(hitboxProperty);
//printXMlToConsole(); //DEBUG!
@ -355,7 +357,27 @@ public class Project implements Iterable<Entity>, EntityDrawboxChangedListener {
//we have hitbox, drawbox and class, gotta set the right one
Element propertyElement = ((Element)properties.item(i));
if (propertyElement.getAttribute("name").equals("drawbox")) {
propertyElement.setAttribute("default", event.owner.getDrawbox().toString());
propertyElement.setAttribute("default", event.owner.getDrawbox().listPointsToString());
}
}
}
}
/**
* Получение события при отрисовке нового Hitbox, для изменения XML-дерева.
* Объект event хранит в себе ссылку на новый объект Hitbox и объект entity, для которой он был создан.
* */
@Override
public void hitboxChanged(EntityHitboxChangedEvent event) {
String entityName = event.owner.getName();
Node entityToUpdate = getEntityXMLNodeByName(entityName);
NodeList properties = entityToUpdate.getChildNodes();
for(int i = 0; i < properties.getLength(); i++) {
if(properties.item(i) instanceof Element) { // ignoring #text nodes
//we have hitbox, drawbox and class, gotta set the right one
Element propertyElement = ((Element)properties.item(i));
if (propertyElement.getAttribute("name").equals("hitbox")) {
propertyElement.setAttribute("default", event.owner.getHitbox().listPointsToString());
}
}
}
@ -388,6 +410,8 @@ public class Project implements Iterable<Entity>, EntityDrawboxChangedListener {
stripEmptyElements(child);
}
}
}
//в момент окончания рисования, в зависимости в какой мы рисуем вкладке хитбокса,
//в зависимости от того в какой панельке(jpanel)и подклассе интерфейса Editable