purebasic.info

PureBasic forum
Текущее время: Вс июл 22, 2018 12:00 pm

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




Начать новую тему Ответить на тему  [ Сообщений: 33 ]  На страницу Пред.  1, 2, 3  След.
Автор Сообщение
 Заголовок сообщения:
СообщениеДобавлено: Чт янв 15, 2009 5:39 am 
Не в сети
eternal student
Аватар пользователя

Зарегистрирован: Ср ноя 05, 2008 1:35 am
Сообщений: 447
Откуда: Екатеринодар
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
В деревне Кобылино, это верх приличия...

_________________
CQ DX...


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

Зарегистрирован: Сб авг 18, 2007 6:26 pm
Сообщений: 605
Откуда: Северодвинск/Питер
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
22vlad писал(а):
да, любые колебания - затухающие, если нет источника энергии

Ну не совсем. Если нет потери энергии - могут быть и незатухающими(допустим, маятник без трения)...

pentod65 писал(а):
Не согласен с вами батенька, существует очень много

неучтенных законов, присутствующих в той же чорной

дыре, где наша с вами физика, заблуждение.

Ну, вообще чёрная дыра вполне сблюдает законы физики =) Хотя, что происходит за горизонтом событий - вопрос.

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


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт янв 16, 2009 2:09 am 
Не в сети
eternal student
Аватар пользователя

Зарегистрирован: Ср ноя 05, 2008 1:35 am
Сообщений: 447
Откуда: Екатеринодар
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Хм, замечательный ответ, краткий и тонко осмысленный. А я, где то,
что то такое и имел в виду, типа сверхпроводника.
Кстати All_Creater, давай вернемся к нашим э-э, звездочкам. Ну с
ними более ли менее понятно, но вот на горизонте появились
вопросики и собачки, бог ты мой. Надо наверно перейдти в тему,
где это обсуждалось.

_________________
CQ DX...


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт янв 16, 2009 5:35 pm 
Не в сети
профессор
Аватар пользователя

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

Эээ, вот если бы я не знал, что в пурике есть операторы @, ? и *, заподозрил бы, что пишет человек звезданутый :roll: К счастью, всё в порядке, это пурик у нас звезданутый, как и засобаченный и вопросительный =)

А если серьёзно(надеюсь, никого не обидел, просто шутка юмора :oops: ), то @ - это что-то вроде функции, возвращающей адрес чего-то(процедуры, переменной, массива, или, в моём случае, элемента связанного списка). В отличие от *, которая является не оператором, а признаком того, что переменная является указателем(примерно так же организовано в Си, только * там оператор, противоположный & - аналогу "собаки". То есть в Си *переменная предолгает, что в переменной хранится адрес и пытается достать что-то из этого адреса. А & перед переменной наоборот говорит, передать не переменую, а её адрес.) В пурике примерно то же самое.

С вопросиком тоже нет проблем. Вопрос - это тоже адрес, только адрес не переменной, функции и тд, а адрес метки. Таким образом, например, можно считать собственный программный код прямо из оперетивной памяти, или запихнуть в экзешник файлы(например, для загрузки картинок прямо из памяти используется функция CatchImage.)

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


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Сб янв 17, 2009 4:55 am 
Не в сети
eternal student
Аватар пользователя

Зарегистрирован: Ср ноя 05, 2008 1:35 am
Сообщений: 447
Откуда: Екатеринодар
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Ага, @-адрес, а читает оттуда PEEK, да? Хм, вот если бы при помощи
указателей, можно бы было организовать поименную загрузку
текстуры, как к примеру на Blitz'е(startex=LoadTex("star.bmp")), а
то с циферной определенная путаница получается. Да и пол-слова
о связанных списках, если можно.

_________________
CQ DX...


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

Зарегистрирован: Сб авг 18, 2007 6:26 pm
Сообщений: 605
Откуда: Северодвинск/Питер
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
pentod65 писал(а):
Ага, @-адрес, а читает оттуда PEEK, да?

Да, то, что лежит в памяти по этому адресу, можно считать через Peek. Но есть более удобный способ, если данные структурированные(именно его я и использую...) - создать переменную-указатель на структуру, и просто приравнять *переменная = @что-то. Вместо @что-то может быть и число, и переменная.. Короче, тут главное - чтобы адрес был действительным, иначе будет ошибка доступа к памяти(и стандартное Window'ское сообщение - "Программа выполнила недопустимую оперцию - память не может быть read"). В общем, тут не происходит копирования данных(а потому операция доступа осуществляется быстро) - вроде как переменная и находится там, куда её послали... =)
pentod65 писал(а):
Хм, вот если бы при помощи

указателей, можно бы было организовать поименную загрузку

текстуры, как к примеру на Blitz'е(startex=LoadTex("star.bmp")), а

то с циферной определенная путаница получается.

Возможно всё, тем более через указатели. Если я тебя правильно понял, ты хочешь обращаться к текстуре не о номеру, а по имени? Не уверен, что это хорошая идея - поиск данных - довольно медленная операция(хотя можно оптимизировать, например, через двоичное дерево). Так что ты вполне можешь написать функцию, которая будет заносить имена текстур(напоминаю полезность - если при LoadSprite и других Лоадах писать вместо номера константу #PB_Any, функция вернет номер, куда записала текстуру.) в базу данных (идеально подходит всё тот же связанный список), и функицю, которая будет возвращать номер текстуры по имени =)

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


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср янв 21, 2009 4:41 am 
Не в сети
eternal student
Аватар пользователя

Зарегистрирован: Ср ноя 05, 2008 1:35 am
Сообщений: 447
Откуда: Екатеринодар
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Какой же умный народ, бог мой. Аж стыдно, ковыряю, ковыряю
HELP'ер PB и толку мало, там так не пишут. И все таки, что значит связанные списки, в 2-х словах. Я тут в и-нете физику нашел,
с брошу может понадобится.


Вложения:
PhisiXSDKs.zip [581.11 KiB]
Скачиваний: 94

_________________
CQ DX...
Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Сб янв 24, 2009 3:43 pm 
Не в сети
профессор
Аватар пользователя

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

Вообще, главное преимущество списка - возможность храниь произвольное количество элементов. При создании списка он абсолютно пустой(и не занимает память!), по мере добавления элементов память занимается =) Напомню, массив для изменения количества элементо придётся постоянно переопределять, ведь массив - статическая структура данных. Для доступа к определенному элементу списка есть только два способа: первый - пройти по списку от первого элемента до Nного. Второй - непосредственно выбрать Nный элемент по его указателю(для этого надо знать указатель =)).
Также список удобен тем, что добавить новый элемент или убратьсуществующий можно откуда угодно. Не перераспределяя память(например, если в массиве мы хотим убрать элемент из середины, придётся сдвигать пол-массива!)

В Пурике на уровне синтаксиса языка уже реализован двусвязный список. Для управления им используется библиотеки из раздела LinkedList

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


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вс янв 25, 2009 1:52 am 
Не в сети
eternal student
Аватар пользователя

Зарегистрирован: Ср ноя 05, 2008 1:35 am
Сообщений: 447
Откуда: Екатеринодар
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Удобно, а я вот ошибся считал, что это как то связанно с массивами.
Спасибо. Еще, этот SDK, что выше он полностью на C, может в таком раскладе его можно приделать к PB или использовать, какие то функции от туда.

_________________
CQ DX...


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

Зарегистрирован: Ср апр 04, 2007 6:21 pm
Сообщений: 126
Откуда: Челябинская обл.
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Насчёт самой темы:
есть уже для телефона такая игрушка — Sola Rola, которая использует оригинальный 2D-движок и достаточно быстро работает (поддерживает круглые, неподвижные прямоугольные объекты, связи между объектами).

_________________
Loading... 99%


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн ноя 30, 2009 7:27 am 
Не в сети
профессор

Зарегистрирован: Вс окт 25, 2009 5:48 pm
Сообщений: 263
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Супер! Мне движок очень понравился. Я имею ввиду движок All_Creater


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн ноя 30, 2009 1:50 pm 
Не в сети
профессор
Аватар пользователя

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

Давно уже была игрушка Flexis для телефонов же... А вообще, есть же PhysX и Havoc, они явно лучше моего :) Вопрос в том, чтобы написать самому, а не юзать чужое.. =/

haav писал(а):
Супер! Мне движок очень понравился

Спасибо :) По идее, после ковыряния исходников Box2D я могу и более хороший двиг написать, наверное... Может быть, потом займусь =)

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


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт дек 03, 2009 5:04 am 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Сб авг 18, 2007 6:26 pm
Сообщений: 605
Откуда: Северодвинск/Питер
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 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
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
 
Procedure GetFPS()
  Static GetFPS_Count.l, GetFPS_FPS.l, GetFPS_Start.l
  GetFPS_Count + 1
  If GetFPS_Start = 0
    GetFPS_Start = ElapsedMilliseconds()
  EndIf
  If ElapsedMilliseconds() - GetFPS_Start >= 1000
    GetFPS_FPS   = GetFPS_Count
    GetFPS_Count = 0
    GetFPS_Start + 1000
  EndIf
  ProcedureReturn GetFPS_FPS
EndProcedure
 
#Obj_Flag_Immobility=1
#Obj_Flag_Unknown1 = 2
#Obj_Flag_Unknown2 = 4
#Obj_Flag_Unknown3 = 8
#Obj_Flag_Unknown4 = 16
#Obj_Flag_Unknown5 = 32
#Obj_Flag_Unknown6 = 64
#Obj_Flag_Unknown7 = 128
 
#Collision_Speed_K = 0.5
 
#Max_NumOfLinks = 10
Structure Ball
  X.f
  Y.f
  SX.f
  SY.f
 
  Radius.f
  Weight.f
 
  Elastify.f
  FLags.b
 
  NumOfLinks.b
  *Link.Link[#Max_NumOfLinks]
EndStructure
Structure Link
  Length.f
  Type.b
  MetaData.f[2]
  *Obj.ball[2]
EndStructure
 
Global NewList Obj.ball()
 
Procedure LinkObjs(*Obj1.Ball, *Obj2.Ball, LinkType.b, LinkParam1.f=0,LinkParam2.f=0) ; Устанавливает связь (джойнт) между объектами =)
  Protected *Link.Link
 
  If *Obj1 And *Obj2
    *Link=AllocateMemory(SizeOf(Link))
   
    *Link\Length=Sqr((*Obj1\X-*Obj2\X)*(*Obj1\X-*Obj2\X)+(*Obj1\Y-*Obj2\Y)*(*Obj1\Y-*Obj2\Y))
    *Link\Type=LinkType
    *Link\Obj[0]=*Obj1
    *Link\Obj[1]=*Obj2
   
    If *Obj1\NumOfLinks>=#Max_NumOfLinks:FreeMemory(*Link):ProcedureReturn 0:EndIf
    If *Obj2\NumOfLinks>=#Max_NumOfLinks:FreeMemory(*Link):ProcedureReturn 0:EndIf
   
    *Obj1\Link[*Obj1\NumOfLinks]=*Link
    *Obj1\NumOfLinks+1
   
    *Obj2\Link[*Obj2\NumOfLinks]=*Link
    *Obj2\NumOfLinks+1
   
    *Link\MetaData[0]=LinkParam1
    *Link\MetaData[1]=LinkParam2
     
    ProcedureReturn *Link
  Else
    ProcedureReturn 0
  EndIf
EndProcedure
 
Procedure SolveLinks(*Obj.Ball,dT.f=1.0) ;Просчитывает взаимодействия связей
  Protected *Link.link
  Protected Dist.f, dX.f, dY.f, dL.f
 
  For C=1 To *Obj\NumOfLinks
    *Link=*Obj\Link[C-1]
    If *Link
      If *Link\Obj[0] And *Link\Obj[1] And *Link\Type>0
        dX=*Link\Obj[0]\X - *Link\Obj[1]\X
        dY=*Link\Obj[0]\Y - *Link\Obj[1]\Y
        Dist=Sqr(dX*dX + dY*dY)
        dX=dX/(Dist+0.01)
        dY=dY/(Dist+0.01)
        dL=Dist - *Link\Length
       
        Select *Link\Type
        Case 1
          dL=dL+*Link\MetaData[1]
          *Link\Obj[0]\SX-dL*dX**Link\MetaData[0]*dT
          *Link\Obj[0]\SY-dL*dY**Link\MetaData[0]*dT
          *Link\Obj[1]\SX+dL*dX**Link\MetaData[0]*dT
          *Link\Obj[1]\SY+dL*dY**Link\MetaData[0]*dT
        EndSelect
      EndIf
    Else
      Continue
    EndIf
  Next
EndProcedure
 
Procedure RenderObj(*Obj.ball); Рисует объект.
  Circle(*Obj\X, *Obj\Y, *Obj\Radius, RGB(255,0,0))
 
  For C = 0 To *Obj\NumOfLinks-1;#Max_NumOfLinks-1
    If *Obj\Link[C]
      *Link.Link = *Obj\Link[C]
      If *Link\Obj[0] And *Link\Obj[1]
        LineXY(*Link\Obj[0]\X, *Link\Obj[0]\Y, *Link\Obj[1]\X, *Link\Obj[1]\Y, RGB(64,64,64))
      EndIf
    EndIf
  Next
EndProcedure
 
Procedure SolveCollisions(*Obj.ball,dT.f=1.0) ;Ищет пересечения, и, если они есть, обрабатывает.
  Protected dX.f, dY.f, Dist.f
  Protected Last=@Obj()
 
  If *Obj\Flags & #Obj_Flag_Immobility
    ProcedureReturn 0
  EndIf
 
  While NextElement(Obj())
    If *Obj <> @Obj()
      dX=-(*Obj\X - Obj()\X)
      dY=-(*Obj\Y - Obj()\Y)
      Dist = Sqr(dX*dX + dY*dY)
     
      Overlay.f = (*Obj\Radius + Obj()\Radius) - Dist
      If Overlay>=0
        dX=dX/(Dist+0.01):dY=dY/(Dist+0.01); Нормализация вектора
       
        If Obj()\Flags & #Obj_Flag_Immobility
          *Obj\X-dX*Overlay
          *Obj\Y-dY*Overlay
          *Obj\SX+dX*| style="color: #924B72;">#Collision_Speed_K*dT
          *Obj\SY+dY*| style="color: #924B72;">#Collision_Speed_K*dT
        Else
          *Obj\X-dX*(Overlay/2)
          *Obj\Y-dY*(Overlay/2)
          *Obj\SX+dX*| style="color: #924B72;">#Collision_Speed_K*dT
          *Obj\SY+dY*| style="color: #924B72;">#Collision_Speed_K*dT
          Obj()\X+dX*(Overlay/2)
          Obj()\Y+dY*(Overlay/2)
          Obj()\SX-dX*| style="color: #924B72;">#Collision_Speed_K*dT
          Obj()\SY-dY*| style="color: #924B72;">#Collision_Speed_K*dT
        EndIf
        Velocity1.f=(*Obj\SX*dX + *Obj\SY*dY)
        Velocity2.f=(Obj()\SX*dX + Obj()\SY*dY)
       
        E.f = (Obj()\Elastify + *Obj\Elastify)/2
       
        FinalVelocity1.f=((*Obj\Weight-E*|!REG3XP3!>Obj()\Weight)*Velocity1+(1+E)*|!REG3XP3!>Obj()\Weight*Velocity2)/(*Obj\Weight+Obj()\Weight)
        FinalVelocity2.f=((Obj()\Weight-E**Obj\Weight)*Velocity2+(1+E)**Obj\Weight*Velocity1)/(*Obj\Weight+Obj()\Weight)  
       
        *Obj\SX=*Obj\SX+(FinalVelocity1-Velocity1)*dX
        *Obj\SY=*Obj\SY+(FinalVelocity1-Velocity1)*dY
       
        Obj()\SX=Obj()\SX+(FinalVelocity2-Velocity2)*dX
        Obj()\SY=Obj()\SY+(FinalVelocity2-Velocity2)*dY
      EndIf
    EndIf
  Wend
  ChangeCurrentElement(Obj(), Last)
EndProcedure
 
Procedure SolveMotion(*Obj.Ball,dT.f=1.0);Просчитывает движение
  If *Obj\Flags & #Obj_Flag_Immobility
    *Obj\SX=0
    *Obj\SY=0
  Else
    *Obj\X = *Obj\X+*Obj\SX*dT
    *Obj\Y = *Obj\Y+*Obj\SY*dT
   
    Falloff.f = Pow(0.99,dT)
    *Obj\SX=*Obj\SX*Falloff;Сопростивление воздуха
    *Obj\SY=*Obj\SY*Falloff;Сопростивление воздуха
  EndIf
EndProcedure
 
Procedure AddObject(X.f, Y.f, Weight.f, Radius.f, E.f=0.5,Flags=0) ;написана для упрощения добавления объекта =)
  If AddElement(Obj())
    Obj()\X=X
    Obj()\Y=Y
    Obj()\Elastify = E
    Obj()\Radius=Radius
    Obj()\Weight=Weight
    Obj()\Flags=Flags
    ProcedureReturn @Obj()
  Else
    ProcedureReturn 0
  EndIf
