package laba1Loco;
import java.awt.*;
import java.util.*;
import javax.swing.*;
import javax.swing.Timer;
import java.awt.event.*;
public class DrawingTrain {
public IMoveableObject GetMoveableObject() { return new DrawningObjectTrain(this);}
protected IWheelDrawing wheelDrawing;
///
/// Класс-сущность
///
public EntityTrain EntityTrain;
///
/// Ширина окна
///
public int _pictureWidth;
///
/// Высота окна
///
public int _pictureHeight;
///
/// Левая координата прорисовки локомотива
///
protected int _startPosX;
///
/// Верхняя кооридната прорисовки локомотива
///
protected int _startPosY;
///
/// Ширина прорисовки локомотива
///
protected int _locoWidth = 83;
///
/// Высота прорисовки локомотива
///
protected int _locoHeight = 41;
///
/// Инициализация свойств
///
/// Скорость
/// Вес
/// Цвет кузова
/// Ширина картинки
/// Высота картинки
public DrawingTrain(int speed, double weight, Color bodyColor, int _numWheel, int width, int height)
{
_pictureWidth = width;
_pictureHeight = height;
if (_pictureHeight < _locoHeight || _pictureWidth < _locoWidth)
return;
EntityTrain = new EntityTrain(speed, weight, bodyColor, _numWheel);
Random random = new Random();
switch(random.nextInt(0, 3)){
case 0:
wheelDrawing = new WheelDrawingSimple();
break;
case 1:
wheelDrawing = new WheelDrawingBalls();
break;
case 2:
wheelDrawing = new WheelDrawingDavidStar();
break;
default:
wheelDrawing = new WheelDrawingSimple();
break;
}
wheelDrawing.setNumWheel(_numWheel);
}
// конструктор для 3 сложной лабы
public DrawingTrain(EntityTrain train, IWheelDrawing _wheelDrawing, int width, int height ){
if (height < _locoHeight || width < _locoWidth)
return;
_pictureWidth = width;
_pictureHeight = height;
EntityTrain = train;
wheelDrawing = _wheelDrawing;
wheelDrawing.setNumWheel(EntityTrain.numWheel);
}
///
/// Установка позиции
///
/// Координата X
/// Координата Y
public void SetPosition(int x, int y)
{
_startPosX = Math.min(x, _pictureWidth - _locoWidth);
_startPosY = Math.min(y, _pictureHeight - _locoHeight);
}
///
/// Координата X объекта
///
public int GetPosX (){return _startPosX;}
///
/// Координата Y объекта
///
public int GetPosY (){return _startPosY;}
///
/// Ширина объекта
///
public int GetWidth (){return _locoWidth;}
///
/// Высота объекта
///
public int GetHeight (){return _locoHeight;}
///
/// Проверка, что объект может переместится по указанному направлению
///
/// Направление
/// true - можно переместится по указанному направлению
public boolean CanMove(Direction direction)
{
if (EntityTrain == null)
{
return false;
}
switch (direction)
{
case Left:
return _startPosX - EntityTrain.Step > 0;
case Right:
return _startPosX + _locoWidth + EntityTrain.Step < _pictureWidth;
case Up:
return _startPosY - EntityTrain.Step > 0;
case Down:
return _startPosY + _locoHeight + EntityTrain.Step < _pictureHeight;
default:
return false;
}
}
///
/// Изменение направления перемещения
///
/// Направление
public void MoveTransport(Direction direction)
{
if (!CanMove(direction) || EntityTrain == null)
{
return;
}
switch (direction)
{
//влево
case Left:
_startPosX -= (int)EntityTrain.Step;
break;
//вверх
case Up:
_startPosY -= (int)EntityTrain.Step;
break;
// вправо
case Right:
_startPosX += (int)EntityTrain.Step;
break;
//вниз
case Down:
_startPosY += (int)EntityTrain.Step;
break;
}
}
///
/// Прорисовка объекта
///
///
public void DrawTransport(Graphics2D g2d)
{
if (EntityTrain == null)
{
return;
}
// body
g2d.setColor(EntityTrain.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, false, EntityTrain.BodyColor, g2d);
}
}