PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Вопросы новичка (продолжение…)


Вопросы новичка (продолжение…)

Сообщений 301 страница 330 из 974

301

Вот еще пример с использованием TransformSprite3D

Код:
; German forum: http://www.purebasic.fr/german/archive/viewtopic.php?t=1849
; Author: kutta (updated to PB4 by ste123)
; Date: 28. July 2003
; OS: Windows
; Demo: Yes

Declare punkteberechnen()
Declare sortieren()
Declare linien ()
Declare texture ()

Global anzahl.l,spr.l,spr3d.l
anzahl=20

InitSprite()
InitSprite3D()
InitKeyboard()
OpenScreen(1024,768,32,"flat")
LoadFont(0,"comic sans ms",5)

;wьrfel objekt erschaffen
Structure wuerfel
  xpos.f[8]
  ypos.f[8]
  zpos.f[8]
  temxpos.f[8]
  temypos.f[8]
  temzpos.f[8]
  x2d.f[8]
  y2d.f[8]
  verx.f
  very.f
  verz.f
  con1.w[7]
  con2.w[7]
  con3.w[7]
  con4.w[7]
  breite.f
  laenge.f
  hoehe.f
  startposx.f
  startposy.f
  winkelx.f
  winkely.f
  winkelz.f
  zeigerx.f
  zeigery.f
  zeigerz.f
  speedx.f
  speedy.f
  speedz.f
  index.f
EndStructure

;wuerfel eckpunkte in die structure legen
Global Dim typ.wuerfel(anzahl)
For t=1 To anzahl
  typ(t)\index=t
  typ(t)\breite=80
  typ(t)\hoehe=80
  typ(t)\laenge=80
  typ(t)\xpos[0]=0
  typ(t)\ypos[0]=0
  typ(t)\zpos[0]=0
  typ(t)\xpos[1]=typ(t)\breite
  typ(t)\ypos[1]=0
  typ(t)\zpos[1]=0
  typ(t)\xpos[2]=typ(t)\breite
  typ(t)\ypos[2]=typ(t)\hoehe
  typ(t)\zpos[2]=0
  typ(t)\xpos[3]=0
  typ(t)\ypos[3]=typ(t)\hoehe
  typ(t)\zpos[3]=0
  typ(t)\xpos[4]=0
  typ(t)\ypos[4]=0
  typ(t)\zpos[4]=typ(t)\laenge
  typ(t)\xpos[5]=typ(t)\breite
  typ(t)\ypos[5]=0
  typ(t)\zpos[5]=typ(t)\laenge
  typ(t)\xpos[6]=typ(t)\breite
  typ(t)\ypos[6]=typ(t)\hoehe
  typ(t)\zpos[6]=typ(t)\laenge
  typ(t)\xpos[7]=0
  typ(t)\ypos[7]=typ(t)\hoehe
  typ(t)\zpos[7]=typ(t)\laenge
  typ(t)\startposx=Random(800)+100
  typ(t)\startposy=Random(600)+100
  typ(t)\speedx=Random((5)+1)/10
  typ(t)\speedy=Random((5)+1)/10
  typ(t)\speedz=Random((5)+1)/10
  typ(t)\zeigerx=Random(2)+1
  If typ(t)\zeigerx=0:typ(t)\zeigerx=2:EndIf
  typ(t)\zeigery=Random(2)+1
  If typ(t)\zeigery=0:typ(t)\zeigery=-2:EndIf
  typ(t)\zeigerz=Random((5)+1)/10
  If typ(t)\zeigerz=0:typ(t)\zeigerz=-0.2:EndIf
  typ(t)\verz=Random(100)-Random(4000)
Next

;3d sprite als lichtextur
spr.l = CreateSprite(#PB_Any,8,8,#PB_Sprite_Texture)
StartDrawing(SpriteOutput(spr))
FrontColor( RGB(200,100,100) )
Box(0, 0, 8, 8)
StopDrawing()
CopySprite(spr,99,#PB_Sprite_Texture)
spr3d.l = CreateSprite3D(#PB_Any,99)

;3d sprites als seitenflдchen
For n=1 To 6;seiten
  StartDrawing(SpriteOutput(spr))
  FrontColor( RGB(0,0,55) )
  Box(0, 0, 8, 8)
  DrawingFont(FontID(0))
  DrawingMode(3)
  FrontColor( RGB(229,100,0) )
  ;DrawText(1,-1,Str(n))
  StopDrawing()
  CopySprite(spr,n,#PB_Sprite_Texture)
  CreateSprite3D(n,n)
Next

;quaderecken einlesen
For t=1 To anzahl
  Restore seiten:
  For n=1 To 6;seiten
    Read.w typ(t)\con1[n]
    Read.w typ(t)\con2[n]
    Read.w typ(t)\con3[n]
    Read.w typ(t)\con4[n]
  Next
  DataSection
  seiten:
  Data.w 0,1,2,3,  4,5,1,0,  5,4,7,6,  4,0,3,7, 1,5,6,2, 3,2,6,7
  EndDataSection
Next

;************************************************************************************************************************
;Haupschleife
Repeat
  ClearScreen( RGB(0,0,0) )
  ExamineKeyboard()
  punkteberechnen ()
  sortieren()
  linien()
  texture()
  FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape)
;*************************************************************************************************************************

Procedure punkteberechnen ()
  For t=1 To anzahl
    
    For v=0 To 7 ;eckpunkte transformieren
      ;nдchster winkelwert
      typ(t)\winkelx=typ(t)\winkelx+typ(t)\speedx
      If typ(t)\winkelx+typ(t)\speedx =>360.00 :typ(t)\winkelx=typ(t)\winkelx-360:EndIf
      typ(t)\winkely=typ(t)\winkely+typ(t)\speedy
      If typ(t)\winkely+typ(t)\speedy =>360.00 :typ(t)\winkely=typ(t)\winkely-360:EndIf
      typ(t)\winkelz=typ(t)\winkelz+typ(t)\speedz
      If typ(t)\winkelz+typ(t)\speedz =>360.00 :typ(t)\winkelz=typ(t)\winkelz-360:EndIf
      ;rotation
      typ(t)\temypos[v]= (((typ(t)\ypos[v]-typ(t)\hoehe/2) * Cos(typ(t)\winkelx*(2*3.14159265/360))) - ((typ(t)\zpos[v]-typ(t)\laenge/2) * Sin(typ(t)\winkelx*(2*3.14159265/360))))
      typ(t)\temzpos[v]= (((typ(t)\ypos[v]-typ(t)\hoehe/2) * Sin(typ(t)\winkelx*(2*3.14159265/360))) + ((typ(t)\zpos[v]-typ(t)\laenge/2) * Cos(typ(t)\winkelx*(2*3.14159265/360))))
      typ(t)\temxpos[v]= (((typ(t)\xpos[v]-typ(t)\breite/2) * Cos(typ(t)\winkely*(2*3.14159265/360))) - (typ(t)\temzpos[v] * Sin(typ(t)\winkely*(2*3.14159265/360))))
      typ(t)\temzpos[v] =(((typ(t)\xpos[v]-typ(t)\breite/2) * Sin(typ(t)\winkely*(2*3.14159265/360))) + (typ(t)\temzpos[v] * Cos(typ(t)\winkely*(2*3.14159265/360))))
      x=typ(t)\temxpos[v]
      typ(t)\temxpos[v]= ((typ(t)\temxpos[v] * Cos(typ(t)\winkelz*(2*3.14159265/360))) - (typ(t)\temypos[v] * Sin(typ(t)\winkelz*(2*3.14159265/360))))
      typ(t)\temypos[v]= ((x * Sin(typ(t)\winkelz*(2*3.14159265/360))) + (typ(t)\temypos[v] * Cos(typ(t)\winkelz*(2*3.14159265/360))))
      ;verschiebung z-achse
      If typ(t)\verz>220 Or typ(t)\verz<-4000:typ(t)\zeigerz=typ(t)\zeigerz*-1:EndIf
      typ(t)\verz=typ(t)\verz+typ(t)\zeigerz
      typ(t)\temzpos[v]=typ(t)\temzpos[v]+typ(t)\verz
      ;2d umsetzung
      typ(t)\x2d[v]= 500 * typ(t)\temxpos[v] / (400 - (typ(t)\temzpos[v]))
      typ(t)\y2d[v]= 500 * typ(t)\temypos[v] / (400 - (typ(t)\temzpos[v]))
    Next
    
    ;2d bewegung
    typ(t)\startposx=typ(t)\startposx+typ(t)\zeigerx
    typ(t)\startposy=typ(t)\startposy+typ(t)\zeigery
    If typ(t)\startposx>900 Or typ(t)\startposx<100:typ(t)\zeigerx=typ(t)\zeigerx*-1:EndIf
    If typ(t)\startposy>700 Or typ(t)\startposy<100:typ(t)\zeigery=typ(t)\zeigery*-1:EndIf
    ;z mittelwert sammeln
    typ(t)\index=(Round(typ(t)\temzpos[0],1)+Round(typ(t)\temzpos[6],1)+Round(typ(t)\temzpos[4],1)+Round(typ(t)\temzpos[2],1))/4
  Next
EndProcedure

Procedure sortieren();der wьrfel in z reinfolge ft.bubblesort(thx wichtel !)
  a.l
  b.l
  c.wuerfel
  For b=1 To anzahl-1
    For a=b To anzahl-1
      If  typ(b)\index>typ(a+1)\index
        CopyMemory(@typ(b),@c,SizeOf(wuerfel))
        CopyMemory(@typ(a+1),@typ(b),SizeOf(wuerfel))
        CopyMemory(@c,@typ(a+1),SizeOf(wuerfel))
      EndIf
    Next a
  Next b
EndProcedure

Procedure linien() ;drahtgitter
  StartDrawing(ScreenOutput())
  DrawingMode(1)
  For t=1 To anzahl
    
    For n=1 To 6
      con1=typ(t)\con1[n]
      con2=typ(t)\con2[n]
      con3=typ(t)\con3[n]
      con4=typ(t)\con4[n]
      FrontColor( RGB(0,0,155) )
      LineXY(typ(t)\x2d[con1]+typ(t)\startposx,typ(t)\y2d[con1]+typ(t)\startposy,typ(t)\x2d[con2]+typ(t)\startposx,typ(t)\y2d[con2]+typ(t)\startposy) ;eins
      LineXY(typ(t)\x2d[con2]+typ(t)\startposx,typ(t)\y2d[con2]+typ(t)\startposy,typ(t)\x2d[con3]+typ(t)\startposx,typ(t)\y2d[con3]+typ(t)\startposy) ;zwei
      LineXY(typ(t)\x2d[con3]+typ(t)\startposx,typ(t)\y2d[con3]+typ(t)\startposy,typ(t)\x2d[con4]+typ(t)\startposx,typ(t)\y2d[con4]+typ(t)\startposy) ;drei
      LineXY(typ(t)\x2d[con4]+typ(t)\startposx,typ(t)\y2d[con4]+typ(t)\startposy,typ(t)\x2d[con1]+typ(t)\startposx,typ(t)\y2d[con1]+typ(t)\startposy) ;vier
    Next
    
  Next
  StopDrawing()
EndProcedure

Procedure texture();3d sprites rauftransformen
  Start3D()
  ;Sprite3DBlendingMode(15,9)
  For t=1 To anzahl
    
    For n=1 To 6 ;seiten
      con1=typ(t)\con1[n]
      con2=typ(t)\con2[n]
      con3=typ(t)\con3[n]
      con4=typ(t)\con4[n]
      If typ(t)\x2d[con1]>typ(index)\x2d[con2]
        TransformSprite3D(n, typ(t)\x2d[con2], typ(t)\y2d[con2], typ(t)\x2d[con1], typ(t)\y2d[con1], typ(t)\x2d[con4], typ(t)\y2d[con4], typ(t)\x2d[con3], typ(t)\y2d[con3])
        TransformSprite3D(spr3d, typ(t)\x2d[con2], typ(t)\y2d[con2], typ(t)\x2d[con1], typ(t)\y2d[con1], typ(t)\x2d[con4], typ(t)\y2d[con4], typ(t)\x2d[con3], typ(t)\y2d[con3])
      EndIf
      If typ(t)\y2d[con4]<typ(t)\y2d[con2]
        TransformSprite3D(n, typ(t)\x2d[con1], typ(t)\y2d[con1], typ(t)\x2d[con4], typ(t)\y2d[con4], typ(t)\x2d[con3], typ(t)\y2d[con3], typ(t)\x2d[con2], typ(t)\y2d[con2])
        TransformSprite3D(spr3d, typ(t)\x2d[con1], typ(t)\y2d[con1], typ(t)\x2d[con4], typ(t)\y2d[con4], typ(t)\x2d[con3], typ(t)\y2d[con3], typ(t)\x2d[con2], typ(t)\y2d[con2])
      EndIf
      If typ(t)\y2d[con4]>typ(t)\y2d[con2]
        TransformSprite3D(n, typ(t)\x2d[con3], typ(t)\y2d[con3], typ(t)\x2d[con2], typ(t)\y2d[con2], typ(t)\x2d[con1], typ(t)\y2d[con1], typ(t)\x2d[con4], typ(t)\y2d[con4])
        TransformSprite3D(spr3d, typ(t)\x2d[con3], typ(t)\y2d[con3], typ(t)\x2d[con2], typ(t)\y2d[con2], typ(t)\x2d[con1], typ(t)\y2d[con1], typ(t)\x2d[con4], typ(t)\y2d[con4])
      EndIf
      mittelwert=(Round(typ(t)\x2d[con1],1)+Round(typ(t)\x2d[con2],1)+Round(typ(t)\x2d[con3],1)+Round(typ(t)\x2d[con4],1))/4
      DisplaySprite3D(n,typ(t)\startposx,typ(t)\startposy,255)
      DisplaySprite3D(spr3d,typ(t)\startposx,typ(t)\startposy,100+mittelwert*3/4);lichttextur
    Next
    
  Next
  Stop3D()
EndProcedure

0

302

Пётр написал(а):

В КоАрхиве есть несколько примеров, вот один из них:

Супер, очень красиво!!! Команда получается мего полезная!!! Спасибо!!! :flag:

Во вкладке Инструменты\просмотр структур\константы, есть множество констант, которые можно использовать в PB, а есть ли где-нибудь описание, зачем каждая из них нужна, а то в справке вроде совершенно другие константы описаны…? И по встроенным интерфейсам и структурам, есть какая «справка»?:question:

Отредактировано Lucagin (13.02.2011 23:58:26)

0

303

Там константы из библиотеки PB, пользовательских библиотек и подавляющее большинство - API константы. Последние можно "вбивать в " поисковик, скажем, гугл и искать инфу.
Например, #WM_MOUSEMOVE

Код:
И по встроенным интерфейсам и структурам, есть какая «справка»?

Если они из API операционки, то тоже ищем описание в гугле.
Например RECT

0

304

Пётр написал(а):

Если они из API операционки, то тоже ищем описание в гугле.

Понял, Спасибо!!!

0

305

А нет-ли в PB такой функции чтоб NOD (наименьший общий делитель) вычислять?

0

306

Илья написал(а):

А нет-ли в PB такой функции чтоб NOD (наименьший общий делитель) вычислять?

Может быть  «наибольший общий делитель», а то наименьший всегда будет 1… :о) На 1-цу делятся все и из целых он явно будет наименьший…
Прямой функции вроде нет, но есть оператор %, который делит два числа и возвращает остаток от деления. Соответственно, если возвращает 0, то делится на цело, если не 0, то не делится на цело. Думаю логика понятна, а дальше уже не проблема написать твой расчет…

Вот один из способов посчитать:

Код:
a=500
b=2500
c=1720
d=30020

v=a
If v>=b : v=b
ElseIf v>=c : v=c  
ElseIf v>=d : v=d
EndIf 
  For NOD=v To 1 Step -1
    If a%NOD=0 And b%NOD=0 And c%NOD=0 And d%NOD=0
      Debug NOD
      Break      
    EndIf
  Next

Если значений гораздо больше, то можно создать массив по числу  значений и сравнивать уже не отдельные переменные, а члены массива. Я не уверен, что мой алгоритм наиболее рациональный. Вот пара ссылок, где вероятно считают более правильно…
"http://ru.wikipedia.org/wiki/Алгоритм_Евклида"
"http://otvety.google.ru/otvety/thread?tid=285af8feb08c1e79&table=%2Fotvety%2F"

Отредактировано Lucagin (14.02.2011 03:32:17)

0

307

Ага, спасибо

0

308

Код:
t$="2.6"
x.f=ValF(t$)
Debug t$
Debug x.f

здесь должно быть x.f равно t$
но это не так.
А почему, как уровнять?

0

309

Илья написал(а):

А почему, как уровнять?

Можно так, но это не будут чистые 2.6

Код:
t$="2.6"
x.d=ValD(t$)
Debug t$
Debug x

Дело в том, что данные хранятся не в десятичном представлени, а в двоичном, со всеми вытекающими....

0

310

Можно так, но это не будут чистые 2.6

но результаты всёравно не равны...

t$=2.6
x.d=2.6000000000000001

Отредактировано Илья (15.02.2011 00:15:39)

0

311

Илья написал(а):

но результаты всёравно не равны...
t$=2.6
x.d=2.6000000000000001

Для  программных вычислений они равны, а если ты хочешь чтобы они выводились одинаково, то можно сделать так:

Код:
t$="2.6"
x1.f=ValF(t$)
x2.d=ValD(t$)

Debug t$
Debug StrF(x1,1)
Debug StrD(x2,1)

Отредактировано Lucagin (15.02.2011 00:23:09)

0

312

Lucagin написал(а):

Для  программных вычислений они равны, а если ты хочешь чтобы они выводились одинаково, то можно сделать так:

Понимаетели что, дело в том что я пишу программу в которой это t$ не жосткозаданое, а пользователь в начале программы сам вводит это t$. И он может ввести какое угодно число, допустим он жочет чтоб t$ была не 2.6, а 2.60. И тогда программа уже будет работать не правильно.

А мне нужно чтоб в x.d записыволось именно то, что я ввёл в t$.

0

313

Илья написал(а):

но результаты всёравно не равны

Я уже написал порчему

Пётр написал(а):

Дело в том, что данные хранятся не в десятичном представлени, а в двоичном, со всеми вытекающими

Это особенность всех компов.
Для них десятичная логика не является нативной, для них "родная" двоичная логика.

0

314

Илья написал(а):

Понимаетели что, дело в том что я пишу программу в которой это t$ не жосткозаданое, а пользователь в начале программы сам вводит это t$. И он может ввести какое угодно число, допустим он жочет чтоб t$ была не 2.6, а 2.60. И тогда программа уже будет работать не правильно.
А мне нужно чтоб в x.d записыволось именно то, что я ввёл в t$.

Используй команды для работы со  строкой и анализируй введенное число-строку, т.е. сколько есть символов после символа «точка» или сколько нулей, если их надо отбросить, и потом в команде Result$ = StrD(Value.d [, NbDecimal]) , значение NbDecimal установи  то, которое ты определишь при анализе строки введеной пользователем…
Вот здесь Вопросы новичка (продолжение…)  (пост 294), Пётр приводил пример, как отбрасывать ненужные нули, при анализе строки…

Отредактировано Lucagin (15.02.2011 00:43:15)

0

315

Пётр, подскажи пожалуйста, если делать лабиринт с использованием спрайтов, то какой алгоритм положить в основу непроницаемости стенки лабиринта для спрайта-курсора??? Анализ цвета линии  рядом со спрайтом или сами стенки лабиринта рисовать из спрайтов (тонкие линии в каждом квадрате поля), и анализировать их пересечение???
Если помнишь, когда делал анализ цвета в окне, курсор «просачивался» сквозь линию даже толщиной  в 5-ть пикселей, не получится ли при использовании режима «OpenScreen» и спрайт-курсора  таже история??? :question:

0

316

Lucagin написал(а):

какой алгоритм положить в основу непроницаемости стенки лабиринта

Где-то (массив, динамический список) должны храниться координаты стенок лабиринта. Их нужно сравнивать с текущим положением курсора.

0

317

Пётр написал(а):

Где-то (массив, динамический список) должны храниться координаты стенок лабиринта. Их нужно сравнивать с текущим положением курсора.

Xм, а я при построении лабиринта, в массив запоминал X1Y1иX2Y2 тех стенок квадратов поля, где стенки нет, потом из заранее нарисованного поля квадратов убирал ненужные стенки..
А тут мне получается надо наоборот сгенерировать новый массив, где запоминать координаты каждого пикселя видимой стенки в каждом квадрате и потом при изменении X И Y курсора-спрайта каждый раз пробегать всё это множество значений координат пикселей стенок?
А думаешь если просто смотреть цвет вокруг курсора-спрайта, то опять получатся проход сквозь стенку???
В принципе,  массив с координатами пикселей видимых стенок, можно составить, применив команду Point() для всего поля лабиринта, при условии что цвет стенок будет уникален, и потом при перемещении курсора, каждый раз пробегать этот массив, другое, на сколько все это быстро получится…???

Отредактировано Lucagin (15.02.2011 20:43:20)

0

318

Lucagin написал(а):

А думаешь если просто смотреть цвет вокруг курсора-спрайта, то опять получатся проход сквозь стенку???

Надо пробовать.

Lucagin написал(а):

В принципе,  массив с координатами пикселей видимых стенок, можно составить, применив команду Point() для всего поля лабиринта, при условии что цвет стенок будет уникален, и потом при перемещении курсора, каждый раз пробегать этот массив, другое, на сколько все это быстро получится…???

Перебор массива производится довольно быстро.

0

319

Пётр написал(а):

Перебор массива производится довольно быстро.

Вобщем понял, надо пробовать...

0

320

Здравствуйте, у меня пару вопросов на счёт компиляции, не получается скомпилировать приложение на Mac OS, есть приложение, которое работает с БД (БД в виде excel файла), через библиотеки ADOmate и COMatePLUS, когда компилирую на Mac, компилятор видит эти две библиотеки, но выдаёт сообщение об ошибке: "line 90: structure not found: ID spatsh"и строку он выделяет именно в библиотеке COMatePLUS. Из-за чего это может быть и как это можно исправить?
И ещё вопрос, кто нибудь пытался скомпилировать приложение на Linux, где использовались библиотеки ADOmate и COMatePLUS? И скомпилируется ли приложение, если БД выполнена в виде excel файла? (сам пользователь БД открывать не должен, с ней только приложение работает).

Отредактировано goodwen (16.02.2011 17:37:10)

0

321

Насчет библиотеки ADOmate не знаю (не пользовался), а COMatePLUS предназначена только для Windows.
В Linux и Mac OS работать не будет.

0

322

Пётр, а какие есть библиотеки под Linux, для работы с БД (подключение и запросы)? И есть ли библиотеки для работы с БД, которые одновременно подойдут и для Windows и для Linux?

0

323

goodwen написал(а):

Пётр, а какие есть библиотеки под Linux, для работы с БД (подключение и запросы)? И есть ли библиотеки для работы с БД, которые одновременно подойдут и для Windows и для Linux?

Насколько мне известно, только встроенная http://purebasic.com/documentation/database/index.html
Может есть другие, не интересовался.

0

324

скажите пожалуйста,как в браузере отслеживать загруженную страницу и переходить по ней, и второй вопрос как осуществить клик по коорднатам?

0

325

Пётр

У тебя есть опыт с библиотекой "cairo"? Всё что нашел путного это gnome.org.ru/wacko/razrabotka/vidzhetycairo/chast'1, вот, вот и вот. Если не затруднит и знаешь Си, помоги въехать как с этим работать (очень хочется разобраться) :question:

0

326

lakomet написал(а):

Пётр
У тебя есть опыт с библиотекой "cairo"?

Нету.
Первый раз о ней слышу.

0

327

Почитай по ссылкам, хорошая библиотека(кросплатформенная). С её помощью можно прикрутить векторную графику, PDF PostScript и  т.д. Незнаю почему Фред до сих пор её не прикрутил к пурику :mad:
Если сможешь помоги вкурить как ей пользоваться.

0

328

что мне нужно почитать что бы сделать, то что мне нужно.

0

329

Arei написал(а):

скажите пожалуйста,как в браузере отслеживать загруженную страницу и переходить по ней

Когда страница загружена, посылается сообщение #PB_EventType_DownloadEnd
Переход на страницу по ссылке

Код:
SetGadgetText(#WebGadget, "Адрес ссылки")
Arei написал(а):

как осуществить клик по коорднатам

Миллион раз обсуждалась тема кликов, к примеру Работа с мышью

0

330

а как его принять извините, но я что то не понимаю, а с клтками разобрался спасибо.

0


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Вопросы новичка (продолжение…)