package gui.render; import java.awt.Color; import java.awt.Graphics2D; import java.awt.event.MouseEvent; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.logging.Logger; import events.EntityDrawboxChangedEvent; import events.EntityDrawboxChangedListener; import model.Drawbox; import model.Entity; import model.HitboxRectangle; import model.Point; public class DrawboxRectengleRenderingFunction implements ShapeRenderingFunction { private List drawboxPoints; private List basePoints; Point currentPoint = new Point(0, 0); private List listeners = new ArrayList<>(); Entity entity; Logger logger = Logger.getLogger("gui.DrawboxRectangleEditor"); private float scaleIndex = 1; public DrawboxRectengleRenderingFunction() { } @Override public void drawing(Graphics2D g) { scaleIndex = entity.getScaleIndex(); Drawbox drawbox = entity.getDrawbox(); drawboxPoints = drawbox.getDrawboxlistPoints(); basePoints = drawbox.getbaseListPoints(); logger.finest("drawbox point size: "+ drawboxPoints.size()); for(Point p: drawboxPoints) logger.finest("DrawBoxPoint: ["+ p.x + ":"+p.y+"]"); for(Point p: basePoints) logger.finest("BasePoint: ["+ p.x + ":"+p.y+"]"); if(drawboxPoints.size() >= 1 && drawboxPoints.size() < 4) { Point lastPoint = drawboxPoints.get(drawboxPoints.size()-1); g.drawLine((int)(lastPoint.x*scaleIndex), (int)(lastPoint.y*scaleIndex), (int)(currentPoint.x*scaleIndex), (int)(currentPoint.y*scaleIndex)); for(int i = 0; i < drawboxPoints.size()-1;i++) { int x1 = (int)drawboxPoints.get(i).x; int y1 = (int)drawboxPoints.get(i).y; int x2 = (int)drawboxPoints.get(i+1).x; int y2 = (int)drawboxPoints.get(i+1).y; g.drawLine((int)(x1*scaleIndex), (int)(y1*scaleIndex), (int)(x2*scaleIndex), (int)(y2*scaleIndex)); } } else { for(int i = 0; i < drawboxPoints.size();i++) { int x1 = (int)drawboxPoints.get(i % drawboxPoints.size()).x; int y1 = (int)drawboxPoints.get(i % drawboxPoints.size()).y; int x2 = (int)drawboxPoints.get((i+1) % drawboxPoints.size()).x; int y2 = (int)drawboxPoints.get((i+1) % drawboxPoints.size()).y; g.drawLine((int)(x1*scaleIndex), (int)(y1*scaleIndex), (int)(x2*scaleIndex), (int)(y2*scaleIndex)); } // ОТРИСОВКА ОСНОВАНИЯ g.setColor(Color.BLUE); for(int i = 0; i < basePoints.size()-1;i++) { int x1 = (int)basePoints.get(i).x; int y1 = (int)basePoints.get(i).y; int x2 = (int)basePoints.get(i+1).x; int y2 = (int)basePoints.get(i+1).y; g.drawLine((int)(x1*scaleIndex), (int)(y1*scaleIndex), (int)(x2*scaleIndex), (int)(y2*scaleIndex)); } } } @Override public void mousePressed(MouseEvent e) { if(drawboxPoints.size() < 4) { Point p = new Point(currentPoint.x, currentPoint.y); drawboxPoints.add(p); if(drawboxPoints.size() == 4) { sortingDrawboxPoints(); saveDataInEntity(); //при выборе 4-й точки и формировании данных drawbox, уведомляем всех подписчит if(listeners!=null) { notifySubscribers(); } } } } @Override public void mouseMoved(MouseEvent e) { currentPoint.x = e.getX()/scaleIndex; currentPoint.y = e.getY()/scaleIndex; } /*Точки должны идти в определенном порядке: * левая верхняя точка, правая верхняя, нижняя правая, нижняя левая; * Обе нижние точки, т.е. 3 и 4 являются основанием - хардкод. * P.s. возможно это не критично, и в сторе предусмотрено, что бы они сортировались, * но на данном этапе на всякий случай стоит так поступить*/ private void sortingDrawboxPoints() { //окей, это написано плохо, но... Похуй, пляшем) Collections.sort( drawboxPoints, (point1, point2) -> Float.compare(point1.y, point2.y) ); if(drawboxPoints.get(0).x>drawboxPoints.get(1).x) { Collections.swap(drawboxPoints, 0, 1); } if(drawboxPoints.get(2).x