EndProcedure
 
 
Global SW=GetSystemMetrics_(#SM_CXSCREEN)
Global SH=GetSystemMetrics_(#SM_CYSCREEN)
 
InitSprite()
InitKeyboard()
InitMouse()
OpenScreen(SW, SH, 32, "")
 
;{ Создаём мир
Last=AddObject(C,100,10,5,0.3,#Obj_Flag_Immobility)
For C=15 To SW Step 30
  AddObject(C,100+Sin((C*3.1415)/SW)*200,5,5,0.3)
  LinkObjs(@Obj(),Last,1,0.3,0.0)
  Last=@Obj()
Next
Obj()\Flags=#Obj_Flag_Immobility
 
For I=0 To 35
  AddObject(5+SW*I/30 + 1-Random(2000)/1000, 30, 10, 25+Random(10), 0.3)
Next
 
;Кубик
o1 = AddObject(200, 400, 5, 15)
o2 = AddObject(300, 400, 5, 15)
o3 = AddObject(300, 500, 5, 15)
o4 = AddObject(200, 500, 5, 15)
LinkObjs(o1, o2, 1, 0.5)
LinkObjs(o2, o3, 1, 0.5)
LinkObjs(o3, o4, 1, 0.5)
LinkObjs(o4, o1, 1, 0.5)
LinkObjs(o1, o3, 1, 0.5)
LinkObjs(o2, o4, 1, 0.5)
 
;упругий сложный куб =)
o1 = AddObject(600, 400, 5, 15)
o2 = AddObject(650, 400, 5, 15)
o3 = AddObject(700, 400, 5, 15)
o4 = AddObject(700, 450, 5, 15)
o5 = AddObject(700, 500, 5, 15)
o6 = AddObject(650, 500, 5, 15)
o7 = AddObject(600, 500, 5, 15)
o8 = AddObject(600, 450, 5, 15)
LinkObjs(o1, o2, 1, 0.5)
LinkObjs(o2, o3, 1, 0.5)
LinkObjs(o3, o4, 1, 0.5)
LinkObjs(o4, o5, 1, 0.5)
LinkObjs(o5, o6, 1, 0.5)
LinkObjs(o6, o7, 1, 0.5)
LinkObjs(o7, o8, 1, 0.5)
LinkObjs(o8, o1, 1, 0.5)
LinkObjs(o1, o5, 1, 0.5)
LinkObjs(o3, o7, 1, 0.5)
LinkObjs(o2, o4, 1, 0.5)
LinkObjs(o4, o6, 1, 0.5)
LinkObjs(o6, o8, 1, 0.5)
LinkObjs(o8, o2, 1, 0.5)
 
;Жесткий сложный куб
o1 = AddObject(800, 400, 5, 15)
o2 = AddObject(850, 400, 5, 15)
o3 = AddObject(900, 400, 5, 15)
o4 = AddObject(900, 450, 5, 15)
o5 = AddObject(900, 500, 5, 15)
o6 = AddObject(850, 500, 5, 15)
o7 = AddObject(800, 500, 5, 15)
o8 = AddObject(800, 450, 5, 15)
LinkObjs(o1, o2, 1, 0.5)
LinkObjs(o2, o3, 1, 0.5)
LinkObjs(o3, o4, 1, 0.5)
LinkObjs(o4, o5, 1, 0.5)
LinkObjs(o5, o6, 1, 0.5)
LinkObjs(o6, o7, 1, 0.5)
LinkObjs(o7, o8, 1, 0.5)
LinkObjs(o8, o1, 1, 0.5)
LinkObjs(o1, o5, 1, 0.5)
LinkObjs(o3, o7, 1, 0.5)
LinkObjs(o2, o4, 1, 0.5)
LinkObjs(o4, o6, 1, 0.5)
LinkObjs(o6, o8, 1, 0.5)
LinkObjs(o8, o2, 1, 0.5)
LinkObjs(o2, o6, 1, 0.5)
LinkObjs(o4, o8, 1, 0.5)
 
;Мягкий сложный куб
o1 = AddObject(400, 400, 5, 10)
o2 = AddObject(450, 400, 5, 10)
o3 = AddObject(500, 400, 5, 10)
o4 = AddObject(400, 450, 5, 10)
o5 = AddObject(450, 450, 5, 10)
o6 = AddObject(500, 450, 5, 10)
o7 = AddObject(400, 500, 5, 10)
o8 = AddObject(450, 500, 5, 10)
o9 = AddObject(500, 500, 5, 10)
LinkObjs(o1, o2, 1, 0.2)
LinkObjs(o1, o4, 1, 0.2)
LinkObjs(o2, o3, 1, 0.2)
LinkObjs(o2, o5, 1, 0.2)
LinkObjs(o3, o6, 1, 0.2)
LinkObjs(o4, o5, 1, 0.2)
LinkObjs(o4, o7, 1, 0.2)
LinkObjs(o5, o6, 1, 0.2)
LinkObjs(o5, o8, 1, 0.2)
LinkObjs(o6, o9, 1, 0.2)
LinkObjs(o7, o8, 1, 0.2)
LinkObjs(o8, o9, 1, 0.2)
;Закомментировать - станет аморфным :)
LinkObjs(o1, o5, 1, 0.2)
LinkObjs(o4, o8, 1, 0.2)
LinkObjs(o2, o6, 1, 0.2)
LinkObjs(o5, o9, 1, 0.2)
LinkObjs(o2, o4, 1, 0.2)
LinkObjs(o5, o7, 1, 0.2)
LinkObjs(o3, o5, 1, 0.2)
LinkObjs(o6, o8, 1, 0.2)
 
mouse = AddObject(SW/2,500,10,20,0.5)
;}
 
 
DeltaTime.f=1.0 ; Интервал временного интегрирования.
Repeat
  ExamineKeyboard()
  ExamineMouse()
  ClearScreen(0)
 
  If mouse
    ChangeCurrentElement(Obj(),mouse)
    ;Obj()\X + MouseDeltaX()/10
    ;Obj()\Y + MouseDeltaY()/10
    Obj()\SX + MouseDeltaX()/100
    Obj()\SY + MouseDeltaY()/100
  EndIf
 
  ForEach Obj()
    Obj()\SY+0.04*DeltaTime ;Гравитация
   
    ;{ Ограничения по экрану
    If Obj()\Y+Obj()\Radius>SH
      Obj()\Y=SH-Obj()\Radius
      Obj()\SY*(-1)
    EndIf
   
    If Obj()\X-Obj()\Radius<0
      Obj()\X=Obj()\Radius
      Obj()\SX*(-1)
    ElseIf Obj()\X+Obj()\Radius>SW
      Obj()\X=SW-Obj()\Radius
      Obj()\SX*(-1)
    EndIf
    ;}
   
    SolveCollisions(@Obj(),DeltaTime)
    SolveLinks(@Obj(),DeltaTime)
    SolveMotion(@Obj(),DeltaTime)
  Next
 
  StartDrawing(ScreenOutput())
  DrawingMode(#PB_2DDrawing_Outlined )
    ForEach Obj()
      RenderObj(@Obj())
    Next
    DrawText(0,10,Str(GetFPS()))
  StopDrawing()
 
 
  If KeyboardPushed(#PB_Key_Return)
    DeltaTime=0.1 ; Слоу-мо =)
  Else
    DeltaTime=1.0
  EndIf
 
  FlipBuffers(1)
Until KeyboardReleased(#PB_Key_Escape)
End
;Вообще то, хороший тон - освободить Allocate'ы самостоятельно,
;но, судя по хэлпу, PureBasic и так автоматически убирает то,
;то было заAllocateMemory'но, в конце программы. =)
 



Сий код демонстрирует возможность моделирования сложных объектов(от простейшего бокса и до целых сеток(впрочим, с этими заморачиваться я не стал :))с помошью частиц-сфер и пружинных связей между ними :) ИМХО, очень интересно, что микрофизика частиц отлично моделирует чисто макроскопические параметры типа вращательного момента, момента инерции и тд :)

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


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт дек 03, 2009 10:14 am 
Не в сети
профессор

Зарегистрирован: Вс окт 25, 2009 5:48 pm
Сообщений: 263
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Тебе с таким опытом пора штамповать игры типа "Crayon Physics Deluxe" или "Armadillo Run" . :D Или не прельщает это?


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт дек 03, 2009 10:39 am 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Чт июн 25, 2009 1:02 pm
Сообщений: 2282
Откуда: Russia — Belarus
Благодарил (а): 6 раз.
Поблагодарили: 72 раз.
Пункты репутации: 11
Классно, квадратные объекты с шарами прям дрожат после сильного удара, как пружина, очень реалистично.
Но почему все объекты дрожат когда просто лежат, без вмешательства?
Так же иитересует возможность проскальзывания через объекты, мне удалось засунуть шар в коробку и пропихать ее через натянутую шарами линию, почем так?

_________________
EnableExplicit User


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 33 ]  На страницу Пред.  1, 2, 3  След.

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


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

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


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

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