RadioNurshat

Spruce Forest

Nov 25th, 2020 (edited)
526
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.   uses vcl, graphabc, system, ABCObjects, System.Drawing.Drawing2D;
  2.   var Horizon:Point;
  3.   var sky: RectangleABC;
  4.   var current:RegularPolygonABC;
  5.   var i:integer;
  6.   var r:Random;
  7.   var SKY_COLOR:Color = System.Drawing.Color.FromArgb(1, 1, 16);
  8.   var SKY_COLOR_TWO:Color = Color.FromArgb(70,60,122);
  9.   //var SKY_COLOR_THREE:Color = Color.FromArgb(255, 205, 154);
  10.  
  11.   //СЕКЦИЯ ПАРАМЕТРОВ.
  12.   //Горизонт
  13.   const HORIZON_LOCK = true;//Блокировка на горизонт
  14.   const HORIZON_Y = 300;
  15.   const PARALLAX_SIZE_DECAY = 0.8;//Коэффициент послойного уменьшения размера
  16.   const PARALLAX_COLOR_DECAY = 0.7;
  17.  
  18.   //Елка
  19.   //ВОТ ЭТИ 2 ПАРАМЕТРА ЧЕТКО ПОДОБРАНЫ
  20.   const SPRUCE_DECAY_AMOUNT = 0.7; //Коэффицент падения ширины треугльников
  21.   const SPRUCE_LAYER_COVER = 0.6; //Наложение треугольников
  22.  
  23.  
  24.   const SPRUCE_SECTIONS_RANDOM = false; //Случайное количество треугольников
  25.   const SPRUCE_SECTIONS = 4; //Количество треугольников
  26.   const MIN_SPRUCE_SECTIONS = 3; //Минимальное количество треугольников
  27.   const MAX_SPRUCE_SECTIONS = 5; //Максимальное количество треугольников
  28.  
  29.  
  30.   //Основание
  31.   const SPRUCE_BASE_HEIGHT_RELATION = 0.4;
  32.   const SPRUCE_BASE_WIDTH_RELATION = 0.1;
  33.  
  34.   //Цвета
  35.   var BASEMENT_COLOR:Color = Color.FromArgb(43, 29, 15);
  36.  
  37.  
  38.   procedure drawTriangle(x:integer; y:integer; side:integer; color: System.Drawing.Color);
  39.   var R: integer = round((2/3)*side * sin(3.14/3));
  40.       xc: integer = x + side div 2;
  41.       yc: integer = round(y - (1/3) * side * sin(3.14/3));
  42.       triangle:RegularPolygonABC = new RegularPolygonABC(xc,yc,R,3,color);
  43.   begin
  44.     triangle.BorderColor := color;
  45.     triangle.ToFront();
  46.   end;
  47.  
  48.   procedure drawSpruce(x:integer; y: integer; size:integer; color:system.Drawing.Color);
  49.   var baseHeight:integer = round(size * SPRUCE_BASE_HEIGHT_RELATION);
  50.       baseWidth: integer = round(size * SPRUCE_BASE_WIDTH_RELATION);
  51.       initialX:integer = x;
  52.       initialY: integer = y;
  53.       initialSize: integer = size;
  54.       sections:integer;
  55.       i:integer;
  56.   begin
  57.     //Основание треугольника
  58.     var base: RectangleABC = new RectangleABC(x + size div 2 - baseWidth div 2,y,baseWidth, baseHeight, BASEMENT_COLOR);
  59.     base.BorderColor := BASEMENT_COLOR;
  60.    
  61.     sections:=SPRUCE_SECTIONS;
  62.        
  63.     for i:= 1 to sections do begin
  64.       drawTriangle(initialX, initialY, initialSize, color);
  65.       initialX:=initialX + round(initialSize * (1 - SPRUCE_DECAY_AMOUNT)) div 2;
  66.       initialY:=round(initialY - initialSize * SPRUCE_LAYER_COVER);
  67.       initialSize:=round(initialSize * SPRUCE_DECAY_AMOUNT);
  68.     end;
  69.    
  70.   end;
  71.  
  72.  
  73.   begin
  74.     window.Width:=720;
  75.     window.Height:=480;
  76.    
  77.     r := new Random();
  78.    
  79.    
  80.     setSmoothingOff;
  81.     //Установка горизонта
  82.     if(HORIZON_LOCK) then
  83.       Horizon := window.Center()
  84.     else
  85.       Horizon:= new Point(0, HORIZON_Y);
  86.    
  87.     //Небо
  88.     setBrushColor(SKY_COLOR);
  89.     SetBrushStyle(BrushStyleType.bsGradient);
  90.     (Brush.NETBrush as LinearGradientBrush).LinearColors := new Color[2](SKY_COLOR,SKY_COLOR_TWO);
  91.     FillRect(0,0,window.Width,Horizon.Y);
  92.     //Земля
  93.     setBrushColor(clBlack);
  94.     setBrushStyle(BrushStyleType.bsSolid);
  95.     FillRect(0,Horizon.Y-1, window.Width, window.Height);
  96.     //Звезды
  97.     for i:=1 to 300 do begin
  98.       var x:integer:= round(window.Width * r.NextDouble());
  99.       var y:integer:= round(Horizon.Y * r.NextDouble());
  100.       putPixel(x,y,clWhite);
  101.     end;
  102.    
  103.    
  104.    
  105.    
  106.    
  107.    
  108.     var xPos:integer = 0;
  109.     var shifter:integer = 0;
  110.     var dh:double = 0;
  111.     var colorgrade:double = 0.3;
  112.     while (shifter<35) do begin
  113.      
  114.       xPos:=-round(r.NextDouble()*20);
  115.       for i:=0 to 80-shifter*2 do begin
  116.         dh := r.NextDouble();
  117.         //dh:=1;
  118.         var ran:double = r.NextDouble();
  119.         drawSpruce(xPos,Horizon.Y + round(shifter * dh),15+shifter, Color.FromArgb(14+round(shifter*ran*3*colorgrade), 22+round(shifter*ran*3*colorgrade), 2+round(shifter*ran*3*colorgrade)));
  120.         xPos += round(r.NextDouble()* (20 + 2*shifter));
  121.       end;
  122.       shifter+=5;
  123.       colorgrade+=0.001;
  124.     end;
  125.   end.
RAW Paste Data