package gui.render; import java.awt.AlphaComposite; import java.awt.BasicStroke; import java.awt.Graphics2D; import java.awt.event.MouseEvent; import java.util.ArrayList; import java.util.List; import events.EntityHitboxChangedEvent; import events.EntityHitboxChangedListener; import model.Entity; import model.HitboxCircle; import model.Point; public class HitboxCircleRenderingFunction implements ShapeRenderingFunction { Point firstIsoPoint = null; Point currentIsoPoint = new Point(0,0); int currentDiametrX=0; Entity entity; private float scaleIndex = 1; Point centeringImage; private List listeners = new ArrayList<>(); public void setEntityInHitboxCircle(Entity e) { entity = e; } public void setCenteringImagePoint(Point p) { centeringImage = p; } @Override public void drawing(Graphics2D g) { AlphaComposite composite = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.5f); g.setComposite(composite); g.setStroke(new BasicStroke(2)); scaleIndex = entity.getScaleIndex(); HitboxCircle nowHitbox = (HitboxCircle)entity.getHitbox(); if(nowHitbox.getRadius()!=0) { g.drawOval((int)(nowHitbox.getCurrentRefPoint().x*scaleIndex+centeringImage.x), (int)((nowHitbox.getCurrentRefPoint().y-nowHitbox.getDiametrY()/2)*scaleIndex+centeringImage.y ), (int)(nowHitbox.getDiametrX()*scaleIndex ), (int)(nowHitbox.getDiametrY()*scaleIndex )); // System.out.println("READY: diametrX = "+nowHitbox.getDiametrX()+ ". diametrY = "+nowHitbox.getDiametrY()); // System.out.println("READY: coordX = "+(int)nowHitbox.getCurrentRefPoint().x+ ". coordY = "+(int)(nowHitbox.getCurrentRefPoint().y-(nowHitbox.getDiametrY()/2))); }else if(firstIsoPoint != null) { currentDiametrX = Math.abs((int)(firstIsoPoint.x )-(int)(currentIsoPoint.x )); // System.out.println("CURRENT: coordX = "+(int)firstIsoPoint.x+ ". coordX = "+(int)(firstIsoPoint.y-currentDiametrX/4)); // System.out.println("CURRENT: diametrX = "+currentDiametrX+ ". diametrY = "+currentDiametrX/2); g.drawOval((int)(firstIsoPoint.x*scaleIndex+centeringImage.x), (int)((firstIsoPoint.y - currentDiametrX/4)*scaleIndex+centeringImage.y), (int)(currentDiametrX*scaleIndex ), (int)(currentDiametrX/2*scaleIndex )); } } //это рисование. Во время рисования, нам необходимо наоборот делить текущие координаты которые мы нажимаем на scaleIndex. //так мы получим актуальные данные в entity //и уже они пусть обратно умножаются и в drawing отрисовывается все правильно. @Override public void mousePressed(MouseEvent e) { HitboxCircle nowHitbox = (HitboxCircle)entity.getHitbox(); if(nowHitbox.getRadius()==0 && firstIsoPoint == null) { firstIsoPoint = new Point(currentIsoPoint.x, currentIsoPoint.y); }else if(nowHitbox.getRadius()==0 && firstIsoPoint != null) { //Формула высчитывания радиуса из диаметров circle. nowHitbox.getCurrentRefPoint().setXY(firstIsoPoint.x, firstIsoPoint.y); nowHitbox.setDiametrXY(Math.abs(firstIsoPoint.x-currentIsoPoint.x),Math.abs((firstIsoPoint.x-currentIsoPoint.x)/2)); System.out.println("X = "+nowHitbox.getDiametrX()+ ". Y = "+nowHitbox.getDiametrY()); float temp = (float)Math.sqrt(2); nowHitbox.setRadius((nowHitbox.getDiametrY()/2)*temp); // высчитываем в параметры хитбокссеркла нужный радиус и текущую реф поинт. // Не забываем высчитать реф поинт хитбокса относительно текущей. // после чего вызываем listPointsToString и нотифай, который отправляет данные на сохранение notifySubscribers(); //возвращаем локальные данные текущего рисования хитбокса в нулевые значения. //необходимо, что бы при переходе в новый обьект, при создании хитбокса, очистился кэш канваса. firstIsoPoint = null; currentDiametrX = 0; } } @Override public void mouseMoved(MouseEvent e) { currentIsoPoint.x = (e.getX()-centeringImage.x)/scaleIndex; currentIsoPoint.y = (e.getY()-centeringImage.y)/scaleIndex; } public void functionClearHitboxJButton() { HitboxCircle nowHitbox = (HitboxCircle)entity.getHitbox(); } @Override public void functionClearJButton() { firstIsoPoint = null; currentIsoPoint = new Point(0,0); currentDiametrX = 0; HitboxCircle nowhitbox = (HitboxCircle)entity.getHitbox(); nowhitbox.setRadius(0); System.err.println("radius: "+nowhitbox.getRadius()); } public void subscribe(EntityHitboxChangedListener listener) { listeners.add(listener); } public void unsubscribe(EntityHitboxChangedListener listener) { listeners.remove(listener); } private void notifySubscribers() { for (EntityHitboxChangedListener listener : listeners) { listener.hitboxChanged( new EntityHitboxChangedEvent(entity.getHitbox(), entity) ); } } }