Форум программистов, компьютерный форум, киберфорум
QBasic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.54/501: Рейтинг темы: голосов - 501, средняя оценка - 4.54
Кормпилятор
 Аватар для Quiet Snow
5044 / 1718 / 409
Регистрация: 25.04.2010
Сообщений: 4,827
Записей в блоге: 2

Графика на бейсике

16.08.2010, 02:10. Показов 110945. Ответов 175
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте уважаемые участники форума и администрация!

Уже давно заметил, что "скудновато" в данном разделе по прикреплённым темам, есть предложение закрепить топик, освещая следующие вопросы:

1) Обсуждаем графические приложения, написанные на бейсике(любые MS-DOS компиляторы)
2) Выкладываем разные "поучительные" примеры

Понимаете, область далеко не самая простая, хочется развеить предрассудки о том что бейсик мол "игрушка", отсталый язык, есть же "сильные" программы, использующие разные ухищрения. Короче хочется чтобы было больше дискуссий на эту тему. В рамках форума можно решать самые разнообразные вопросы, от вопросов алгоритмизации до выбора стратегии оптимизации, от простых до сложных.

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

Также можно обсуждать и выкладывать какие-либо вспомогательные программы(будь то конвертер или редактор), идеологические аспекты, т.е. допустим один человек предлагает идею - другой реализовывает.

Вообщем если найдутся энтузиасты поддержать топик, буду очень рад. Хочется чтобы в разделе было больше посетителей и чтоб форум не "сдох".
10
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
16.08.2010, 02:10
Ответы с готовыми решениями:

Функция на бейсике
помогите пожалуйста сделать задание) составить функцию на Бейсике для вычисления заданной функции.Составьте программу вводящую с клавиатуры...

Программы на Паскале И Бейсике
Помогите решить: 5.Составить программу, с помощью которой получить цвет¬ной рисунок «Робот». А эту в Бейсике. Заранее спасибо.

Текстовые игры на бейсике
Подскажите, можно ли сделать что-то похожее на тиду или мир теней (или еще что-то от playtox)в среде бейсика? Заранее спасибо. ...

175
Модератор
1245 / 676 / 292
Регистрация: 10.11.2019
Сообщений: 1,406
26.01.2023, 13:51
Студворк — интернет-сервис помощи студентам
Mikle Quits,
QBasic/QuickBASIC
1
PUT (k + 2, 6), c%(66 * (ASC(MID$(g$, k)) - 44)), PSET
В QBasic тип INT занимает 2 байта, а в FreeBasic - 4 байта.
Здесь использован целочисленный массив в качестве граф буфера, поэтому при простой
перекомпиляции в FreeBasic работать не будет. Желательны комментарии от автора, что делают подпрограммы.
1
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
26.01.2023, 13:57
Цитата Сообщение от yevrowl Посмотреть сообщение
Вот что выдаёт компилятор:
Образцовый пример как не надо писать код. Хоть на выставку ставь в рамочке.
А что вы хотите? Человек объявляет двести глобальных переменных и юзает их по всему коду, не замечая, что для каких-то локальных дел (например, в циклах) разные участки кода используют одну и ту же переменную; перепрыгивают из одного участка в другой. И потом ночами напролёт дебуажить это с криками «Почему у меня ничего не работает?!»

А потом когда говорят, что QBASIC был простым, а потом пришли сишники, напихали в него функций и всё испортили.

Единственное, что отобрали у Бейсика – возможность накодить спагетти-кода с неявными переходами.
0
 Аватар для Mikle Quits
769 / 286 / 17
Регистрация: 21.01.2023
Сообщений: 456
26.01.2023, 14:27
Цитата Сообщение от qbfan Посмотреть сообщение
Желательны комментарии от автора, что делают подпрограммы.
Цитата Сообщение от Замабувараев Посмотреть сообщение
Образцовый пример как не надо писать код.
Вы бы хоть прочли сопровождение к выложенному примеру.
Я сразу написал - это самый момент моего перехода с Atari Basic на QBasic. Код - да, неимоверно ужасен, а чтобы написать комментарии, я должен сам сначала разобраться. Выложил я это не как пример кода, а как пример готовой программы, которая, вроде, неплохо выглядит и работает для своего времени.
Хорошо хоть лишних номеров строк нет, уже отучился к тому моменту их расставлять.
А QBASIC действительно был простым. Единственное, чего мне там не хватало, это "Option Explicit".
1
 Аватар для vlisp
1064 / 985 / 153
Регистрация: 10.08.2015
Сообщений: 5,365
26.01.2023, 14:28
Цитата Сообщение от Замабувараев Посмотреть сообщение
Образцовый пример как не надо писать код. Хоть на выставку ставь в рамочке.
когда так писали, тебя еще в проекте не было, без обид
1
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
26.01.2023, 15:19
Цитата Сообщение от vlisp Посмотреть сообщение
когда так писали, тебя еще в проекте не было, без обид
А вы тоже так пишете? И вам удобно?
0
Кормпилятор
 Аватар для Quiet Snow
5044 / 1718 / 409
Регистрация: 25.04.2010
Сообщений: 4,827
Записей в блоге: 2
26.01.2023, 20:54  [ТС]
Почему бы не обсудить код товарища Mikle Quits в отдельной теме?
Зачем делать это здесь?
1
Модератор
1245 / 676 / 292
Регистрация: 10.11.2019
Сообщений: 1,406
01.09.2023, 10:00
Эта программа - не только графическое, а, скорее, музыкальное демо.
Контроллер (обычного) VGA имеет 256 КБ видео памяти, что в режиме
SCREEN 7 (320*200*16 цветов) позволяет переключать 8 видео страниц.
Поэтому можно заполнить все 8 страниц кадрами анимации,
а затем в цикле очень быстро переключать страницы, что можно использовать
для создания простых мультиков. Я также нашёл способ программно преобразовывать
ноты из программы MuseScore (файлы *.mscz) в формат QB-QBasic PLAY или SOUND,
что даёт возможность легко и быстро создавать мелодии для QBasic (для бипера).
Программа тестировалась в DosBox в QBasic 1.1 и QB 4.5, а также на реальном
старом ноутбуке Toshiba Satellite Pro 430CDT (Pentium 120, 1997 год выпуска)

QBasic/QuickBASIC
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
DECLARE SUB sprite (x%, y%, form%, col%)
DECLARE SUB playnote ()
'qbasic
CONST pi = 3.1415926#
DEFINT A-Z
DIM SHARED dot(15, 127)
DIM SHARED loops: loops = 0
DIM SHARED page: page = 0
DIM n AS SINGLE, r AS SINGLE, f AS SINGLE
' Читаем изображения спрайтов
RESTORE
FOR j = 0 TO 127
  READ q$
  FOR i = 0 TO 15
    IF MID$(q$, i + 1, 1) = "*" THEN dot(i, j) = 1 ELSE dot(i, j) = 0
  NEXT i
NEXT j
' Граф режим  VGA 320*200*16 цветов
SCREEN 7
' Рисуем 8 видео страниц
FOR k = 0 TO 7
  SCREEN , , k, k
  form = k
  FOR n = 1 TO 19 STEP pi / 6
    r = 10 + 10 * n
    f = n + k * pi / 6 / 8
    sprite 160 + r * COS(f), 100 - r * SIN(f), form, 12
    sprite 160 + r * COS(f), 100 + r * SIN(f), form, 10
    form = (form + 1) MOD 8
  NEXT n
NEXT k
' собственно анимация с музыкой
RESTORE music
DO
  IF INKEY$ <> "" THEN SCREEN 0: WIDTH 80: END
  playnote
LOOP
 
