Форум программистов, компьютерный форум, киберфорум
Наши страницы
Basic
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.58/31: Рейтинг темы: голосов - 31, средняя оценка - 4.58
Quiet Snow
4412 / 1309 / 377
Регистрация: 25.04.2010
Сообщений: 3,393
1

Графика FreeBasic

01.11.2012, 10:29. Просмотров 6066. Ответов 34
Метки нет (Все метки)

Приветствую всех cyber-форумчан!

Несмотря на наличие графического треда в младшем разделе, создаю ещё одну тему конкретно для FreeBasic.

Считаю, что так будет удобнее, итак друзья, предмет дискуссии:
  1. Обсуждаем графические приложения, написанные на FreeBasic
  2. Выкладываем интересные и полезные примеры программ (исходники)
  3. Делимся опытом по реализации графических программ

Что подразумевается под графическими приложениями:
  • В первую очередь программы работающие в графическом режиме, с упором на вывод графики.
  • Разные рисунки, анимация, эффекты, воспроизводящиеся непосредственно в программе(Runtime).
  • Мультимедиа приложения и игры.
  • Все прочие программы использующие средства для вывода графики.

Прошу построить обсуждение следующим образом:
  1. Выкладывается программа
  2. Задаются вопросы
  3. Автор программы по возможности отвечает
  4. Возвращаемся к пункту a

По мере наличия времени и возможности, буду портировать свои программы из указанного выше
раздела.


В качестве, стартовых примеров выкладываю 2 портированных собственных программы и одну
портированную с си. Компилируются примеры через FBIde с опцией сборки QB GUI
100% совместимая версия компилятора: 0.22.0
Интерполяция Лагранжа
Графика FreeBasic

Рейкастер
Графика FreeBasic

Скринсейвер
Графика FreeBasic
4
Вложения
Тип файла: zip LAGRANGE.zip (68.4 Кб, 72 просмотров)
Тип файла: zip RAYCAST.zip (78.4 Кб, 45 просмотров)
Тип файла: zip SCREEN SAVER.zip (74.7 Кб, 46 просмотров)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.11.2012, 10:29
Ответы с готовыми решениями:

FreeBASIC
Заметил, что уже имеющиеся на форуме темы в разделах: - QBasic - Visual Basic - VBA - Pure...

Осваиваю (ем) FreeBasic
Решил больше не тянуть, а приступить сегодня. Если тема будет актуальна - возможно модераторы...

Немного о FreeBasic
Чаще всего при начальном использовании какого-то языка , люди стараются выбрать простую,...

FreeBASIC и сети
Здравствуй, форум. Всё дело в том, что есть одни сетевые функции, и для этих функций Я решил...

Синтаксические особенности FreeBasic
По совету Stabud создаю тему, в которой будем обсуждать семантику и синтаксис диалекта FreeBasic....

34
stabud
122 / 49 / 1
Регистрация: 26.10.2012
Сообщений: 84
01.11.2012, 11:20 2
Metaballs

3D пример, сложный. Работа ведется напрямую с буфером. Кое-какая часть кода реализована на ASM вставках. FPS на моем компе win7 + Pentium E5200 + GF 9800GT: ~ 90

Автор: P.Bourke
1
Миниатюры
Графика FreeBasic  
Вложения
Тип файла: zip 3D куб .zip (10.2 Кб, 29 просмотров)
stabud
122 / 49 / 1
Регистрация: 26.10.2012
Сообщений: 84
01.11.2012, 11:28 3
Простенький пример прыжков колобка.

PureBasic
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
/'Пример прыжка.
Для управления:
<- влево
-> вправо
Пробел прыжок'/
#Include "fbgfx.bi"
Using fb
Dim As Integer posx=100,posy,vely,jumping,FLR=2,accel = 15
Screen 13,,2
 
Do
    If posx<=70 Then FLR=2
    If posx>=250 Then FLR=1
    If MultiKey(SC_SPACE) And jumping = 0 Then
        vely = 100
        jumping = 1
    EndIf
    If MultiKey(SC_LEFT) or (FLR=1 And jumping = 1) Then
        posx-=5
        If posx<70 Then posx=70
        FLR=1
    EndIf
    If MultiKey(SC_RIGHT)or (FLR=2 And jumping = 1) Then
        posx+=5
        FLR=2
        If posx>250 Then posx=250
    EndIf
    If jumping=1 Then
        vely = vely - accel
        posy = posy + vely
    EndIf
    If (posy <= 250)  Then
        vely = 0
        posy=250
        jumping = 0
    EndIf
    Cls
    ScreenLock
    Paint (10, 10), 10,15
    Circle (posx, 190-(posy\5)), 70, 14,,,,F
    Circle (posx-25, 165-(posy\5)), 17, 15,,,,F
    Circle (posx+25, 165-(posy\5)), 17, 15,,,,F
    If FLR=1 And jumping = 1 Then
        Circle (posx-35, 165-(posy\5)), 4, 2,,,,F
        Circle (posx+10, 165-(posy\5)), 4, 2,,,,F
    ElseIf FLR=2 And jumping = 1 Then
        Circle (posx+35, 165-(posy\5)), 4, 2,,,,F
        Circle (posx-10, 165-(posy\5)), 4, 2,,,,F       
    Else
        Circle (posx-15, 165-(posy\5)), 4, 2,,,,F
        Circle (posx+15, 165-(posy\5)), 4, 2,,,,F
    EndIf
    Circle (posx, 200-(posy\5)), 45,3,3.14,6.28,0.5
    ScreenUnLock
    Sleep 30
Loop Until MultiKey(SC_ESCAPE)
1
Миниатюры
Графика FreeBasic  
Quiet Snow
4412 / 1309 / 377
Регистрация: 25.04.2010
Сообщений: 3,393
01.11.2012, 11:32  [ТС] 4
stabud, 30-37 FPS P4 3HGz, демосцена живёт и здравствует, отличный пример.
Да у этих парней простых примеров не бывает. Позже если портанётся закину
вайрфреймовый 3D кубик на своём вертексном движке, текстурированный не получится,
все мои текстурки под досом))).
0
01.11.2012, 11:32
stabud
122 / 49 / 1
Регистрация: 26.10.2012
Сообщений: 84
01.11.2012, 11:49 5
Небольшой пример, мне лично понравился. Не боимся палочку поднимать мышкой, сгибать и пр.

Автор: h4tt3n

PureBasic
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
''  Michael "h4tt3n" Nissen's spring simulation
''  this simulation shows how to simulate a spring and how to reduce its
''  movement with dampers and friction forces.
''  This example also includes angular springs, which makes it possible 
''  to simulate non-rigid objects like hair strains, straw, fishing rods ect...
 
Type Vector_2D
  As Double X, Y
End Type
 
Type Mass
  As Double Mass, radius
  As Vector_2D Pos, Vel, Acc
End Type 
 
const pi = 4*Atn(1)
const degtorad = pi/180
Const Num_Masses = 10         ''  number of point masses in rope
Const Rope_Length = 600       ''  rope length in pixels
Const Spring_Stiffnes = 6e3   ''  spring stiffnes. Higher = harder spring
const Angular_Stiffnes = 15e5 ''  spring angular stiffnes ie "bendability"
Const Time_Scale = 0.01       ''  timestep. Smaller = more accurate but slower
Const G_Acc = 600             ''  gravity
const Air_Friction = 0.01     ''  air friction / drag
const wall_friction = 0.75    ''  wall friction
const Int_Friction = 0.2      ''  internal friction
const Spring_Damping = 4      ''  damping
const pick_mindist = 32       ''  minimum mouse pick up distance
 
Dim As Vector_2D Dist, Dist_1, Dist_2, vel
Dim As Mass Mass(1 to Num_Masses)
Dim As Double Force, Force_1, Force_2, Distance, Distance_1, Distance_2, _
velocity, Cos_Angle, Sin_Angle, spring_angle, cos_spring_angle, sin_spring_angle, _
temp_dist, Spring_Length
Dim As Integer i, i2, i3, scrn_wid, scrn_hgt, Mouse_x, Mouse_y, Mouse_Btn, _
pick_state, picked
 
ScreenInfo Scrn_wid, scrn_hgt
ScreenRes scrn_wid, scrn_hgt, 16,, 1
 
''  initialize springs
spring_angle = 0
Cos_Spring_Angle = Cos(Spring_Angle*degtorad)
Sin_Spring_Angle = Sin(Spring_Angle*degtorad)
Spring_Length = Rope_Length/Num_Masses
 
For i = Lbound(Mass) To Ubound(Mass)
  With Mass(i)
    .Mass = 1
    .radius = 3
    .Pos.x = (Scrn_wid\3) + (i*Spring_Length)
    .pos.y = (Scrn_hgt\3)
  End With
Next
 
