purebasic.info

PureBasic forum
Текущее время: Вт май 21, 2019 8:21 am

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




Начать новую тему Ответить на тему  [ Сообщений: 24 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Графика, с чего начать?
СообщениеДобавлено: Сб июн 11, 2016 10:30 pm 
Не в сети
доцент
Аватар пользователя

Зарегистрирован: Ср май 18, 2016 11:52 pm
Сообщений: 39
Откуда: Нижегородская обл.
Благодарил (а): 18 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Пишу как начинающий изучать программирование в PureBasic.
Ещё с времён Qbasic, была проблема графики, точней, перемещение нарисованного объекта не оставляя следа пикселей на предыдущей позиции.
Удивляют разные примеры, но код очень непонятен, порой в примерах непонятно, где идентификатор, а где оператор.
Может кто подскажет максимально просто, как нарисовать линию в окне или квадрат и после его вращать или перемещать?


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Графика, с чего начать?
СообщениеДобавлено: Вс июн 12, 2016 6:12 am 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6515
Благодарил (а): 28 раз.
Поблагодарили: 214 раз.
Пункты репутации: 57
Ev3658 писал(а):
Ещё с времён Qbasic, была проблема графики, точней, перемещение нарисованного объекта не оставляя следа пикселей на предыдущей позиции.

Проблем с выводом графики в QB не было. Там отличные графические режимы по тем временам! Была проблема синхронизировать скорость на всех компьютерах, это да.
Принцип движения был и остается один:

создал изображение
вывел на экран
стёр
создал изображение в другом месте
вывел на экран
повторять пока изображение движется!

Для работы с двигающимися изображениями в PB есть библиотека спрайтов. Можно как и в QB делать программы на полный экран ( графический режим), а можно и в окне
Очень простой пример
Код:
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
 
InitSprite()  ; Подключпем библиотеку спрайтов
InitKeyboard(); Подключаем управление с клавиатуры
 
  OpenWindow(0, 0, 0, 220, 220, "Простой спрайт", #PB_Window_SystemMenu | #PB_Window_ScreenCentered); Основное окно программы
  OpenWindowedScreen(WindowID(0), 0, 0, 220, 220); Графическое окно программы
      CreateSprite(0, 20, 20); Создаем изображение
      If StartDrawing(SpriteOutput(0))
        Box(0, 0, 20, 20, RGB(255, 0, 155)) ; Квадрат
        StopDrawing()
      EndIf
 
  direction = 2 ; Приращение скорости
  Repeat
    FlipBuffers() ; Буфер изображения
    ClearScreen(RGB(0, 0, 0)); очищаем графический экран
    DisplaySprite(0, x, x); Выводим изображение на экран с новыми координатами
    x + direction            ; изменяем координаты изображения
    If x > 200 : direction = -2 : EndIf ; меняем направление движения при сталкновениях
    If x < 0   : direction =  2 : EndIf ; меняем направление движения при сталкновениях
       
    ExamineKeyboard() ; Опрашиваем клавиатуру
   
    If KeyboardPushed(#PB_Key_R)           ; Если нажата R, то вращаем изображение
      If r<360:r+10:Else:r=0:EndIf
      RotateSprite(0, r, #PB_Absolute)     ;то вращаем изображение
    EndIf
       
    If KeyboardPushed(#PB_Key_Q) ; Если нажата Q, то выходим из программы
         End
    EndIf
 ForEver
 


_________________
read-only ¯\_(ツ)_/¯


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Графика, с чего начать?
СообщениеДобавлено: Вс июн 12, 2016 6:20 am 
Не в сети
профессор

Зарегистрирован: Вт май 13, 2014 4:12 am
Сообщений: 811
Благодарил (а): 82 раз.
Поблагодарили: 23 раз.
Пункты репутации: 5
Чтобы не оставлять хвост, нужно "грабить" место на котором собираешься рисовать, при смещении возвращаешь "награбленное", опять "грабишь" по новым координатам и рисуешь своё.
Код:
1
Результат = GrabImage(#Image1, #Image2, x, y, Width, Height)



Виталю оказывается тоже не спиЦа, он ещё версию кинул. :D


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Графика, с чего начать?
СообщениеДобавлено: Вс июн 12, 2016 6:30 am 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6515
Благодарил (а): 28 раз.
Поблагодарили: 214 раз.
Пункты репутации: 57
Прямой перевод кода с QB на PB без спрайтов может выглядеть так:
Код:
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
 
; Declare SUB Ris (x!, y!, d!)
;  
; d = 100
; SCREEN 11
; WINDOW (-100, 100)-(100, -100)
;  
; CALL Ris(0, 0, d)
;  
; PRINT "ENTER"
; SLEEP 0
; SCREEN 0
; End
;  
; SUB Ris (x, y, d)
;  
; If d < 10 THEN EXIT SUB
;    Line (x, y + d / 2)-(x, y - d / 2)
;    Line (x + d / 2, y)-(x - d / 2, y)
;    Line (x - d / 3, y + d / 3)-(x + d / 3, y - d / 3)
;    Line (x + d / 3, y + d / 3)-(x - d / 3, y - d / 3)
;  
;    CALL Ris(x - d / 2, y, d / 2)
;    CALL Ris(x + d / 2, y, d / 2)
;    CALL Ris(x, y - d / 2, d / 2)
;    CALL Ris(x, y + d / 2, d / 2)
; End SUB
 
 
; Процедура сдвига графика на 100
Procedure QLine(x1.f, y1.f, x2.f, y2.f)
 
  x1+100:y1+100:x2+100:y2+100
 
  LineXY(x1,y1,x2,y2,RGB(x1+x2,y1,y2))
 
EndProcedure
 
 
 
Procedure Ris(x.f,y.f,d.f)
 
  If d<10:ProcedureReturn 1: EndIf
 
    QLine (x, y + d / 2,x, y - d / 2)
    QLine (x + d / 2, y,x - d / 2, y)
    QLine (x - d / 3, y + d / 3,x + d / 3, y - d / 3)
    QLine (x + d / 3, y + d / 3,x - d / 3, y - d / 3)
;  
Ris(x - d / 2, y, d / 2)
Ris(x + d / 2, y, d / 2)
Ris(x, y - d / 2, d / 2)
Ris(x, y + d / 2, d / 2)
 
 
EndProcedure
 
Global d.f = 100
 
If OpenWindow(0, 0, 0, 640, 350, "2DDrawing Example", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    If CreateImage(0, 640, 350) And StartDrawing(ImageOutput(0))
      Box(0, 0, 640, 350, 0); COLOR 1,3
     
      Ris(0, 0, d)
     
     
      StopDrawing()
      ImageGadget(0, 0, 0, 640, 350, ImageID(0))
    EndIf
   
    Repeat
      Event = WaitWindowEvent()
    Until Event = #PB_Event_CloseWindow
  EndIf


_________________
read-only ¯\_(ツ)_/¯


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Графика, с чего начать?
СообщениеДобавлено: Вт июн 14, 2016 6:23 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11461
Благодарил (а): 4 раз.
Поблагодарили: 464 раз.
Ev3658 писал(а):
Может кто подскажет максимально просто, как нарисовать линию в окне или квадрат и после его вращать или перемещать?
Для рисования есть библиотеки 2D Drawing и VectorDrawing.
Есть также библиотеки для создания 2D и 3D игр. Это не совсем рисование, но эти функции позволяют довольно просто перемещать и вращать объекты.

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Графика, с чего начать?
СообщениеДобавлено: Ср июн 15, 2016 10:21 pm 
Не в сети
доцент
Аватар пользователя

Зарегистрирован: Ср май 18, 2016 11:52 pm
Сообщений: 39
Откуда: Нижегородская обл.
Благодарил (а): 18 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Ооо, спасибо за информацию, у меня нет выбора, надо переваривать!
На Qbasic по спрайтам проблем небыло, шаг был малый. Но в графических режимах затирание при перемещении было очень долгим и не красивым.
В принципе ведь в PureBasic вроде есть возможность сперва рисовать, а потом выводить на экран?


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Графика, с чего начать?
СообщениеДобавлено: Чт июн 16, 2016 7:34 am 
Не в сети
профессор

Зарегистрирован: Вт май 13, 2014 4:12 am
Сообщений: 811
Благодарил (а): 82 раз.
Поблагодарили: 23 раз.
Пункты репутации: 5
Ev3658 писал(а):
В принципе ведь в PureBasic вроде есть возможность сперва рисовать, а потом выводить на экран?

Ну да, где то читал про буферы, они как то там по очереди заполняются, а потом как то на экран переключаются.
Те кто игрушками увлекаются, они точнее подскажут где про это почитать, а я давно-давно читал, не помню где.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Графика, с чего начать?
СообщениеДобавлено: Чт июн 16, 2016 9:17 am 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6515
Благодарил (а): 28 раз.
Поблагодарили: 214 раз.
Пункты репутации: 57
newJS писал(а):
Ну да, где то читал про буферы, они как то там по очереди заполняются, а потом как то на экран переключаются.
Те кто игрушками увлекаются, они точнее подскажут где про это почитать, а я давно-давно читал, не помню где.

FlipBuffers() ; Буфер изображения

_________________
read-only ¯\_(ツ)_/¯


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Графика, с чего начать?
СообщениеДобавлено: Чт янв 24, 2019 7:39 pm 
Не в сети
док

Зарегистрирован: Чт окт 27, 2011 7:43 pm
Сообщений: 136
Откуда: Санкт-Ленинград
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Попробовал тут имитировать мигание светодиода при помощи 2D Drawing.
Взял два изображения круга, одно - тёмное (подложка), другое необходимого цвета (включённый светодиод).
Через миллисекундную задержку накладываю на подложку цветное изо с разным параметром альфы.
И в цикле меняю альфу от 0 до 255 и обратно.
Под Линухом нормально смотрится, а вот под Виндой периодически мерцает.
Где-то помнится была функция, которая, вроде, должна это сглаживать, не могу найти.
Подскажите, плиз?
Или может вообще как-то надо по-другому делать?

_________________
ICQ нет, и, в ближайшее время, не будет


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Графика, с чего начать?
СообщениеДобавлено: Чт янв 24, 2019 8:06 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11461
Благодарил (а): 4 раз.
Поблагодарили: 464 раз.
Gregory писал(а):
Через миллисекундную задержку накладываю на подложку цветное изо с разным параметром альфы.
Так часто не имеет смысла. Все равно не будет отображено больше кадров чем выбрано в настройках видеокарты.

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Графика, с чего начать?
СообщениеДобавлено: Чт янв 24, 2019 8:31 pm 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6515
Благодарил (а): 28 раз.
Поблагодарили: 214 раз.
Пункты репутации: 57
Gregory писал(а):
Или может вообще как-то надо по-другому делать?

Может и по другому.
Только вначале покажите, как у вас сделано?

_________________
read-only ¯\_(ツ)_/¯


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Графика, с чего начать?
СообщениеДобавлено: Чт янв 24, 2019 9:59 pm 
Не в сети
док

Зарегистрирован: Чт окт 27, 2011 7:43 pm
Сообщений: 136
Откуда: Санкт-Ленинград
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
kvitaliy писал(а):
как у вас сделано?
Так выше описАл как.
Вот сама процедура:

Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Procedure.a  CreateImageLed (ImageBack.w, ImageForDrawing.w, VolAlpha.a, GdgForImage.w)
 
   If CatchImage(ImageBack, ?ImageLedOff, ?ImageLedOffEnd-?ImageLedOff)
   Else
       MessageRequester(FatalError00$, FatalErrorMes01_00$  + SetStringOutSys$ + "Code:  ????" + SetStringOutSys$ + FatalErrorMes01_01$) ; Выводим на экран сообщение.
       End
   EndIf
 
   If StartDrawing(ImageOutput(ImageBack))
       DrawAlphaImage(ImageID(ImageForDrawing), 0, 0, VolAlpha)
   Else
       MessageRequester(FatalError00$, FatalErrorMes01_00$  + SetStringOutSys$ + "Code:  ????" + SetStringOutSys$ + FatalErrorMes01_01$) ; Выводим на экран сообщение.
       End
   EndIf
     StopDrawing()
 
     SetGadgetState(GdgForImage, ImageID(ImageBack))
 
 
EndProcedure


_________________
ICQ нет, и, в ближайшее время, не будет


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Графика, с чего начать?
СообщениеДобавлено: Чт янв 24, 2019 10:16 pm 
Не в сети
профессор

Зарегистрирован: Пт фев 20, 2009 12:57 pm
Сообщений: 1752
Откуда: Алматы
Благодарил (а): 17 раз.
Поблагодарили: 49 раз.
Пункты репутации: 5
а разве не будет тут утечки памяти?
Код:
1
If CatchImage(ImageBack, ?ImageLedOff, ?ImageLedOffEnd-?ImageLedOff)



по идее надо либо предварительно освобождать ImageBack, либо если эта картинка всегда одинаковая и лежит в ресурсах - то вынести её за пределы процедуры... которая видимо, как я полагаю, вызывается по таймеру.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Графика, с чего начать?
СообщениеДобавлено: Чт янв 24, 2019 10:29 pm 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6515
Благодарил (а): 28 раз.
Поблагодарили: 214 раз.
Пункты репутации: 57
В процедуре много лишнего и ресурсоёмкого.
например StartDrawing - его стараться не вызывать в цикле, это тормоз!
Вообще в цикле минимум операций, например так
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
 
Procedure.a  CreateImageLed (ImageBack.w, ImageForDrawing.w, VolAlpha.a, GdgForImage.w)
  DrawAlphaImage(ImageID(ImageForDrawing), 0, 0, VolAlpha)
  SetGadgetState(GdgForImage, ImageID(ImageBack))
EndProcedure
   
   If CatchImage(ImageBack, ?ImageLedOff, ?ImageLedOffEnd-?ImageLedOff)
   Else
       MessageRequester(FatalError00$, FatalErrorMes01_00$  + SetStringOutSys$ + "Code:  ????" + SetStringOutSys$ + FatalErrorMes01_01$) ; Выводим на экран сообщение.
       End
   EndIf
     
   If StartDrawing(ImageOutput(ImageBack))
     
     For VolAlpha = 0 To 250
       CreateImageLed (ImageBack.w, ImageForDrawing.w, VolAlpha.a, GdgForImage.w)
       Delay(60)
     Next
   
   Else
       MessageRequester(FatalError00$, FatalErrorMes01_00$  + SetStringOutSys$ + "Code:  ????" + SetStringOutSys$ + FatalErrorMes01_01$) ; Выводим на экран сообщение.
       End
   EndIf
   StopDrawing()



Чтобы не мерцало надо давать оконным событиям нормально функционировать, не подвешивать их. Лучше такие "мигалки" делать в отдельном потоке или по таймеру.

_________________
read-only ¯\_(ツ)_/¯


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Графика, с чего начать?
СообщениеДобавлено: Пт янв 25, 2019 4:50 am 
Не в сети
профессор

Зарегистрирован: Вт май 13, 2014 4:12 am
Сообщений: 811
Благодарил (а): 82 раз.
Поблагодарили: 23 раз.
Пункты репутации: 5
не понял зачем альфу менять если требуется мигание, а если альфу менять то зачем две картинки?
если мигать, то две картинки в одних координатах и менять им размер, 0 или полный(одну любую сторону), и ненадо ни чего перерисовывать
а в потоке или нет зависит от надобности, может ему надо чтобы всё ждало пока мигает

это? в справке описано
SmartWindowRefresh(#W, #True)


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

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


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

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


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

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