purebasic.info

PureBasic forum
Текущее время: Чт янв 17, 2019 1:41 am

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 6 ] 
Автор Сообщение
 Заголовок сообщения: 2D освещение
СообщениеДобавлено: Ср ноя 02, 2011 1:00 pm 
Не в сети
GameC@Soft
Аватар пользователя

Зарегистрирован: Сб сен 22, 2007 12:45 pm
Сообщений: 1084
Откуда: Я из лесу вышел, и сразу зашел, в босоножках дырявых и взлядом ночным.
Благодарил (а): 1 раз.
Поблагодарили: 2 раз.
Пункты репутации: 0
В общем пришла идея сделать освещение))

вот примерная реализация это задумки. Если ее оптимизировать, то для игр в подземелье самое то!

Изображение

Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
 
InitSprite()
InitSprite3D()
InitKeyboard()
OpenWindow(0,100,100,800,600,"Light")
OpenWindowedScreen(WindowID(0),0,0,800,600,0,0,0)
Structure foton
  x.f
  y.f
  size.l
  life.l
  a.f
EndStructure  
 
Structure Light
  id.l
  x.l
  y.l
  life.l
  size.l
  List foton.foton()
EndStructure
 
Structure stena
  id.l
  x.l
  y.l
  s.l
EndStructure
 
Global NewList s.stena()
 
For i=0 To 200
  AddElement(s())
  ix=Random(800)/32
  iy=Random(600)/32
s()\x=Random(800)
s()\y=Random(600)
s()\s=32
s()\id=CreateSprite(#PB_Any,32,32)
Next
 
CatchSprite(0,?b1)
 
 
 
Global NewList light.light(),LightB
 
Procedure InitLight()
  LightB=CreateSprite(#PB_Any,800,600,#PB_Sprite_Texture)
  CreateSprite3D(0,LightB)
  LightC=2
EndProcedure
 
Procedure ExamineLight()
  Start3D()
    Sprite3DBlendingMode(9,8)
    DisplaySprite3D(LightC,0,0)
  Stop3D()
  StartDrawing(SpriteOutput(LightB))
    Box(0,0,800,600,RGB(0,0,0))
  StopDrawing()
  ForEach Light()
    With light()
      c.f=(359/50)
      If ListSize(light()\foton())<50
      For i=1 To 51
        AddElement(light()\foton())
        \foton()\life=\life
        \foton()\size=\size
        \foton()\x=\x
        \foton()\y=\y
        \foton()\a=c*i
      Next
      EndIf
    EndWith
  Next
EndProcedure
 
Procedure AddLight(id, x, y, life, size)
 
  AddElement(light())
    With light()
      \x=x
      \y=y
      \id=id
      \life=life
      \size=size
    EndWith
 
EndProcedure
 
Procedure DrawLight(id,x,y)
  StartDrawing(SpriteOutput(LightB))
  ForEach Light()
    If light()\id=id
    light()\x=x
    light()\y=y
    With light()
      While ListSize(\foton())>0
      ForEach \foton()
        \foton()\x=\foton()\x+Cos(\foton()\a*| style="color: #924B72;">#PI/180)*(\foton()\size)
        \foton()\y=\foton()\y+Sin(\foton()\a*| style="color: #924B72;">#PI/180)*(\foton()\size)
        \foton()\life-(\foton()\size/2)
        ForEach s()
          If \foton()\x<s()\x+s()\s And \foton()\x>s()\x
            If \foton()\y<s()\y+s()\s And \foton()\y>s()\y
              \foton()\life=0
            EndIf
          EndIf
        Next
        If \foton()\life>0
          cof=(255/light()\life)*\foton()\life
          Circle(\foton()\x,\foton()\y,\foton()\size,RGB(cof,cof,cof))
        EndIf
        If \foton()\life<=0
          DeleteElement(\foton())
        EndIf
      Next
      Wend
    EndWith
    EndIf
  Next
  StopDrawing()
EndProcedure
 
Procedure FPS()
  Shared s, fps
  ss=Second(Date())
  fps+1
  If s<>ss
    s=ss
    SetWindowTitle(0,"Свет   FPS: "+Str(FPS))
    fps=0
  EndIf
EndProcedure
 
InitLight()
AddLight(1, 400, 300, 50, 10)
AddLight(2, 400, 300, 50, 10)
 
ForEach s()
  StartDrawing(SpriteOutput(s()\id))
    Box(0,0,64,64,RGB(255,Random(255),0))
  StopDrawing()
Next
 
Repeat
  FPS()
  event=WaitWindowEvent(1)
  FlipBuffers()
  ClearScreen(RGB(0,0,0))
 
  ExamineKeyboard()
 
  For x=0 To 800 Step 146
  For y=0 To 600 Step 146
    DisplaySprite(0,x,y)
  Next
  Next
 
  ForEach s()
    DisplaySprite(s()\id,s()\x, s()\y)
  Next
 
  ExamineLight()
 
  DrawLight(2,400, 300)
 
  x=WindowMouseX(0)
  y=WindowMouseY(0)
  DrawLight(1,x,y)
 
 
 
 
  If event=#WM_CLOSE Or KeyboardPushed(#PB_Key_Escape)
    q=1
  EndIf
 
Until q=1
End
 
DataSection
b1:
IncludeBinary "1.bmp"
EndDataSection
 



Вложения:
light2v3.rar [97.4 KiB]
Скачиваний: 106

_________________
"Самый большой глюк в PureBasic - это твоя голова...." (с) Артем
Мой сайт: http://feelzone.org.ua/
Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср дек 07, 2011 6:49 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Сб авг 18, 2007 6:26 pm
Сообщений: 605
Откуда: Северодвинск/Питер
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Ещё одна реализация довольно известной идеи :)
Причём ты тоже пошел путём трассировки лучей :)

Вот, кстати, подобная тема. На 7ой странице и я отметился =)

_________________
http://www.youtube.com/watch?v=XHosLhPEN3k


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср дек 07, 2011 9:00 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Пт окт 31, 2008 4:49 pm
Сообщений: 717
Благодарил (а): 1 раз.
Поблагодарили: 4 раз.
Пункты репутации: 0
Да, реалистичные тени мне бы пригодились. А то рисую черные спрайты со сдвигом.

_________________
мой форум http://spaceminers.mybb2.ru
Dungeon Raider (Ogre). Game video: http://www.youtube.com/watch?v=ZlhBgPJhAxI


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт дек 08, 2011 6:20 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Сб авг 18, 2007 6:26 pm
Сообщений: 605
Откуда: Северодвинск/Питер
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Что у Артёма, что у меня, не используется отражение/преломление, в связи с чем профит от прямой трассировки, в принципе, теряется. Проще делать обратную трасировку(для каждой клетки светового поля, проверить, нет ли препятствия между ней и источником) или даже хитрый финт ушами вроде поиска в ширину по графу(в зависимости от выбранной весовой функции можно получить и подобие непрямого освещения(свет в тех местах, куда он может попать только с отражениями) и откровенную ерунду, наверное :) ).

Ну а вообще все эти приблуды имеют смысл, если тени как-то влияют на геймплей...

_________________
http://www.youtube.com/watch?v=XHosLhPEN3k


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вс янв 15, 2012 4:33 pm 
Не в сети
студент

Зарегистрирован: Вс янв 15, 2012 4:27 pm
Сообщений: 1
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
У меня нормально все получилось http://bisik.ru

_________________
Жизнь прекрасна, когда все хорошо! http://bisik.ru


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: 2D освещение
СообщениеДобавлено: Чт окт 25, 2018 1:16 pm 
Не в сети
доцент
Аватар пользователя

Зарегистрирован: Чт ноя 04, 2010 3:01 pm
Сообщений: 73
Благодарил (а): 9 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Жаль в примере не суммируются наложения перекрёстных лучей...
Когда-то делал что-то подобное, только это конечно совсем не идёт в сравнение...
Пример, ролик на Ютюб: https://youtu.be/3O3nMcfafkg

У меня была мысль создавать маску от всех источников света отмечая эти места тёмными сферами на отдельной палитре, потом инвертировать маску и накладывать поверх игрового поля...
Только вот так руки и не дошли...


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 6 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB