package gui.render; 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 List listeners = new ArrayList<>(); public void setEntityInHitboxCircle(Entity e) { entity = e; } @Override public void drawing(Graphics2D g) { HitboxCircle nowHitbox = (HitboxCircle)entity.getHitbox(); if(nowHitbox.getRadius()!=0) { g.drawOval((int)nowHitbox.getCurrentRefPoint().x, (int)(nowHitbox.getCurrentRefPoint().y-(nowHitbox.getDiametrY()/2)), (int)nowHitbox.getDiametrX(), (int)(nowHitbox.getDiametrY())); // 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, (int)(firstIsoPoint.y-currentDiametrX/4), (int)currentDiametrX, (int)currentDiametrX/2); } } @Override public void mousePressed(MouseEvent e) { HitboxCircle nowHitbox = (HitboxCircle)entity.getHitbox(); if(nowHitbox.getRadius()==0 && firstIsoPoint == null) { firstIsoPoint = new Point(e.getX(), e.getY()); }else if(nowHitbox.getRadius()==0 && firstIsoPoint != null) { //Формула высчитывания радиуса из диаметров circle. nowHitbox.getCurrentRefPoint().setXY(firstIsoPoint.x, firstIsoPoint.y); nowHitbox.setDiametrXY(Math.abs(firstIsoPoint.x-e.getX()),Math.abs((firstIsoPoint.x-e.getX())/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(); currentIsoPoint.y = e.getY(); } 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) ); } } }