Do
  
  ''  bend spring left / right with leftarrow / rightarrow
  If Multikey(&h4b) Then 
    Spring_angle += 1
    Cos_Spring_Angle = Cos(Spring_Angle*degtorad)
    Sin_Spring_Angle = Sin(Spring_Angle*degtorad)
  End If
 
  If Multikey(&h4d) Then 
    Spring_angle -= 1
    Cos_Spring_Angle = Cos(Spring_Angle*degtorad)
    Sin_Spring_Angle = Sin(Spring_Angle*degtorad)
  End If
  
  ''  Increase / decrease spring length with uparrow / downarrow
  If Multikey(&h48) Then Spring_Length += 1
  
  If Multikey(&h50) Then 
    Spring_Length -= 1
    If Spring_Length < 32 Then Spring_length = 32
  End If
  
  ''  apply forces to every mass
  For i = Lbound(Mass) To Ubound(Mass)
    With Mass(i)
      
      ''  gravity
      .Acc.Y += G_acc
      
      ''  air friction
      .Acc.X -= Air_Friction*.Vel.X
      .Acc.Y -= Air_Friction*.Vel.Y
      
    End With
  Next
  
  ''  axial spring force
  For i = Lbound(Mass) To Ubound(Mass)-1
    
    i2 = i+1
    
    ''  find distance between mass i and i2, ie. the spring length (Pythagoras)
    Dist.X = Mass(i2).Pos.X-Mass(i).Pos.X
    Dist.Y = Mass(i2).Pos.Y-Mass(i).Pos.Y
    Distance = Sqr(Dist.X*Dist.X+Dist.Y*Dist.Y)
    
    ''  find relative velocity of mass compared to its neigbour
    Vel.X = Mass(i2).Vel.X-Mass(i).Vel.X
    Vel.Y = Mass(i2).Vel.Y-Mass(i).Vel.Y
    
    ''  find spring force (Hooke's law)
    Force = -Spring_Stiffnes*(Distance-Spring_Length)
    
    ''  spring damping (scalar projection of velocity vector onto spring)
    Force -= Spring_Damping*((vel.x*dist.x+vel.y*dist.y)/Distance)
    
    ''  accelerate masses (acceleration = force / mass)
    Mass(i).Acc.X -= (Force/Mass(i).mass)*(Dist.X/Distance)
    Mass(i).Acc.Y -= (Force/Mass(i).mass)*(Dist.Y/Distance)
    Mass(i2).Acc.X += (Force/Mass(i2).mass)*(Dist.X/Distance)
    Mass(i2).Acc.Y += (Force/Mass(i2).mass)*(Dist.Y/Distance)
    
    ''  internal friction
    Mass(i).Acc.X += Int_Friction*Vel.X
    Mass(i).Acc.Y += Int_Friction*Vel.Y
    Mass(i2).Acc.X -= Int_Friction*Vel.X
    Mass(i2).Acc.Y -= Int_Friction*Vel.Y
    
  Next
  
  ''  angular spring force
  For i = Lbound(Mass) to Ubound(Mass)-2
    i2 = i+1
    i3 = i+2
    
    Dist_1.X = Mass(i2).Pos.X-Mass(i).Pos.X
    Dist_1.Y = Mass(i2).Pos.Y-Mass(i).Pos.Y
    Distance_1 = Sqr(Dist_1.X*Dist_1.X+Dist_1.y*Dist_1.Y)
    
    Dist_2.X = Mass(i2).Pos.X-Mass(i3).Pos.X
    Dist_2.Y = Mass(i2).Pos.Y-Mass(i3).Pos.Y
    Distance_2 = Sqr(Dist_2.X*Dist_2.X+Dist_2.Y*Dist_2.Y)
    
    ''  cosine of the angle between springs.
    ''  keeps springs at a 90 / 270 deg angle (perpendicular).
    Cos_angle = (Dist_1.x*Dist_2.x+Dist_1.y*Dist_2.Y)/(Distance_1*Distance_2)
    
    ''  sine of the angle between springs.
    ''  keeps springs at a 0 / 180 deg angle (parallel).
    Sin_angle = (Dist_1.x*Dist_2.y-Dist_1.y*Dist_2.x)/(Distance_1*Distance_2)
    
    ''  angular spring force
    Force = Angular_Stiffnes*(Cos_Spring_Angle*Sin_Angle+Sin_Spring_Angle*Cos_angle)
    
    ''  angular accelleration. Apply force perpendicular to spring axis.
    Force_1 = Force/Distance_1
    Mass(i).Acc.X -= (Force_1/Mass(i).Mass)*(Dist_1.y/Distance_1)
    Mass(i).Acc.y -= (Force_1/Mass(i).Mass)*(-Dist_1.x/Distance_1)
    Mass(i2).Acc.X += (Force_1/Mass(i2).Mass)*(Dist_1.y/Distance_1)
    Mass(i2).Acc.y += (Force_1/Mass(i2).Mass)*(-Dist_1.x/Distance_1)
    
    Force_2 = Force/Distance_2
    Mass(i2).Acc.X -= (Force_2/Mass(i2).Mass)*(Dist_2.y/Distance_2)
    Mass(i2).Acc.y -= (Force_2/Mass(i2).Mass)*(-Dist_2.x/Distance_2)
    Mass(i3).Acc.X += (Force_2/Mass(i3).Mass)*(Dist_2.y/Distance_2)
    Mass(i3).Acc.y += (Force_2/Mass(i3).Mass)*(-Dist_2.x/Distance_2)
    
  Next
  
  ''  gravity and friction
  ''  update movement (Euler 1st order integration algorithm)
  For i = Lbound(Mass) To Ubound(Mass)
    With Mass(i)
      
      ''  update velocity (velocity = acceleration * delta time)
      .Vel.X += .Acc.X*Time_Scale
      .Vel.Y += .Acc.Y*Time_Scale
      
      ''  update position (position = velocity * delta time)
      .Pos.X += .Vel.X*Time_Scale
      .Pos.Y += .Vel.Y*Time_Scale
      
      ''  reset acceleration
      .acc.x = 0
      .acc.y = 0
      
    End With
  Next
  
  ''  on leftmouse, pick up closest mass within reach
  Getmouse Mouse_X, Mouse_Y,, Mouse_Btn
  If Mouse_Btn = 1 Then 
    If Pick_State = 0 Then
      Temp_Dist = Pick_MinDist
      For i = Lbound(mass) To Ubound(mass) 
        Dist.X = mass(i).Pos.X-Mouse_X
        Dist.Y = mass(i).Pos.Y-Mouse_Y
        Distance = Sqr(Dist.X*Dist.X+Dist.Y*Dist.Y)
        If Distance < Temp_Dist Then 
          Temp_Dist = Distance
          Picked = i
        End If
      Next
      If Picked <> -1 Then
        Pick_State = 1
      End If
    Else
      mass(Picked).Vel.X = 0
      mass(Picked).Vel.Y = 0
      mass(Picked).Pos.X = Mouse_X
      mass(Picked).Pos.Y = Mouse_Y
    End If
  Else
    Pick_State = 0
    Picked = -1
  End If
  
  ''  keep masses within screen
  ''  wall friction
  For i = Lbound(Mass) To Ubound(mass)
    
    With mass(i)
      
      If .Pos.x >= Scrn_wid-.Radius-1 Then
        .Vel.X *= Wall_Friction
        .Vel.Y *= Wall_Friction
        .Pos.x = Scrn_wid-.Radius-1
        .Vel.X = -.Vel.X
      Elseif .Pos.x <= .Radius Then
        .Vel.X *= Wall_Friction
        .Vel.Y *= Wall_Friction
        .Pos.x = .Radius
        .Vel.X = -.Vel.X
      End If
      If .Pos.y >= Scrn_hgt-.Radius-1 Then
        .Vel.X *= Wall_Friction
        .Vel.Y *= Wall_Friction
        .Pos.y = Scrn_hgt-mass(i).Radius-1
        .Vel.Y = -.Vel.Y
      Elseif .Pos.y <= .Radius Then
        .Vel.X *= Wall_Friction
        .Vel.Y *= Wall_Friction
        .Pos.y = .Radius
        .Vel.Y = -.Vel.Y
      End If
      
    End With
    
  Next
  
  ''  clear screen and draw new image
  ScreenLock
    
    Cls
    
    ''  draw springs
    For i = Lbound(Mass) To Ubound(Mass)-1
      
      i2 = i+1
      
      Line (Mass(i).Pos.X, Mass(i).Pos.Y)-(Mass(i2).Pos.X, Mass(i2).Pos.Y), Rgb(32, 255, 32)
      
    Next i
    
    ''  draw masses
    For i = Lbound(Mass) To Ubound(Mass)
      
      Circle (Mass(i).Pos.X, Mass(i).Pos.Y), Mass(i).Radius, RGB(255, 32, 32),,, 1, F
      
    Next i
    
    Locate 2, 2: Print "use left- / rightarrow to change spring angle"
    Locate 4, 2: Print "use up- / downarrow to change spring length"
    Locate 6, 2: Print "Use mouse to pick up and interact with masses"
    Locate 8, 2: Print Using "Spring angle:  #####"; Spring_Angle
    Locate 10, 2: Print Using "Spring length: #####"; Spring_length
    
  ScreenUnlock
  
  Sleep 1, 1
  
Loop Until Multikey(1)
 
End
2
Миниатюры
Графика FreeBasic  
Quiet Snow
4412 / 1309 / 377
Регистрация: 25.04.2010
Сообщений: 3,393
02.11.2012, 00:37  [ТС] 6
Лучший ответ Сообщение было отмечено как решение

Решение

Небольшой пример, мне лично понравился.
Отличнейший пример, я такого нигде не видел. Очень круто сделано.

Выкладываю ещё 3 собственных программы, портированных с QuickBasic.
Версия компилятора: 0.22.0

Простой 3D кубик (Wireframe)
Тип сборки: QB GUI
Графика FreeBasic
Движок для тестирования знаний
Тип сборки: QB GUI
Графика FreeBasic
Цифровые часы
Тип сборки: QB GUI
Графика FreeBasic
Прототип текстового редактора(консоль)
Тип сборки: QB Console
Графика FreeBasic
3
Вложения
Тип файла: zip WIRE3D.zip (75.2 Кб, 31 просмотров)
Тип файла: zip TEST_ENGINE.zip (140.5 Кб, 26 просмотров)
Тип файла: zip DCLOCK.zip (91.8 Кб, 38 просмотров)
Тип файла: zip TEXRED.zip (59.4 Кб, 26 просмотров)
stabud
122 / 49 / 1
Регистрация: 26.10.2012
Сообщений: 84
02.11.2012, 14:28 7
На QBASIC нашел простой код паутины:

PureBasic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
CONST Pi = 3.141592653589793#
CLS : LOCATE 2
Dim As Integer x= 300,y=250,r =20,k=10,r1=20
SCREEN 12
LINE (x, 0)-(x, 600)
LINE (0, y)-(600, y)
LINE (0, y + x)-(y + x, 0)
LINE (x-y, 0)-(600, 600-x+y)
FOR i As Integer= 1 TO k
    Var z = 0
    r = r + r1
    DRAW "BM" + LTRIM$(STR$(INT(x + r * COS(2 * z * Pi / 360)))) + "," + LTRIM$(STR$(INT(y + r * SIN(2 * z * Pi / 360))))
    DO
        z = z + 45
        LINE STEP(0, 0)-(x + r * COS(2 * z * Pi / 360), y + r * SIN(2 * z * Pi / 360)), 7
    LOOP UNTIL 360 <= z
Next
sleep
Однако у меня в закромах нашелся еще один код:

Кто автор не знаю.

PureBasic
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
'WEB
type point2d
    as double x,y
    end type
 
function rotatepoint2d(pivot As point2d,_
                         _point as point2d,_
                          angle As Double,_
                        dilator as double=1) as point2d
      Dim pi As Double=4*Atn(1) 
    #define rad *pi/180
dim as point2d np
np.x=dilator*(Cos(angle rad)*(_point.x-pivot.x)-Sin(angle rad)*(_point.y-pivot.y)) +pivot.x
np.y=dilator*(Sin(angle rad)*(_point.x-pivot.x)+Cos(angle rad)*(_point.y-pivot.y)) +pivot.y
return np
End function
 
dim as integer xres,yres
screeninfo xres,yres
screenres xres,yres,32
dim as point2d piv,pt,temp
dim as double dil,k=1
piv.x=xres/2
piv.y=yres/2
pt.x=piv.x+yres/4
pt.y=piv.y
dim pi as double=4*atn(1)
#define rad *pi/180
for z as double=1 to 6000 step 1
    if z mod 30=0 then
        line(piv.x,piv.y)-(piv.x+1.5*piv.x*cos(z rad),piv.y+1.5*piv.y*sin(z rad)),rgb(100,100,100)
        end if
    if z mod 30=0 then k=-1.5*.001*z
    if z mod 60=0 then k=2.5*.001*z
    dil=dil+k*.001
 temp= rotatepoint2d(piv,pt,z,dil)
 pset(temp.x,temp.y)
 if z mod 25=0 then circle(temp.x,temp.y),2,rgb(200,200,200),,,,F 'dew?
next z
sleep
2
Миниатюры
Графика FreeBasic   Графика FreeBasic  
stabud
122 / 49 / 1
Регистрация: 26.10.2012
Сообщений: 84
02.11.2012, 20:34 8
Поскольку прозвучала просьба про пример загрузки и отрисовки спрайтов из изображений формата PNG, я решил создать простенький пример:

Перед тем как запустить пример , качаем библиотеку FbPng с моего сайта , устанавливаем файлы библиотеки и заголовки в соответствующие папки компилятора, или в папку с примером по желанию. Запускаем простой пример ниже:

PureBasic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include once "fbpng.bi"
 
Screen 14,32,2
ScreenSet 1
Color , &hffff
Cls
 
Dim As Integer y
dim as any ptr ImgBackGround = png_load( "tree.png")
dim as any ptr ImgSprite = png_load( "sprite.png")
 
Do
    Cls
    Put (10,10),ImgBackGround, Alpha
    Put (30,y),ImgSprite,Alpha
    y+=1
    If y>160 Then Exit do
    Sleep 30
    Pcopy
Loop Until MultiKey(1) ' esc
Кстати, как на этом форуме класть изображения в нужные мне места моего сообщения? Что-то я не нашел нужной иконки тега. Я пока что автоматом загружаю вложения и все это лежит в конце моего сообщения.
2
Миниатюры
Графика FreeBasic  
Вложения
Тип файла: zip TestPng.zip (42.7 Кб, 33 просмотров)
Памирыч
02.11.2012, 22:02
  #9

Не по теме:

Цитата Сообщение от stabud Посмотреть сообщение
Кстати, как на этом форуме класть изображения в нужные мне места моего сообщения
В расширенном режиме сообщения скрепка, через которую Вы загружали изображения, еще и выполняет роль выпадающего списка. После того, как вложения загружены, ставим курсор в нужную часть поста и выбираем из этого списка вложение. Там, где стоял курсор, появится номер вложения в тегах [ATTACH].

2
Quiet Snow
4412 / 1309 / 377
Регистрация: 25.04.2010
Сообщений: 3,393
03.11.2012, 04:34  [ТС] 10
stabud, спасибо за пример, крайне полезен.

устанавливаем файлы библиотеки и заголовки в соответствующие папки компилятора
Такой вопрос, куда компилятор первично обращается за хедерами?

Добавлено через 1 час 50 минут
stabud, кстати вопрос, ZLIB.DLL обязательно нужен или можно как-то статически
слинковать. Дело в том что скачал следующие файлы с вашего сайта:
libfbpng.a, libfbpngs.a, libzip.a, libzlib.a, закинул их в FreeBasic\lib\win32
хедеры zip.bi, zlib.bi, fbpng.bi, fbpng_gfxlib2.bi, fbpng_opengl.bi, закинул в FreeBasic\inc
Скомпилилось, но требует ZLIB.DLL при запуске. Достать его не проблема, а хочется всё
таки по-человечески в 1-м exe-шнике. Я, конечно, всё равно расшерщу как это сделать,
просто у вас может быть уже есть решение данного вопроса, чтобы мне не тратить время.
0
stabud
122 / 49 / 1
Регистрация: 26.10.2012
Сообщений: 84
03.11.2012, 08:40 11
Цитата Сообщение от >Quiet Snow< Посмотреть сообщение
Такой вопрос, куда компилятор первично обращается за хедерами?
Сначала в папку с проектом, потом в папку FreeBasic\inc


Цитата Сообщение от >Quiet Snow< Посмотреть сообщение
кстати вопрос, ZLIB.DLL обязательно нужен или можно как-то статически
слинковать.
Статическая библиотека ZLIB чаще всего имеет имя libz.a или libzlib.a , все зависит от способа подключения в заголовке zlib.bi
Если в папке присутствуют дополнительно файлы libz.dll.a или libzlib.dll.a , то они имеют приоритет, поэтому компилятор требует DLL файл. Вопрос решается просто:

Удалите из папки FreeBasic\lib\win32 файлы libz.dll.a и\или libzlib.dll.a и оставьте младшего брата libz.a и\или libzlib.a
1
Quiet Snow
4412 / 1309 / 377
Регистрация: 25.04.2010
Сообщений: 3,393
05.11.2012, 13:10  [ТС] 12
Лучший ответ Сообщение было отмечено как решение

Решение

Выкладываю ещё 2 собственных программы, портированных с QuickBasic.
Версия компилятора: 0.24.0

Игра ПИТОН
Тип сборки: QB GUI

Портирование: Выполнено крайне криво, за что извиняюсь. Прога слишком объёмная,
чтобы переписать её на FreeBasic полностью. Программа была заточена под DOS, из-за
чего пришлось от многого отказаться. Однако с большим трудом, удалось её портировать.
Сделано это просто для того, чтобы на неё можно было посмотреть. Описание программы
есть на iforum в разделе проектов бейсика.
Графика FreeBasic

Фейерверк

Тип сборки: Windows GUI
Портирование: Переписано под FreeBasic полностью.
Графика FreeBasic

Спрайты PNG

Тип сборки: Windows GUI
Описание: Статическое линкование, пример написал stabud, я его немного переделал.
Графика FreeBasic
4
Вложения
Тип файла: zip Snakes.zip (105.3 Кб, 35 просмотров)
Тип файла: zip Feirverk.zip (52.4 Кб, 35 просмотров)
Тип файла: zip Спрайты PNG.zip (207.3 Кб, 28 просмотров)
Quiet Snow
4412 / 1309 / 377
Регистрация: 25.04.2010
Сообщений: 3,393
09.11.2012, 01:15  [ТС] 13
Нашёл вот такую приятную библиотечку для ускорения 2D на OpenGL:
Easy GL2D for FreeBASIC
http://rel.phatcode.net/junk.php?id=115
Запустил примеры, но скорости не прочувствовал, везде 60 Fps, упирается в развёртку
монитора, даже когда выключена синхронизация. Позже сделаю нагрузочное тестирование.
Сравним с встроенной библой PureBasic и HGE(толстых зайцев не забыли надеюсь), мне
самому интересно "как оно".

Также хотелось бы узнать про лицензирование данной библиотеки, кто знает напишите.
Добавлено через 1 час 25 минут
Итак скорость двига:

2730 спрайтов размером 32x32 на полном дуплексе рисует со скоростью 565-570 кадров в секунду.
Спрайты обычные непрозрачные. Для альфа канала надо подумать как тест сделать, но уже
ощущается скорость. (конфиг CPU:P4 3GHz HT, GPU: GeForce 9800GT, память DDR2 667MHz)
Как измерялось:
Я просто влез в \Examples\GameEngine\GameEngine.bas и немного подправил рендер сцены,
убрал ограничитель кадров, sleep и увеличил кол-во спрайтов. Таким образом мы получили
тест в реальных условиях т.к. там ещё сам движок обсчитывался(простенький детект
столкновений). Время мерилось через Timer от стартового, кадры просто инкрементировались,
естественно при делениии кадров на время получаем точный FPS.
0
stabud
122 / 49 / 1
Регистрация: 26.10.2012
Сообщений: 84
09.11.2012, 08:52 14
Цитата Сообщение от >Quiet Snow< Посмотреть сообщение
Также хотелось бы узнать про лицензирование данной библиотеки, кто знает напишите.
В самом файле либы указана такая строчка:

Source license is "use or abuse"
Я ее понял так: движок можно использовать для любых целей, если не наглеть (выдавать как свой, продавать как свой и пр.)
1
Quiet Snow
4412 / 1309 / 377
Регистрация: 25.04.2010
Сообщений: 3,393
11.11.2012, 15:24  [ТС] 15
Я ее понял так: движок можно использовать для любых целей, если не наглеть (выдавать как свой, продавать как свой и пр.)
Т.е. допустим, указав копирайты в программе(в графе благодарности), можно спокойно делать
на его основе какую либо freeware или коммерческую прогу? Фраза "Use or Abuse" мне к сожалению ни
о чём не говорит, дословно "используй или злоупотребляй", но даже по значениям слов ничего не ясно.

Итак господа программисты, вплотную подобрался к вопросу вывода спрайтиков и их реалтайм
изменения, пришлось немного влезть в OpenGL, демка есть, но слегка глючит, нужно понять,
где косяки. Возможности достаточно сочные: рисуем встроенным Gfx-ом на имадже, потом
имадж переводится в спрайт(в память видюхи) и указав его ID можно им рисовать.
Пока смог написать процедуру по загрузке изображения из *.Png*, используя пример stabud'a.
Однако при апдейте спрайта происходит лажа и портятся некоторые пиксели. Возможно, через
какое-то время выложу рабочий код, как всё отлажу. Также хочу обрезать библиотеку раза так
в 4, слишком много ненужного. Короче думаю сделать удобную загрузку и использование.
Как видим на скриншоте, полоты тысячи кадров - это точ в точ прошлый пример.
2
Миниатюры
Графика FreeBasic  
stabud
122 / 49 / 1
Регистрация: 26.10.2012
Сообщений: 84
11.11.2012, 16:29 16
Цитата Сообщение от >Quiet Snow< Посмотреть сообщение
Т.е. допустим, указав копирайты в программе(в графе благодарности), можно спокойно делать
на его основе какую либо freeware или коммерческую прогу? Фраза "Use or Abuse" мне к сожалению ни
о чём не говорит, дословно "используй или злоупотребляй", но даже по значениям слов ничего не ясно.
Quiet Snow , взгляните на это глазами юриста. "Что не запрещено, то разрешено" В лицензии выложенной автором ясно:

используй или злоупотребляй

Где тут ограничения, накладываемые на использование либы? Нет ? Другой лицензии на либу нет. Значит можно все, без боязни преступить закон. Весь вопрос в совести. Хотим чтобы человек, который создал либу , был вознагражден хотя бы именем\фамилией в вашем проекте, пишем его инициалы. Нет ....

Я вам советую почитать ЭТО по использованию OPENGL в своих проектах. Перевод так себе, но уж простите немецкого не знаю совсем (все средствами онлайн переводчиков). Я после этого посмотрел на OpenGl другими глазами
1
Quiet Snow
4412 / 1309 / 377
Регистрация: 25.04.2010
Сообщений: 3,393
11.11.2012, 18:54  [ТС] 17
Хотим чтобы человек, который создал либу , был вознагражден хотя бы именем\фамилией в вашем проекте, пишем его инициалы. Нет ....
Уважаю чужой труд, лично я бы написал, даже если бы изменил библу до неузнаваемости, т.к.
кто-то карпел и писал этот код. Код в принципе несложный, знать бы что делает каждая OpenGL
функция, описания в инете есть, но разбираться долго. Минимальные правки можно делать и не
зная всего описания. Сначала надо сделать чтобы хоть как-то работало, а после можно
облагораживать и рефакторить до бесконечности. Теперь внимание, ключевой момент, дал код
одному человеку, он протестировал на WinXP и Win7. Код заполнял память из 65536 пикселей(DWORD)
и рисовал спрайты из прошлого примера. WinXP - 1500 кадров, Win7 - 3000 кадров. Это к вопросу о
Win7, как и чем лечить...
Железо Core i5 самый последний, видюха GeForce GTX 550Ti, память DDR3 PC3-12800.
На моём скромном компе на XP давало 1500 кадров на GeForce 9800GT, результат просто отличный.
Я вам советую почитать
Почитаю конечно, может быть это поможет улучшить библиотеку.

Добавлено через 1 час 1 минуту
Я вам советую почитать ЭТО по использованию OPENGL в своих проектах.
Офигенная статья, как я её раньше не увидел. Половину прочитал уже тащусь, чётко в тему.
1
Quiet Snow
4412 / 1309 / 377
Регистрация: 25.04.2010
Сообщений: 3,393
12.11.2012, 18:05  [ТС] 18
Итак друзья, прогресс идёт. Благодаря stabud'у и всемогущему googl'у...
Выкладываю прогу, первая попытка. Сам я дальше причёсывать эту библу пока не буду, хочу
пошерстить OpenGL, уже написал для себя прогу для передачи в OpenGL 2D текстур, выглядит
аппетитно, буду работать над более простым 2D двигом, сложность нам ни к чему.
Тем не менее, смотрите, эта прога совместима с FbGfx, также она легко грузит PNG файлики.
Пока я точно не проверил все параметры, может быть где-то кривенько загрузит, тестируем и
отписываемся. Суть в том что теперь есть ПРОСТОЙ инструмент для работы с 2D, пусть
возможностей немного, но тем не менее, учитывая "халявность".
1
Вложения
Тип файла: zip FastPng_Primer.zip (245.2 Кб, 24 просмотров)
Pro_grammer
Модератор
6196 / 2277 / 447
Регистрация: 24.04.2011
Сообщений: 4,048
Записей в блоге: 10
12.11.2012, 20:04 19
Цитата Сообщение от >Quiet Snow< Посмотреть сообщение
тестируем и
отписываемся.
error 40: Variable not declared, GL_BGRA in '0, GL_BGRA, GL_UNSIGNED_BYTE, spr + sizeof(FB.IMAGE) )'

Exe шник отработал со скоростью 2200-2400 кадров.

Добавлено через 1 час 45 минут
И что приятно на WIN7 и XP скорость одинаковая.
1
Quiet Snow
4412 / 1309 / 377
Регистрация: 25.04.2010
Сообщений: 3,393
12.11.2012, 21:25  [ТС] 20
Variable not declared, GL_BGRA
У меня была такая же ошибка. Не помню что сделал, но она сама исчезла,
причём декларить константу уже не надо было. Где-то хедеры кривые...
Вот значение этой злощастной константы, ставим в начало модуля FBGL2D7.bi:
Код
CONST GL_BGRA = &H80E1
Добавлено через 5 минут
И что приятно на WIN7 и XP скорость одинаковая.
По некоторым данным, на мощных тачках на Win7 больше скорость.
Да этот факт сами представляете как меня обрадовал, на пюре только под XP
можно было писать крутые проги, а семёрка убивала весь перфоманс, очень странно,
что мелкомягкие так семёрку оласосили в плане DirectX'a...
Есть и ложка дёгтя конечно, функция glTexImage2d достаточно много времени жрёт,
хз почему, но если пару десятков текстур(даже небольших) каждый кадр отправлять
в видеопамять, то будет слайдшоу.

Добавлено через 48 минут
Exe шник отработал со скоростью 2200-2400 кадров.
P4 3GHz, Geforce 9800GT, DDR2, XP _________FPS ~ 1250
Core i5 2300, Geforce GTX560, DDR3, Win7____FPS ~ 2900
P4 3GHz, Geforce 6600, DDR, XP ____________FPS ~360
1
12.11.2012, 21:25
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.11.2012, 21:25

FreeBasic круги на воде
Очень интересный код имитирующий распространение кругов на воде. Описание алгоритма тут Что меня...

Задача на графику в FreeBASIC
Помогите с задача по графике в FreeBASIC Построить совокупность n равных отрезков, центры которых...

FreeBasic. MyFbFramework + VisualFBEditor
Начал новый фреймворк для FreeBasic: MyFbFramework И редактор для него: VisualFBEditor Файлы...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru