Added the function of drawing rectangular hitboxes, as well as the ability to erase and save the result. You need to draw from left to right

This commit is contained in:
2026-03-29 22:47:57 +03:00
parent a0a69c3587
commit 2686d036cf
13 changed files with 190 additions and 180 deletions

View File

@ -14,84 +14,35 @@ import events.EntityDrawboxChangedListener;
import events.EntityHitboxChangedEvent;
import events.EntityHitboxChangedListener;
import model.Hitbox;
import model.HitboxRectangle;
import model.Point;
public class HitboxEditor extends Editable {
Point firstIsoPoint = null;
Point currentIsoPoint = new Point(0,0);
Point firstCartesianPoint = new Point(0,0), currentCartesianPoint = new Point(0,0);
private List<EntityHitboxChangedListener> listeners = new ArrayList<>();
HitboxEditor(ListGUI listGUI) {
super(listGUI);
}
//@Override
//public void drawing(Graphics2D g) {
/*Hitbox nowHitbox = entity.getHitbox();
//if(firstIsoPoint != null) {
int x1,y1,x2,y2;
int size = nowHitbox.getListPointsIso().size();
for(int i = 0; i < size;i++) {
x1 = (int)nowHitbox.getListPointsIso().get(i % size).x;
y1 = (int)nowHitbox.getListPointsIso().get(i % size).y;
x2 = (int)nowHitbox.getListPointsIso().get((i+1) % size).x;
y2 = (int)nowHitbox.getListPointsIso().get((i+1) % size).y;
g.drawLine(x1, y1, x2, y2);
}
x1 = (int)nowHitbox.getListPointsIso().get(0).x;
y1 = (int)nowHitbox.getListPointsIso().get(0).y;
x2 = (int)nowHitbox.getListPointsIso().get(3).x;
y2 = (int)nowHitbox.getListPointsIso().get(3).y;
g.drawLine(x1, y1, x2, y2);
//}
*/
//}
@Override
public void mouseClicked(MouseEvent e) {
if(firstIsoPoint == null) {
firstIsoPoint = new Point(currentIsoPoint.x,currentIsoPoint.y);
//System.out.println("firstPoint("+firstIsoPoint.x+";"+firstIsoPoint.y+");");
firstCartesianPoint = Hitbox.isometricToCartesian(firstIsoPoint.x, firstIsoPoint.y,firstCartesianPoint);
}else{
/*
* В данном месте при нажатии закрепляющей точки, необходимо вызывать функцию,
* которая будет формировать из текущих декартовых координат:
* 1. Точку старта и ширину с высотой.
* 2. Так же необходимо реализовать слушатель сохранения новых хитбоксов в дерево.
*
* */
repaint();
}
}
@Override
public void mouseMoved(MouseEvent e) {
/*currentIsoPoint.x = e.getX();
currentIsoPoint.y = e.getY();
if(entity!=null) {
Hitbox nowHitbox = entity.getHitbox();
if(firstIsoPoint != null) {
//System.out.println("firstPoint("+firstIsoPoint.x+";"+firstIsoPoint.y+");");
currentCartesianPoint = Hitbox.isometricToCartesian(currentIsoPoint.x, currentIsoPoint.y, currentCartesianPoint);
nowHitbox.getListPointsCartesian().get(0).setXY(firstCartesianPoint.x, firstCartesianPoint.y);
nowHitbox.getListPointsCartesian().get(1).setXY(currentCartesianPoint.x, firstCartesianPoint.y);
nowHitbox.getListPointsCartesian().get(2).setXY(currentCartesianPoint.x, currentCartesianPoint.y);
nowHitbox.getListPointsCartesian().get(3).setXY(firstCartesianPoint.x, currentCartesianPoint.y);
nowHitbox.convertCartesianPointsToIso();
repaint();
canvas = new EditableCanvas();
add(canvas);
canvas.setHitboxRectengleRenderingFunction();
canvas.setVisible(true);
clearLinesJButton.addActionListener((e)->{
if(entity != null) {
HitboxRectangle nowHitbox = (HitboxRectangle)entity.getHitbox();
System.out.println("1. nowHitbox.getListPointsIso().size() = "+ nowHitbox.getListPointsIso().size());
nowHitbox.getListPointsIso().clear();
System.out.println("2. nowHitbox.getListPointsIso().size() = "+ nowHitbox.getListPointsIso().size());
System.out.println("1. nowHitbox.getListPointsCartesian().size() = "+ nowHitbox.getListPointsCartesian().size() );
nowHitbox.getListPointsCartesian().clear();
System.out.println("2. nowHitbox.getListPointsCartesian().size() = "+ nowHitbox.getListPointsCartesian().size());
canvas.getHitboxRectengleRenderFunct().getLocalListPointsCartesian().clear();
canvas.getHitboxRectengleRenderFunct().getLocalListPointsIso().clear();
canvas.getHitboxRectengleRenderFunct().setFirstIsoPointIsNull();
canvas.repaint();
}
}*/
}
public void subscribe(EntityHitboxChangedListener listener) {
listeners.add(listener);
}
public void unsubscribe(EntityHitboxChangedListener listener) {
listeners.remove(listener);
});
}
//НАДО ДОБАВИТЬ ЧТО БЫ ПОД КОНЕЦ РИСОВАНИЯ ХИТБОКСА ОНО ВЫЗЫВАЛО ФУНКЦИЮ И ВСЕ СОХРАНЯЛО.
@ -99,29 +50,7 @@ public class HitboxEditor extends Editable {
//НО НЕ ДОБАВЛЕН ВЫЗОВ ФУНКЦИИ И НЕ ОФОРМЛЕНА ПОДПИСКА
//UPD: вроде подписку оформил в MainGUI;
private void notifySubscribers() {
for (EntityHitboxChangedListener listener : listeners) {
listener.hitboxChanged(
new EntityHitboxChangedEvent(entity.getHitbox(), entity)
);
}
}
//это старая очистка которая пока убрана. В будущем будет убрана вовсе, после рефакторинга.
/*@Override
public void actionPerformed(ActionEvent e) {
JTabbedPane parent = (JTabbedPane) getParent();
if(parent.getSelectedComponent() == this){
if(entity != null) {
firstIsoPoint = null;
currentIsoPoint.setXY(0,0);
repaint();
}
}
}*/
@Override
public void valueChanged(ListSelectionEvent e) {
// TODO Auto-generated method stub
//super.valueChanged(e);
}
}