forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   FAQ (http://forum.boolean.name/forumdisplay.php?f=15)
-   -   Спидометр (http://forum.boolean.name/showthread.php?t=3788)

impersonalis 30.06.2007 02:53

Спидометр
 
Код:

BACK=CreateImage(64,64)
SetBuffer ImageBuffer(BACK)
Color 255,255,255
Oval 0,0,64,64

Color 0,0,255
For i=0 To 359 Step 15
        Line 32,32,32+Cos(i)*30,32+Sin(i)*30
Next

Color 255,255,255
Oval 32-20,32-20,40,40

Color 255,0,0
Oval 32-2,32-2,4,4
SaveBuffer(ImageBuffer(BACK),"back.bmp")
FreeImage BACK
;=====================================
BACK=CreateImage(64,64)
SetBuffer ImageBuffer(BACK)
Rect 31,2,3,30
SaveBuffer(ImageBuffer(BACK),"back2.bmp")
FreeImage BACK
;=====================================
Graphics3D 800,600,32,2
SetBuffer BackBuffer()
camera=CreateCamera()
light=CreateLight()

SP0=LoadSprite("back.bmp",4,camera)
SP1=LoadSprite("back2.bmp",4,SP0)

EntityOrder SP0,0
EntityFX SP0,1

EntityOrder SP1,-1
EntityFX SP1,1

PositionEntity SP0,-4,2.7,5
;=
cube=CreateCube()
PositionEntity cube,-3,2,6.5
SetBuffer BackBuffer()

While Not KeyHit(1)
        RotateSprite SP1,-MilliSecs()*0.01
        RenderWorld()
        Flip
Wend
End

Одна из возможных быстрых реализаций на спрайтах.
Внимание: в программе автогенерирующиеся рисунки (сбрасываются с папку tmp блитца или текущую папку) - это вызвано невозможнотью поставить для созданной( а не загруженной) текстуры флаг=4 (поставить можно - эффекта не будет).

Diplomat 30.06.2007 13:35

Re: Спидометр
 

Цитата:

это вызвано невозможнотью поставить для созданной( а не загруженной) текстуры флаг=4
Вообще-то это возможно. Просто при генерации такой текстуры (равно как и текстуры с флагом=2), нужно вручную задавать пикселам не только цвет, но и прозрачность:
Код:

Color= Alpha Shl 24 Or Red Shl 16 Or Green Shl 8 Or Blue Shl 0
WritePixel X,Y,Color

При загрузке текстуры из файла- Блиц делает это самостоятельно.

P.S. Может быть кто-нибудь осветит этот вопрос в ФАК-е? Ибо он в той или иной трактовке всплывает с завидной периодичностью.

HolyDel 30.06.2007 20:31

Re: Спидометр
 

причом с бакбуффера все равно не считается значения альфаканала.
рисовать линии через writepexelfast - занятие неблагородное, и код одного только етого рисования был-бы намного больше, нежели код "спидометра".
зыж. не пробовал рисовать сразу в буффер тексы, но не думаю что что-то кардинально изменится, все равно придется прогонять каждый пиксель тексы и присваивать ему свое значение альфа-канала.
Такчто ИМХО правильно сделано.

Diplomat 30.06.2007 21:06

Re: Спидометр
 
Гым, речь шла о маск-канале. Значит ничто не мешает пргнать цикл по всем текселям и закрасить их прозрачным цветом (всего 6 строк). А уж поверху - аккурат сам Б-г велел рисовать непрозрачные линии любого фасона. Эдакий принцип фона и фореграунда. )
И зачем нам бекбуфер? Нам бекбуфер не надо. Многое, при желании, рисуется непосредственно в текстурный буфер.

ЛысыЙ_Чук-Иванчук 30.06.2007 23:14

Re: Спидометр
 
FastImage =))))

avel 30.08.2007 19:50

Re: Спидометр
 
2impersonalis прокомментируй свой код и вообще приведи его в порядок, а то некоторые новички-нубы, когда им даешь ссылку на твой пост пишут, что ничего не поняли. более опытные же юзеры и сами знают как такое сделать.

impersonalis 30.08.2007 22:23

Re: Спидометр
 
Цитата:

;рисуем табло спидометра
BACK=CreateImage(64,64);создаём память для хранения картинки размером 64 на 64
;обратите внимание: размеры - степень двойки
SetBuffer ImageBuffer(BACK);устанавливаем в качестве текущего буфера для рисования
;буфер картинки
Color 255,255,255;устаниавливаем цвет рисования - белый
Oval 0,0,64,64;рисуем овал (вписываем его в нашу квадратную картинку)

Color 0,0,255;устаниавливаем цвет рисования - синий

For i=0 To 359 Step 15;проходим по окружности от 0 до 359 градусов
;с шагом 15
Line 32,32,32+Cos(i)*30,32+Sin(i)*30;рисуем линию из центра к краю овала
Next

Color 255,255,255;устаниавливаем цвет рисования - белый
Oval 32-20,32-20,40,40;рисуем в центре картинки небольшой овал (радиус - 20пкс)

Color 255,0,0;устаниавливаем цвет рисования - красный
Oval 32-2,32-2,4,4;рисуем в центре картинки маленький кружок (радиус - 4пкс)
SaveBuffer(ImageBuffer(BACK),"back.bmp");сохраняем нашу картинку как "back.bmp"
FreeImage BACK;удаляем картинку из памяти
;=====================================
;рисуем стрелку
BACK=CreateImage(64,64)
;создаём память для хранения картинки размером 64 на 64
;обратите внимание: размеры - степень двойки
SetBuffer ImageBuffer(BACK);устанавливаем в качестве текущего буфера для рисования
Rect 31,2,3,30;рисуем стрелку: прямоугольник из середины верхней стороны квадарата к центру
SaveBuffer(ImageBuffer(BACK),"back2.bmp");сохраняе м нашу картинку как "back2.bmp"
FreeImage BACK;удаляем картинку из памяти
;=====================================
Graphics3D 800,600,32,2;инициализация 3д-режима
SetBuffer BackBuffer();устанавливаем в кач-ве текущего - задний буфер
camera=CreateCamera();создаём камеру
light=CreateLight();создаём свет

SP0=LoadSprite("back.bmp",4,camera);загружаем спрайт - панель спидометра
;аттачим его к камере
SP1=LoadSprite("back2.bmp",4,SP0);загружаем спрайт - стрелку спидометра
;аттачим его к панели спидометра

EntityOrder SP0,0;устанавливаем порядок отрисовки - поверх всех
EntityFX SP0,1;убираем влияние освещения на спрайт

EntityOrder SP1,-1;устанавливаем порядок отрисовки - поверх всех
EntityFX SP1,1убираем влияние освещения на спрайт

PositionEntity SP0,-4,2.7,5;позиционируем панель спидометра (а, следовательно, и стрелку)
;=
;создаём и позиционируем кубик - чтобы не пребывать в пустоте
cube=CreateCube()
PositionEntity cube,-3,2,6.5


While Not KeyHit(1)
RotateSprite SP1,-MilliSecs()*0.01; в кач-ве показаний спидометра ставим кол-во мск с момента
;запуска ситемы *(-0.01)
RenderWorld();отрсиовка 3д-сцены
Flip;смена буферов
Wend
End
вот

avel 31.08.2007 01:47

Re: Спидометр
 
вот, совсем другое дело! теперь, думаю, даже тупой поймет! сделал в своем посте FAQ по B3D ссылку на данный пост. пускай все новички здесь смотрят.


Часовой пояс GMT +4, время: 16:46.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot