package laba1Loco;
import java.awt.*;
import java.util.*;
import javax.swing.*;
import javax.swing.Timer;
import java.awt.event.*;
public class DrawingLoco{
private WheelDrawing wheelDrawing;
///
/// Класс-сущность
///
public EntityLoco _EntityLoco;
///
/// Ширина окна
///
private int _pictureWidth;
///
/// Высота окна
///
private int _pictureHeight;
///
/// Левая координата прорисовки локомотива
///
private int _startPosX;
///
/// Верхняя кооридната прорисовки локомотива
///
private int _startPosY;
///
/// Ширина прорисовки локомотива
///
private int _locoWidth = 83;
///
/// Высота прорисовки локомотива
///
private int _locoHeight = 41;
///
/// Инициализация свойств
///
/// Скорость
/// Вес
/// Цвет кузова
/// Дополнительный цвет
/// Признак наличия трубы
/// Признак наличия бака
/// Признак наличия паровозной полосы
/// Ширина картинки
/// Высота картинки
/// true - объект создан, false - проверка не пройдена, нельзя создать объект в этих размерах
public boolean Init(int speed, double weight, Color bodyColor, Color additionalColor, boolean tube, boolean fuelTank, boolean locoLine, int numWheel, int width, int height)
{
_pictureWidth = width;
_pictureHeight = height;
if (_pictureHeight < _locoHeight || _pictureWidth < _locoWidth)
return false;
_EntityLoco = new EntityLoco();
_EntityLoco.Init(speed, weight, bodyColor, additionalColor, tube, fuelTank, locoLine, numWheel);
if (fuelTank)
_locoWidth = 169;
wheelDrawing = new WheelDrawing();
wheelDrawing.setNumWheel(numWheel);
return true;
}
///
/// Установка позиции
///
/// Координата X
/// Координата Y
public void SetPosition(int x, int y)
{
_startPosX = Math.min(x, _pictureWidth-_locoWidth);
_startPosY = Math.min(y, _pictureHeight-_locoHeight);
}
///
/// Изменение направления перемещения
///
/// Направление
public void MoveTransport(Direction direction)
{
if (_EntityLoco == null){
return;
}
switch (direction)
{
//влево
case Left:
if (_startPosX - _EntityLoco.Step > 0)
{
_startPosX -= (int)_EntityLoco.Step;
}
break;
//вверх
case Up:
if (_startPosY - _EntityLoco.Step > 0)
{
_startPosY -= (int)_EntityLoco.Step;
}
break;
// вправо
case Right:
if (_startPosX + _locoWidth + _EntityLoco.Step < _pictureWidth)
{
_startPosX += (int)_EntityLoco.Step;
}
break;
//вниз
case Down:
if (_startPosY + _locoHeight + _EntityLoco.Step < _pictureHeight)
{
_startPosY += (int)_EntityLoco.Step;
}
break;
}
}
///
/// Прорисовка объекта
///
///
public void DrawTransport(Graphics2D g2d)
{
if (_EntityLoco == null)
{
return;
}
// body
g2d.setColor(_EntityLoco.BodyColor);
g2d.drawPolyline(new int[]{
_startPosX + 8, _startPosX + 79, _startPosX + 79, _startPosX + 4, _startPosX + 4, _startPosX + 8,
}, new int[]{
_startPosY+10, _startPosY+10, _startPosY+32, _startPosY+32, _startPosY+20, _startPosY+10
}, 6);
g2d.drawPolyline(new int[]{
_startPosX + 4, _startPosX + 29, _startPosX + 29, _startPosX + 37, _startPosX + 37, _startPosX + 79, _startPosX + 37, _startPosX + 37, _startPosX + 29, _startPosX + 29,
}, new int[]{
_startPosY+21, _startPosY+21, _startPosY+14, _startPosY+14, _startPosY+21, _startPosY+21, _startPosY+21, _startPosY+29, _startPosY+29, _startPosY+21
}, 10);
// trucks
g2d.fillPolygon(new int[]{
_startPosX + 0,_startPosX + 5,_startPosX + 32,_startPosX + 36,
}, new int[]{
_startPosY+37,_startPosY+33,_startPosY+33,_startPosY+37
}, 4);
g2d.fillPolygon(new int[]{
_startPosX + 44,_startPosX + 49,_startPosX + 76,_startPosX + 80,
}, new int[]{
_startPosY+37,_startPosY+33,_startPosY+33,_startPosY+37
}, 4);
//back
g2d.fillPolygon(new int[]{
_startPosX + 79,_startPosX + 82,_startPosX + 82,_startPosX + 79,
}, new int[]{
_startPosY+12,_startPosY+12,_startPosY+30,_startPosY+30
}, 4);
//windows
g2d.setColor(Color.BLUE);
g2d.drawRect(_startPosX + 10, _startPosY + 12, 6, 7);
g2d.drawRect(_startPosX + 19, _startPosY + 12, 6, 7);
g2d.drawRect(_startPosX + 72, _startPosY + 12, 6, 7);
//wheels
wheelDrawing.Draw(_startPosX, _startPosY, _EntityLoco.FuelTank, _EntityLoco.BodyColor, g2d);
g2d.setColor(_EntityLoco.AdditionalColor);
if (_EntityLoco.Tube)
{
g2d.drawPolyline(new int[] {
_startPosX + 40,_startPosX + 40,_startPosX + 45,_startPosX + 41,_startPosX + 41,_startPosX + 44,_startPosX + 44,_startPosX + 45,_startPosX + 45,
},new int[] {
_startPosY+9,_startPosY+3,_startPosY+3,_startPosY+3,_startPosY,_startPosY,_startPosY+3,_startPosY+3,_startPosY+9,
},9);
}
if (_EntityLoco.LocoLine)
{
g2d.drawPolyline(new int[] {
_startPosX + 60,_startPosX + 38,
},new int[] {
_startPosY+10,_startPosY+32
},2);
g2d.drawPolyline(new int[] {
_startPosX + 65,_startPosX + 43,
},new int[] {
_startPosY+10,_startPosY+32
},2);
g2d.drawPolyline(new int[] {
_startPosX + 70,_startPosX + 48,
},new int[] {
_startPosY+10,_startPosY+32
},2);
}
if (_EntityLoco.FuelTank)
{
// body
g2d.setColor(_EntityLoco.BodyColor);
g2d.drawPolyline(new int[]{
_startPosX + 89, _startPosX + 164, _startPosX + 164, _startPosX + 89, _startPosX + 89,
}, new int[]{
_startPosY+10, _startPosY+10, _startPosY+32, _startPosY+32, _startPosY+10
}, 5);
g2d.drawPolyline(new int[]{
_startPosX + 89, _startPosX + 164,
}, new int[]{
_startPosY+21, _startPosY+21,
}, 2);
// trucks
g2d.fillPolygon(new int[]{
_startPosX + 0+85,_startPosX + 5+85,_startPosX + 32+85,_startPosX + 36+85,
}, new int[]{
_startPosY+37,_startPosY+33,_startPosY+33,_startPosY+37
}, 4);
g2d.fillPolygon(new int[]{
_startPosX + 44+85,_startPosX + 49+85,_startPosX + 76+85,_startPosX + 80+85,
}, new int[]{
_startPosY+37,_startPosY+33,_startPosY+33,_startPosY+37
}, 4);
//back
g2d.fillPolygon(new int[]{
_startPosX + 79+85,_startPosX + 82+85,_startPosX + 82+85,_startPosX + 79+85,
}, new int[]{
_startPosY+12,_startPosY+12,_startPosY+30,_startPosY+30
}, 4);
//front
g2d.fillPolygon(new int[]{
_startPosX + 86,_startPosX + 89,_startPosX + 89,_startPosX + 86,
}, new int[]{
_startPosY+12,_startPosY+12,_startPosY+30,_startPosY+30
}, 4);
}
}
}