DATA "................"
DATA "................"
DATA "...***....***..."
DATA "..*****..*****.."
DATA "................"
DATA "..**.**..**.**.."
DATA "...***....***..."
DATA ".......**......."
DATA ".**...****...**."
DATA ".**..******..**."
DATA "..************.."
DATA ".....******....."
DATA ".....******....."
DATA "...*..*..*..*..."
DATA "..***.*..*.***.."
DATA "..*****..*****.."
DATA "................"
DATA "...***....***..."
DATA "..*****..*****.."
DATA "................"
DATA "..**.**..**.**.."
DATA "..**.**..**.**.."
DATA "...***....***..."
DATA ".......**......."
DATA ".**...****...**."
DATA ".**..******..**."
DATA "..************.."
DATA ".....******....."
DATA "...*..*****....."
DATA "..***.*..*..*..."
DATA "..*****..*.***.."
DATA ".........*****.."
DATA "................"
DATA "................"
DATA "...***....***..."
DATA "..*****..*****.."
DATA "..*****........."
DATA ".........**.**.."
DATA "...***....***..."
DATA ".......**......."
DATA "......****......"
DATA ".....******....."
DATA ".**.********.**."
DATA ".***.******.***."
DATA ".....******....."
DATA "...*..*..*..*..."
DATA "..***.*..*.***.."
DATA "..*****..*****.."
DATA "................"
DATA "................"
DATA "...***....***..."
DATA "..*****..*****.."
DATA ".........*****.."
DATA "..**.**..*****.."
DATA "...***....***..."
DATA ".......**......."
DATA ".**...****...**."
DATA ".**..******..**."
DATA "..************.."
DATA ".....******....."
DATA ".....******....."
DATA "...*..*..*..*..."
DATA "..***.*..*.***.."
DATA "..*****..*****.."
DATA "................"
DATA ".........***...."
DATA "...***..*****..."
DATA "..*****........."
DATA "........**.**..."
DATA "..**.**..***...."
DATA "...***.........."
DATA ".......**......."
DATA "..**..****..**.."
DATA "..**.******.**.."
DATA "...**********..."
DATA ".....******....."
DATA ".....******....."
DATA "...*..*..*..*..."
DATA "..***.*..*.***.."
DATA "..*****..*****.."
DATA "................"
DATA "......***......."
DATA "...***.***......"
DATA "..*****........."
DATA "........**......"
DATA "..**.**.*......."
DATA "...***.........."
DATA ".......**......."
DATA ".**...****...**."
DATA ".**..******..**."
DATA "..************.."
DATA ".....******....."
DATA ".....******....."
DATA "...*..*..*..*..."
DATA "..***.*..*.***.."
DATA "..*****..*****.."
DATA "................"
DATA "................"
DATA "....*.***......."
DATA "...*.*****......"
DATA "................"
DATA "...*.**.**......"
DATA "....*.***......."
DATA ".............**."
DATA ".**...****...**."
DATA ".**..********..."
DATA "..*********....."
DATA ".....******....."
DATA ".....******....."
DATA "....*.*..*.*...."
DATA "...***....***..."
DATA "...****..****..."
DATA "................"
DATA "................"
DATA "....***..***...."
DATA "...****.*****..."
DATA "................"
DATA "...**.*.**.**..."
DATA "....***..***...."
DATA "................"
DATA "..**..****..**.."
DATA "..**.******.**.."
DATA "...**********..."
DATA ".....******....."
DATA ".....******....."
DATA "...*..*..*..*..."
DATA "..***.*..*.***.."
DATA "..*****..*****.."
' Наша школьная страна
' f - Герцы, t - миллисекунды
music:
DATA 1176, 250
DATA 1319, 250
DATA 1483, 250
DATA 2358, 250
DATA 2358, 250
DATA 2222, 250
DATA 2222, 250
DATA 1976, 250
DATA 1483, 250
DATA 1760, 250
DATA 1572, 375
DATA 1572, 125
DATA 1572, 250
DATA 1976, 250
DATA 1319, 500
DATA 1108, 250
DATA 1176, 250
DATA 1319, 250
DATA 2222, 250
DATA 2222, 250
DATA 1976, 250
DATA 1976, 250
DATA 1872, 250
DATA 1108, 250
DATA 1319, 250
DATA 1176, 250
DATA 1108, 250
DATA 1176, 250
DATA 1319, 250
DATA 1483, 500
DATA 1176, 250
DATA 1319, 250
DATA 1483, 250
DATA 2358, 250
DATA 2358, 250
DATA 2222, 250
DATA 2222, 250
DATA 1976, 250
DATA 1483, 250
DATA 1760, 250
DATA 1572, 375
DATA 1572, 125
DATA 1572, 250
DATA 1976, 250
DATA 1319, 500
DATA 1108, 250
DATA 1176, 250
DATA 1319, 250
DATA 2222, 250
DATA 2222, 250
DATA 1976, 250
DATA 1976, 250
DATA 1872, 250
DATA 1108, 250
DATA 1319, 250
DATA 1176, 250
DATA 1108, 250
DATA 1176, 250
DATA 1319, 250
DATA 1483, 500
DATA 1483, 500
DATA 1976, 500
DATA 1108,1000
DATA 1319, 500
DATA 1483,1500
DATA 1760, 250
DATA 1572, 250
DATA 1483, 500
DATA 1760, 250
DATA 1572, 250
DATA 1483, 500
DATA 1760, 250
DATA 1572, 250
DATA 1483,1500
DATA 1483, 500
DATA 1976, 500
DATA 1108,1000
DATA 1319, 500
DATA 1483,1500
DATA 1760, 250
DATA 1572, 250
DATA 1483, 500
DATA 1760, 250
DATA 1572, 250
DATA 1483, 500
DATA 1572, 250
DATA 1760, 250
DATA 1976,1500
DATA 1976, 250
DATA 1976, 250
DATA 2222, 500
DATA 1976, 250
DATA 1976, 250
DATA 2222, 500
DATA 1976, 250
DATA 1976, 250
DATA 2222,1000
DATA 1976, 750
DATA 1976, 250
DATA 2222, 500
DATA 1976, 250
DATA 1976, 250
DATA 2222, 500
DATA 1976, 250
DATA 1976, 250
DATA 2222,1000
DATA 1976, 750
DATA 1976, 250
DATA 1108, 500
DATA 1319, 250
DATA 1572, 250
DATA 1483, 500
DATA 1872, 250
DATA 2222, 250
DATA 1976,2000
DATA   -1,  -1
 
SUB playnote
' читаем частоту и длительность ноты
READ f, t
' конец мелодии ?
IF f < 0 THEN
  loops = loops + 1
  ' повторяем мелодию 2 раза
  IF loops < 2 THEN
    RESTORE music: READ f, t
  ELSE
  ' выход в Дос после 2 го повтора
    SLEEP 4: SCREEN 0: WIDTH 80: END
  END IF
END IF
' длительность звука в тиках таймера (18 тиков в секунду)
ti = t * 18& / 1000&
' переключение видимой видео страницы
IF loops = 0 THEN SCREEN , , page, page: page = (page + 1) AND 7
FOR i = 1 TO ti
  ' переключение видимой видео страницы
  IF loops = 1 THEN SCREEN , , page, page: page = (page + 1) AND 7
  SOUND f, 1
NEXT i
END SUB
 
SUB sprite (x, y, form, col)
y0 = form * 16
FOR j = 0 TO 15
FOR i = 0 TO 15
IF dot(i, y0 + j) <> 0 THEN
  IF j < 8 THEN c = 15 ELSE c = col
  PSET (x + i, y + j), c
END IF
NEXT i
NEXT j
END SUB
Миниатюры
Графика на бейсике  
2
Модератор
1245 / 676 / 292
Регистрация: 10.11.2019
Сообщений: 1,406
29.12.2023, 16:59
Демо, написанное специально для тормознутого воспроизведения в DosBox или на 386 компьютерах.
Скачайте архив с .pcx файлом для запуска.

QBasic/QuickBASIC
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
'qbasic
DEFINT A-Z
SCREEN 12
DIM a AS STRING * 1
n$ = "hny2024.pcx"
ON ERROR GOTO etrap2
OPEN n$ FOR INPUT AS #1: CLOSE #1
ON ERROR GOTO 0
OPEN n$ FOR BINARY AS #1
GOSUB pl
ON PLAY(1) GOSUB pl
PLAY ON
GET #1, LOF(1) - 768, a
OUT &H3C8, 0
FOR k = 0 TO 767: GET #1, , a: OUT &H3C9, INT(ASC(a) / 4): NEXT k
SEEK #1, 129
r = 0: d = 0
FOR j = 0 TO 239
i = 0
WHILE i < 640
GET #1, , a: r = ASC(a)
IF r < &HC0 THEN
    d = r: r = 1
ELSE
    r = r - &HC0: GET #1, , a: d = ASC(a)
END IF
FOR k = 1 TO r: PSET (i, j + j), d: PSET (i, j + j + 1), d: i = i + 1: NEXT k
WEND
NEXT j
CLOSE #1
fstop = 1
SLEEP 5
SCREEN 0
END
 
pl:
ON ERROR GOTO etrap
READ m$: PLAY m$
ON ERROR GOTO 0
RETURN
 
etrap:
IF fstop <> 0 THEN SLEEP 2: SCREEN 0: END
RESTORE: RESUME
 
etrap2:
PRINT n$; " - file not found"
SLEEP
SCREEN 0
END
 
DATA "MBL8o3AGAFB-4"
DATA "G4GFGEA2FEFDG4D4EDECF2"
DATA "FGAo4CD4o3B-4DEF+AB-2"
DATA "B-AB-GA4F4GFEGF4p4"
Миниатюры
Графика на бейсике  
Вложения
Тип файла: zip hny2024.zip (11.3 Кб, 28 просмотров)
3
Кормпилятор
 Аватар для Quiet Snow
5044 / 1718 / 409
Регистрация: 25.04.2010
Сообщений: 4,827
Записей в блоге: 2
29.12.2023, 21:30  [ТС]
Цитата Сообщение от qbfan Посмотреть сообщение
Демо, написанное специально для тормознутого воспроизведения в DosBox или на 386 компьютерах.
Прога определённо интересная, PCX-а тут ещё не было. В действительности грузит медленно. Есть 2 косяка:
1) Музыка прерывается после загрузки картинки
2) Не запустится на QB4 из-за SLEEP (можно поменять на DO:LOOP и таймер)

Повторюсь прога интересная, т.к. объём кода копеечный.
1
Модератор
1245 / 676 / 292
Регистрация: 10.11.2019
Сообщений: 1,406
21.02.2024, 15:55
Лучший ответ Сообщение было отмечено Quiet Snow как решение

Решение

FreeBasic: загрузка 3D модели.

Этот (довольно длинный) пример показывает, как с помощью языка FreeBasic загрузить и анимировать
3D модель в формате DirectX (.X) Смотри полный исходный текст в аттаче.

QBasic/QuickBASIC
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
383
384
' freebasic
' Эта программа загружает и оживляет DirectX 3D модель (.X файл) используя OpenGL 3D engine
 
#include once "GL/gl.bi"
#include once "GL/glu.bi"
#include once "createtex.bi"
DECLARE FUNCTION LoadModel(mname$,number AS LONG) AS LONG
DECLARE SUB scalemodels
DECLARE FUNCTION LoadGLTextures() AS LONG
DECLARE FUNCTION value(a$,d$) AS SINGLE
DECLARE SUB modify(a AS SINGLE,number AS LONG)
    
DEFLNG a-z
' Длина массива для одной вершины меша
' (3 single - координаты вершины, 3 single - вектор нормали, 2 single - UV)
CONST stride=8*sizeof(SINGLE)
TYPE modeltype
avert AS ushort      ' число вершин
atri  AS ushort      ' число треугольников
pvert  AS SINGLE ptr ' указатель на данные меша
pvert0 AS SINGLE ptr ' указатель на координаты вершин
ptri  AS ushort ptr  ' указатель на треугольники
END TYPE
 
DIM SHARED model(10) AS modeltype
DIM SHARED texture(10) AS GLuint  ' текстуры
 
' всего можно нарисовать 100 фигур
DIM sc(100) AS SINGLE ' масштаб фигуры (по оси Y)
DIM AS SINGLE objy(100),objy1(100) ' координата и скорость фигуры (по оси Y)
 
DIM camerarot AS SINGLE
DIM AS SINGLE yrot,yprecess,zrot,ymod
DIM AS DOUBLE tim,tim0,timstart
 
' используйте ...,,2+1 чтобы стартовать в полном экране (не в окне)
screenres 1024,768,32,,2
 
'' ReSizeGLScene
glViewport 0, 0, 1024, 768                     '' Reset The Current Viewport
glMatrixMode GL_PROJECTION                     '' Select The Projection Matrix
glLoadIdentity                                 '' Reset The Projection Matrix
gluPerspective 45.0, 640.0/480.0, 0.1, 100.0   '' Calculate The Aspect Ratio Of The Window
glMatrixMode GL_MODELVIEW                      '' Select The Modelview Matrix
glLoadIdentity                                 '' Reset The Modelview Matrix
 
'' Загрузить текстуры
r=LoadGLTextures()
'' Загрузить меши (тело, причёска, лицо)
r=LoadModel("pop_body.x",1)
r=LoadModel("pop_hair.x",2)
r=LoadModel("pop_face.x",3)
'' масштабировать меши
scalemodels
'' установки для OpenGL
glEnable GL_TEXTURE_2D                         '' Enable Texture Mapping ( NEW )
glShadeModel GL_SMOOTH                         '' Enable Smooth Shading
'' цвет фона - светло голубой
glClearColor 0.0, 0.5, 1.0, 1.0                '' Light Blue Background
glClearDepth 1.0                               '' Depth Buffer Setup
glEnable GL_DEPTH_TEST                         '' Enables Depth Testing
glDepthFunc GL_LEQUAL                          '' The Type Of Depth Testing To Do
glHint GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST    '' Really Nice Perspective Calculations
'   enable alphablending
glEnable GL_BLEND
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA)
' освещение
DIM AS SINGLE glfLightAmbient(4) = {  1.7, 1.7, 1.7, 1.0 }
DIM AS SINGLE glfLightDiffuse(4) = {  0.3, 0.3, 0.3, 1.0 }
DIM AS SINGLE glfLightSpecular(4) ={  0.0, 0.0, 0.0, 1.0 }
DIM AS SINGLE glfLightPosition(4) ={  0.0, 0.0, -4.0, 0.0 }
DIM AS SINGLE glfLightDirection(4) ={ 0.0, 0.0, 1.0, 0.0 }
DIM AS SINGLE glfLightDirection1(4)={ 1.0 ,1.0, 1.0, 0.0 }
'glEnable (GL_LIGHTING)
glEnable (GL_LIGHT0)
glEnable (GL_LIGHT1)
 
glLightfv (GL_LIGHT0, GL_AMBIENT, @glfLightAmbient(0))
glLightfv (GL_LIGHT0, GL_DIFFUSE, @glfLightDiffuse(0))
glLightfv (GL_LIGHT0, GL_SPECULAR, @glfLightSpecular(0))
glLightfv (GL_LIGHT0, GL_SPOT_DIRECTION, @glfLightDirection(0))
 
glLightfv (GL_LIGHT1, GL_AMBIENT, @glfLightAmbient(0))
glLightfv (GL_LIGHT1, GL_DIFFUSE, @glfLightDiffuse(0))
glLightfv (GL_LIGHT1, GL_SPECULAR, @glfLightSpecular(0))
glLightfv (GL_LIGHT1, GL_SPOT_DIRECTION, @glfLightDirection1(0))
 
glLightfv (GL_LIGHT1, GL_POSITION, @glfLightPosition(0))
'glLightf(GL_LIGHT0,GL_SPOT_EXPONENT,40.0)
 
'glEnable (GL_LIGHTING)
'glEnable (GL_LIGHT0)
 
' основной цикл
DIM AS SINGLE camx, camz ' координаты камеры
onstart=-1
DO
' рестарт анимации каждые 30 секунд
IF onstart OR timer-timstart>30 THEN
    onstart=0
    tim=TIMER()
    tim0=tim
    timstart=tim
    fl=0
    camx=0
    camz=4.0
    camerarot=0
    yrot=0
    yprecess=0
    ymod=0
    zrot=0
    RANDOMIZE TIMER
    FOR i=0 TO 99:sc(i)=.9+.3*RND:objy(i)=1.0+2.0*RND:objy1(i)=.01+.02*RND:NEXT i
END IF
scenetri=0
motion=0
' анимация и управление камерой 40 раз в секунду (каждые 25 миллисекунд)
IF TIMER()-tim>.025 THEN
    tim=tim+.025
    '  стрелки двигают камеру
    IF multikey(&h48) THEN camz+=.05
    IF multikey(&h50) THEN camz-=.05
    IF multikey (&h4B) THEN camx+=.05
    IF multikey (&h4D) THEN camx-=.05
    camerarot += 0.01     '' X Axis Rotation
    yrot = yrot+0.05     '' Y Axis Rotation
    yprecess+=0.03
    ymod = ymod+0.12
    zrot += 0.01     '' Z Axis Rotation
    motion=-1
END IF
'' очистить экран
glClear GL_COLOR_BUFFER_BIT OR GL_DEPTH_BUFFER_BIT      '' Clear Screen And Depth Buffer
 
''''''''''
' Углы и координаты камеры в терминах DarkBasic
glMatrixMode GL_PROJECTION                     '' Select The Projection Matrix
glLoadIdentity                                 '' Reset The Modelview Matrix
' Очень важная процедура - если её пропустить, то мы ничего не увидим
' (отрисовка с углом камеры 45 градусов, видимость Z от 0.1 до 100, длина к ширине - 640/480)
'Very important function (if we miss it, we can't see anything)
gluPerspective 45.0, 640.0/480.0, 0.1, 100.0   '' Calculate The Aspect Ratio Of The Window
' position camera
glTranslatef camx - 0.3, -0.5, camz + 0.4*SIN(camerarot)
' rotate camera
' обратите внимание, что аргументы при вращении в OpenGl - градусы,
' а аргументы sin и cos - радианы
' т е камера покачивается отн. оси Y на -3.0 до 3.0 градуса
glRotatef 3.0*SIN(camerarot),0.0, 1.0, 0.0
' вывод фигур
obj=0
FOR nobj=-1 TO 3
    obj+=1
    ' если установлен флаг motion, создать эффект падения фигуры
    IF motion THEN
        objy1(obj)-=.0006
        IF objy1(obj)<-.02 THEN objy1(obj)=-.02
        objy(obj)+=objy1(obj)
        IF objy(obj)<0 THEN
            objy(obj)=0
            objy1(obj)=-objy1(obj)*.97
        END IF
    END IF
    ' движение рук
    modify(ymod+2*obj,1)    
    ''''''
    ' Переключиться с управления положения камеры на управление моделью
    glMatrixMode GL_MODELVIEW                      '' Select The Modelview Matrix
    glLoadIdentity                                 '' Reset The Modelview Matrix
    
    ''''''
    ' разместить модель в 3D пространстве
    glTranslatef 0.2+0.3*nobj+(.3+.05*COS(yrot))*raw, 0.4+objy(obj), -6.0-1.0*SIN(nobj)
    ' вращать модель отн оси Y
    glRotatef 30.0*yprecess+60.0*SIN(yrot)+30.0*nobj,0.0, 1.0, 0.0
    ' вращать модель отн оси X
    glRotatef 5.0*SIN(yrot),1.0, 0.0, 0.0
    ' масштабировать модель отн оси Y (чтобы фигурки были разного роста)
    glScalef 1.0,sc(obj),1.0
    ' рисуем 3 меша
    FOR number=1 TO 3
        glPushMatrix
        ' эффект покачивания головы (причёска и лицо вращаются вдоль оси Z)
        IF number=2 OR number=3 THEN
            glRotatef 10.0*SIN(yrot*1.5+nobj), 0.0,0.0,1.0
        END IF
        glBindTexture GL_TEXTURE_2D, texture(number)     '' Выбрать текстуру
        ' Выбрать координаты вершин
        glEnableClientState(GL_VERTEX_ARRAY)
        glVertexPointer(3,GL_FLOAT,stride,model(number).pvert)
        ' Выбрать векторы нормалей (отключено)
        '  glEnableClientState(GL_NORMAL_ARRAY)
        '  glNormalPointer(GL_FLOAT,stride,model(number).pvert+3)
        ' Выбрать UV текстуры
        glEnableClientState(GL_TEXTURE_COORD_ARRAY)
        glTexCoordPointer(2,GL_FLOAT,stride,model(number).pvert+6)
        ntri=model(number).atri
        ' Сколько всего треугольников в сцене 
        scenetri=scenetri+ntri
        triang=ntri*3
        ' short ! Нарисовать меш из треугольников
        glDrawElements(GL_TRIANGLES,triang,GL_UNSIGNED_SHORT,model(number).ptri)
        glPopMatrix
    NEXT number ' след. меш
NEXT nobj ' след фигура
' Update screen ' Обновить экран
flip
' Подсчитать быстродействие и вывести в заголовок окна
fl=(fl+1) AND 255
IF fl=0 THEN
    fps=INT(256.0/(TIMER()-tim0)):tim0=TIMER()
    windowtitle "Scene triangles="+STR$(scenetri)+" fps="+STR$(fps)
END IF
' если нажата Esc или крестик окна мышкой, то финиш
q$=INKEY$:IF q$=CHR$(27) OR q$=CHR$(255)+CHR$(107) THEN END
LOOP ' конец основного цикла
END  ' конец основной программы, далее функции и процедуры
 
'' Load Bitmaps And Convert To Textures
'' Загрузить .BMP текстуры и преобразовать их в текстуры OpenGL
FUNCTION LoadGLTextures() AS LONG
DIM TextureImage AS ulong ptr   ' Create Storage Space For The Texture
TextureImage=imagecreate(256,256)
BLOAD exepath+"\pop_body.bmp",TextureImage
texture(1) = CreateTexture(TextureImage,256,256,TEX_MASKED+TEX_MIPMAP)
BLOAD exepath+"\pop_hair.bmp",TextureImage
texture(2) = CreateTexture(TextureImage,128,128,TEX_MASKED+TEX_MIPMAP)
BLOAD exepath+"\pop_face.bmp",TextureImage
texture(3) = CreateTexture(TextureImage,128,128,TEX_MASKED+TEX_MIPMAP)
ImageDestroy(TextureImage)
RETURN -1
END FUNCTION
 
' масштабировать меши. Модель .x была захвачена из игры, поэтому требует 
' небольшой правки
SUB scalemodels
DIM AS SINGLE ptr modeldata,modeldata0
DIM AS SINGLE ymin,ymax,xmin,xmax,zmin,zmax,x,y,z,x0,y0,z0
DIM AS SINGLE dx,dy,dz,sc,angx
DIM AS LONG cnt,i,p,p0,number
sc=.3 ' уменьшить меш до масштаба 0.3
FOR number=1 TO 3
    IF model(number).avert=0 THEN EXIT SUB
    cnt=model(number).avert
    IF model(number).pvert=0 THEN EXIT SUB
    modeldata=model(number).pvert
    modeldata0=model(number).pvert0
    FOR i=0 TO cnt -1
        p=8*i:p0=3*i
        x=modeldata[p]
        y=modeldata[p+1]-1.2
        z=modeldata[p+2]
 
        modeldata[p]=sc*x
        modeldata[p+1]=sc*y
        modeldata[p+2]=sc*z
        
        modeldata0[p0]=sc*x
        modeldata0[p0+1]=sc*y
        modeldata0[p0+2]=sc*z
    NEXT i
NEXT number
END SUB
 
' Load vertex, normals, triangles and uv data from the text file (converted from text .x 3D model)
' Загрузить вершины,нормали,треугольники и UV из файла .X
' Файл .X был доработан так:
' 1) Перевод строки LF заменён на обычный CR,LF
' 2) В начале каждого массива стоит комментарий #vert,#norm,#tri,#uv
' (это не мешает при загрузке .X файла из стандартных программ, например mview.exe)
FUNCTION LoadModel(mname$,number AS LONG) AS LONG
DIM AS LONG cnt,cvert,ctri,i,q,p,p0
DIM modeldata AS SINGLE ptr
DIM modeldata0 AS SINGLE ptr
DIM modeltri AS ushort ptr
OPEN exepath+"\"+mname$ FOR INPUT AS #1
WHILE NOT EOF(1)
LINE INPUT #1,a$
IF a$="#vert" THEN
    LINE INPUT #1,a$
    cnt=value(a$,";")
    model(number).avert=cnt
    ' Выделить память 8*4*cnt байт, где 8=3+3+2 - массив вершин, нормалей и uv,
    ' 4 - размер Single в байтах
    model(number).pvert=allocate(8*sizeof(SINGLE)*cnt)
    ' дополнительно выделить память под координаты вершин
    model(number).pvert0=allocate(3*sizeof(SINGLE)*cnt)
    modeldata=model(number).pvert
    modeldata0=model(number).pvert0
    FOR i=0 TO model(number).avert-1
        LINE INPUT #1,a$
        p=8*i:p0=3*i
        ' Правка 1 - масштабировать координаты вершин x,y - до 0.1, z - до 0.4
        ' и сдвинуть координату по z
        modeldata[p]=value(a$,";")
        modeldata0[p0]=modeldata[p]
        modeldata[p+1]=value(a$,";")
        modeldata0[p0+1]=modeldata[p+1]
        modeldata[p+2]=value(a$,";")
        modeldata0[p0+2]=modeldata[p+2]
    NEXT i
ELSEIF a$="#norm" THEN
    LINE INPUT #1,a$
    cnt=value(a$,";")
    FOR i=0 TO model(number).avert-1
        p=8*i
        LINE INPUT #1,a$
        modeldata[p+3]=value(a$,";")
        modeldata[p+4]=value(a$,";")
        modeldata[p+5]=value(a$,";")
    NEXT i
ELSEIF a$="#tri" THEN
    LINE INPUT #1,a$
    cnt=value(a$,";")
    model(number).atri=cnt
    ' Выделить память подд треугольники 6=3*2*cnt где 2 - размер ushort в байтах
    model(number).ptri=allocate(3*sizeof(ushort)*cnt)
    modeltri=model(number).ptri
    FOR i=0 TO model(number).atri-1
        q=3*i
        LINE INPUT #1,a$:unused=value(a$,";")
        modeltri[q]=value(a$,",")
        modeltri[q+1]=value(a$,",")
        modeltri[q+2]=value(a$,";")
    NEXT i
ELSEIF a$="#uv" THEN
    LINE INPUT #1,a$
    cnt=value(a$,";")
    FOR i=0 TO model(number).avert-1
        p=8*i
        LINE INPUT #1,a$
        modeldata[p+6]=value(a$,";")
        modeldata[p+7]=1.0-value(a$,";")
    NEXT i
END IF
WEND
CLOSE #1
RETURN -1
END FUNCTION
' Получить очередное число из строки (d$ символ-разделитель)
FUNCTION value(a$,d$) AS SINGLE
b$=MID$(a$,1,INSTR(a$,d$)-1):a$=MID$(a$,INSTR(a$,d$)+1)
value=VAL(b$)
END FUNCTION
 
' Простая анимация меша (движение рук)
SUB modify(a AS SINGLE,number AS LONG)
DIM modeldata AS SINGLE ptr
DIM modeldata0 AS SINGLE ptr
DIM AS SINGLE x,y,z,x0,y0,z0,xt,yt,ang,sina,cosa,sina1
DIM AS LONG p0,p,nvert,i
modeldata=model(number).pvert
modeldata0=model(number).pvert0
nvert=model(number).avert
IF modeldata=0 OR modeldata0=0 THEN EXIT SUB
ang=.3*SIN(a)+.8
sina=SIN(ang)
cosa=COS(ang)
' для всех вершин меша
FOR i=0 TO nvert-1
    ' x0,y0,z0 - координаты вершины в исходном меше
    p0=i*3:p=i*8
    x0=modeldata0[p0]
    y0=modeldata0[p0+1]
    z0=modeldata0[p0+2]
    ' если вершина относится к рукам
    IF y0>-.08 AND ABS(x0)>.04 THEN
        IF x0<0 THEN sina1=sina ELSE sina1=-sina
        IF x0<0 THEN xt=x0+.04 ELSE xt=x0-0.04
        yt=y0+.06
        x=xt*cosa-yt*sina1
        y=xt*sina1+yt*cosa
        IF x0<0 THEN x=x-.04 ELSE x=x+0.04
        y=y-.06
    ' иначе ничего не делать
    ELSE
        x=x0
        y=y0
    END IF
    ' изменить меш (z в данном примере не меняется)
    modeldata[p  ]=x
    modeldata[p+1]=y
NEXT i
END SUB
Миниатюры
Графика на бейсике  
Вложения
Тип файла: zip fb_xfile.zip (228.9 Кб, 18 просмотров)
1
Кормпилятор
 Аватар для Quiet Snow
5044 / 1718 / 409
Регистрация: 25.04.2010
Сообщений: 4,827
Записей в блоге: 2
23.02.2024, 14:48  [ТС]
Наконец то мы увидели хоть что-то интересное, к тому же на более менее актуальном ЯП. Благодарю qbfan, за проделанную работу. Как говорится keep rockin!!!

Вот смотрите люди, человек заслужил свою модерку абсолютно честно, знаниями, опытом. А не детсадовскими задачами.

P.S: qbfan допиши в сообщение с примером номер версии компилятора(имхо, это важно).
Позже откомпилирую посмотрю, мне это интересно.
0
Модератор
1245 / 676 / 292
Регистрация: 10.11.2019
Сообщений: 1,406
23.02.2024, 15:50
Цитата Сообщение от Quiet Snow Посмотреть сообщение
номер версии компилятора(имхо, это важно).
FreeBasic fbc32.exe
Version 1.08.0

Строка компиляции:

Windows Batch file
1
D:\drive_j\FreeBas8\fbc32.exe -lang fblite -s gui "gl_sim3_pop_rus.bas"
1
 Аватар для yevrowl
304 / 75 / 6
Регистрация: 27.04.2022
Сообщений: 238
20.07.2025, 03:28
Модификация игры «Саймон», изобретённой Ральфом Генри Бером и Говардом Дж. Моррисоном, и имеющей советскую реализацию Электроника ИЭ-01 «Иволга». Вместо четырёх ячеек теперь от двух до десяти.
Миниатюры
Графика на бейсике  
Вложения
Тип файла: 7z simon.7z (46.4 Кб, 4 просмотров)
Тип файла: 7z source.7z (4.8 Кб, 4 просмотров)
1
 Аватар для yevrowl
304 / 75 / 6
Регистрация: 27.04.2022
Сообщений: 238
20.07.2025, 17:05
Цитата Сообщение от MiXa42 Посмотреть сообщение
У меня собственная игра
Под Windows пашет.

Но не получилось скомпилировать в QuickBasic (для DOS), к сожалению...
0
 Аватар для yevrowl
304 / 75 / 6
Регистрация: 27.04.2022
Сообщений: 238
21.07.2025, 00:46
Цитата Сообщение от Vladimir1982 Посмотреть сообщение
Нашел у себя в документах 3D на QBASIC:
Что-то не то с кодировкой, вот исправил текст — http://old-dos.ru/index.php?pa... &id=105368
1
 Аватар для Mikle Quits
769 / 286 / 17
Регистрация: 21.01.2023
Сообщений: 456
21.07.2025, 11:25
Коль уж коснулись 3D на QBasic.
Я когда-то хотел написать 3D гоночки на QB, рельефа нет - всё на плоскости, но вид 3D, можно произвольно поворачиваться.
Игру я тогда не сделал, сделал уже позже на VB6, но 3D графика работает.
Вот архив тех попыток. Там три короткие Asm процедуры:
Line - рисование текстурой линии с перспективной коррекцией.
Halt - ожидание vsync (!).
XMS - работа с функциями XMS.
Исходник Line прилагается (компилировал с помощью TASM). Исходники двух других процедур найти не могу, но там очень коротко, можно просто посмотреть с помощью Debug и разобраться.
Исходники на QB полные, включая вспомогательные программы для преобразования картинок в более удобный для чтения из QB формат.
Две программы (3D и SP_TEST) скомпилированы, они делают одно и то же, но 3D в 10 раз быстрее, уж не помню, что я там соптимизировал, помню, что на Пентиумах работало вполне играбельно. Из обеих программ выход не предусмотрен, нужно просто дождаться окончания, они измеряют FPS. Там несколько секунд (только разгоните DOSBox хотя бы на 30000 циклов).
Миниатюры
Графика на бейсике  
Вложения
Тип файла: zip 3D-NEW.zip (138.9 Кб, 15 просмотров)
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
21.07.2025, 11:25
Помогаю со студенческими работами здесь

решение задач на бейсике
прошу, помогите с решением номера 98 и 99

Можно ли на Бейсике писать хак-софт?
Можно ли на Бейсике писать хакерские программы, типа брутфорсов, чекеров, спамеров, грабберов, реггеров и тд.?

составить разветвляющую программу в бейсике при заранее неизвестных значениях параметров
Пожалуйста помогите нубу составить разветвляющую программу в бейсике при заранее неизвестных значениях параметров

Составить программу в бейсике для вычисления значения функции при заданных параметрах
Пожалуйста помогите нубу составить программу в бейсике для вычисления значения функции при заданных параметрах

Третий раз информатику буду сдавать информатику. На языке Бейсике
Дан одномерный массив A из N элементов. Если четвертый элемент массива больше квадратного 6-го элемента, то каждый четвертый элемент...


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

Или воспользуйтесь поиском по форуму:
176
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! в-строка - входное арифметическое выражение в инфиксной(обычной). . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru