forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Blitz3D (http://forum.boolean.name/forumdisplay.php?f=45)
-   -   Круглый радар (http://forum.boolean.name/showthread.php?t=16683)

tirarex 22.04.2012 16:59

Круглый радар
 
Вложений: 2
делал я дальше один из своих проектов и нашёл новую проблему

это радар мне он нужен не квадраный а круглый
как тут (оттуда и взял текстуры)
пикча в аттаче
но я таки ничего непридумал как сделать такой радар
для рисовки пользуюсь Fastimage

Gector 22.04.2012 17:25

Ответ: Круглый радар
 
Цитата:

Сообщение от tirarex (Сообщение 226152)
делал я дальше один из своих проектов и нашёл новую проблему

это радар мне он нужен не квадраный а круглый
как тут (оттуда и взял текстуры)


но я таки ничего непридумал как сделать такой радар
для рисовки пользуюсь Fastimage

Первая картинка не грузится.
Юзай синусы и косинусы и угол поворота игрока.

tirarex 22.04.2012 17:27

Ответ: Круглый радар
 
мне нужно идею как реализовать круглый радар вот и всё

mauNgerS 22.04.2012 18:15

Ответ: Круглый радар
 
Делай квадратный и используй маску чтобы скрыть лишнее

Igor 22.04.2012 18:15

Ответ: Круглый радар
 
А у тебя есть идея как сделать радар квадратным?

Gector 22.04.2012 18:40

Ответ: Круглый радар
 
Цитата:

Сообщение от Igor (Сообщение 226159)
А у тебя есть идея как сделать радар квадратным?

Это тоже просто. Только обработка будет с учетом не дистанции, а с учетом нахождения в площади радара.
Как я понял у автора проблема не столько с радаром сколько с поворотом карты. Принцип будет тот же. Только вместо точки будет центр-начало координат от которого будет отчитываться перемещение на экране.
Подробнее распиши проблему.

tirarex 22.04.2012 18:45

Ответ: Круглый радар
 
мне надо чтоб по середине была стрелка - игрок
на фоне была карта и всё
карта некрутится
крутится сама стрелка на ней

Gector 22.04.2012 18:54

Ответ: Круглый радар
 
Цитата:

Сообщение от tirarex (Сообщение 226161)
мне надо чтоб по середине была стрелка - игрок
на фоне была карта и всё
карта некрутится
крутится сама стрелка на ней

Поворачиваешь стрелку на угол поворота перса в мире. Карту двигаешь относительно перса (его смещение в мире передаешь карте). Вот и все. Остальное прячешь с помощью маски.

tirarex 22.04.2012 19:55

Ответ: Круглый радар
 
а можно поподробнее как двигать карту и неоткожусь от маленького примера с текстурой из первого поста

Halk-DS 22.04.2012 21:11

Ответ: Круглый радар
 
В Блице есть оператор:
DrawImageRect image,x,y,rect_x,rect_y,rect_width,rect_height,[frame]
Изучи его и посмотри в FastImage есть аналог. Потом берешь рисуешь в фотошопе карту (или генерируешь рисунок программно, это как сам задумаешь) загружаешь рисунок в оперативу, и рисуешь необходимый кусок карты используя тот оператор что я тебе дал. Все просто как дверь, а как говорили парни, хочешь круглую карту делай маской.
Пример:
111111111111111
111111101111111
111111000111111
111110000011111
111100000001111
111000000000111
111100000001111
111110000011111
111111000111111
111111101111111
111111111111111
Представь что это рисунок, теперь представь что нарисован не ромбик а круглешок. Пикселы под цифрой 1 - белый цвет. Пикселы под номером 0-черные. Маскируешь в рисунке 0 (черный) цвет. И рисунок начинает быть похожим на белую рамку. Накладываешь эту белую рамку на рисунок с картой, а на рисунке с картой маскируешь белый цвет. Вуаля - круглая белая рамка исчезает на рисунке с картой и мы имеем круглую карту.
п.с. Не вздумай юзать EntityDistance для проверки радиуса около перса. Это ш проекция в которой ось У игнорится, а в команде EntityDistance она учитывается. Напиши сам функцию:
Function Distance#(X1#,Z1,X2#,Z2#)
Return Sqr((X2-X1)^2+(Z2-Z1)^2)
End Function
И будет тебе счастье!

Gector 22.04.2012 21:15

Ответ: Круглый радар
 
Код:

Graphics3D 1024,768,32,1
SetBuffer BackBuffer()

Global Player=CreateCube()
Cam=CreateCamera(Player): PositionEntity Cam,0,3,-5
Global Cube=CreateCube(): PositionEntity Cube,2,0,10: EntityColor Cube,255,0,0

Global RadarMap=CreateImage(512,512)
SetBuffer ImageBuffer(RadarMap)
        For i=0 To 10
                Color Rand(255), Rand(255), Rand(255)
                Rect Rand(0,512),Rand(0,512), Rand(0,512),Rand(0,512)
        Next
SetBuffer BackBuffer()
MidHandle RadarMap

Global RadarMask=CreateImage(256,256)
SetBuffer ImageBuffer(RadarMask)
        Color 0,0,0
        Rect 0,0,256,256
        Color 255,255,255
        Oval 0,0,256,256
SetBuffer BackBuffer()
MaskImage RadarMask,255,255,255

Function Radar()
        Local Image=CreateImage(256,256)
        SetBuffer ImageBuffer(Image)
                Cls
                DrawImage RadarMap,-(512/400)*EntityX(Player),(512/400)*EntityZ(Player)
                Color 255,0,0
                ; Куб впереди игрока на радаре определяется относительно самого игрока
                Rect (256/2)+(512/400)*(EntityX(Cube)-EntityX(Player)),(256/2)-(512/400)*(EntityZ(Cube)-EntityZ(Player)),5,5
                ;Линия указывающая направление. В твоем случае нужно просто установить угол.
                Line 256/2,256/2,(256/2)+Cos(-1*(EntityYaw(Player)+90))*10,(256/2)+Sin(-1*(EntityYaw(Player)+90))*10
                DrawImage RadarMask,0,0
        SetBuffer BackBuffer()
        DrawImage Image,(GraphicsWidth()/3)*2,(GraphicsHeight()/3)*2
End Function

Repeat
If KeyDown(17) MoveEntity Player,0,0,.5
If KeyDown(31) MoveEntity Player,0,0,-.5
If KeyDown(30) TurnEntity Player,0,1,0
If KeyDown(32) TurnEntity Player,0,-1,0
UpdateWorld
RenderWorld
Text 10,10,EntityYaw(Player)
Radar()
;DrawImage RadarMap,0,0
;DrawImage RadarMask,0,0
Flip
Until KeyHit(1)
End

Пояснения: 400- реальный размер карты, 512 ее рисунка.

ABTOMAT 23.04.2012 00:03

Ответ: Круглый радар
 
При помощи DrawPoly делаешь круг из полигонов, на него вешаешь текстуру карты. Смещением текстурных координат делаешь соответственно смещение (да можно и поворот) карты на радаре.
Значки - поверх уже обычным способом.

Randomize 23.04.2012 01:29

Ответ: Круглый радар
 
Цитата:

Сообщение от ABTOMAT (Сообщение 226188)
При помощи DrawPoly делаешь круг из полигонов, на него вешаешь текстуру карты. Смещением текстурных координат делаешь соответственно смещение (да можно и поворот) карты на радаре.
Значки - поверх уже обычным способом.

Только если у тебя FastImage

tirarex 23.04.2012 10:47

Ответ: Круглый радар
 
спасибо всем
особенно
Hulk-DS за описание способа
и
Gector за пример

ABTOMAT 23.04.2012 11:40

Ответ: Круглый радар
 
Цитата:

Сообщение от Randomize (Сообщение 226194)
Только если у тебя FastImage

ОП-пост: для рисовки пользуюсь Fastimage

tirarex 23.04.2012 18:11

Ответ: Круглый радар
 
Цитата:

Сообщение от Gector (Сообщение 226170)
Код:

Graphics3D 1024,768,32,1
SetBuffer BackBuffer()

Global Player=CreateCube()
Cam=CreateCamera(Player): PositionEntity Cam,0,3,-5
Global Cube=CreateCube(): PositionEntity Cube,2,0,10: EntityColor Cube,255,0,0

Global RadarMap=CreateImage(512,512)
SetBuffer ImageBuffer(RadarMap)
        For i=0 To 10
                Color Rand(255), Rand(255), Rand(255)
                Rect Rand(0,512),Rand(0,512), Rand(0,512),Rand(0,512)
        Next
SetBuffer BackBuffer()
MidHandle RadarMap

Global RadarMask=CreateImage(256,256)
SetBuffer ImageBuffer(RadarMask)
        Color 0,0,0
        Rect 0,0,256,256
        Color 255,255,255
        Oval 0,0,256,256
SetBuffer BackBuffer()
MaskImage RadarMask,255,255,255

Function Radar()
        Local Image=CreateImage(256,256)
        SetBuffer ImageBuffer(Image)
                Cls
                DrawImage RadarMap,-(512/400)*EntityX(Player),(512/400)*EntityZ(Player)
                Color 255,0,0
                ; Куб впереди игрока на радаре определяется относительно самого игрока
                Rect (256/2)+(512/400)*(EntityX(Cube)-EntityX(Player)),(256/2)-(512/400)*(EntityZ(Cube)-EntityZ(Player)),5,5
                ;Линия указывающая направление. В твоем случае нужно просто установить угол.
                Line 256/2,256/2,(256/2)+Cos(-1*(EntityYaw(Player)+90))*10,(256/2)+Sin(-1*(EntityYaw(Player)+90))*10
                DrawImage RadarMask,0,0
        SetBuffer BackBuffer()
        DrawImage Image,(GraphicsWidth()/3)*2,(GraphicsHeight()/3)*2
End Function

Repeat
If KeyDown(17) MoveEntity Player,0,0,.5
If KeyDown(31) MoveEntity Player,0,0,-.5
If KeyDown(30) TurnEntity Player,0,1,0
If KeyDown(32) TurnEntity Player,0,-1,0
UpdateWorld
RenderWorld
Text 10,10,EntityYaw(Player)
Radar()
;DrawImage RadarMap,0,0
;DrawImage RadarMask,0,0
Flip
Until KeyHit(1)
End

Пояснения: 400- реальный размер карты, 512 ее рисунка.

нашлась проблемка -
у меня карта просто огромная а если тут писать размеры карты они больше размеров картинки и тогда карта перестаёт двигаться просто стоит в центре

Gector 23.04.2012 19:08

Ответ: Круглый радар
 
Если я все правильно понял: Меняй размер изображения нарисованной карты в соответствии с реальным размером карты (можно найти с помощью meshwidth и т.д.). В примере он ищет считает соотношение: карта больше нарисованной - карта скроллится медленней, рисунок больше - наоборот быстрее.
Код:

Graphics3D 1024,768,32,1
SetBuffer BackBuffer()

Global Player=CreateCube()
Cam=CreateCamera(Player): PositionEntity Cam,0,3,-5
Global Cube=CreateCube(): PositionEntity Cube,2,0,10: EntityColor Cube,255,0,0

Global RadarMap=CreateImage(512,512)
SetBuffer ImageBuffer(RadarMap)
        For i=0 To 10
                Color Rand(255), Rand(255), Rand(255)
                Rect Rand(0,512),Rand(0,512), Rand(0,512),Rand(0,512)
        Next
SetBuffer BackBuffer()
MidHandle RadarMap

Global RadarMask=CreateImage(256,256)
SetBuffer ImageBuffer(RadarMask)
        Color 0,0,0
        Rect 0,0,256,256
        Color 255,255,255
        Oval 0,0,256,256
SetBuffer BackBuffer()
MaskImage RadarMask,255,255,255

Global levelsize#=4000
Global map_imagesize=512
Function Radar()
        Local Image=CreateImage(256,256)
        SetBuffer ImageBuffer(Image)
                Cls
                DrawImage RadarMap,-(map_imagesize/levelsize)*EntityX(Player),(map_imagesize/levelsize)*EntityZ(Player)
                Color 255,0,0
                ; Куб впереди игрока на радаре определяется относительно самого игрока
                Rect (256/2)+(map_imagesize/levelsize)*(EntityX(Cube)-EntityX(Player)),(256/2)-(map_imagesize/levelsize)*(EntityZ(Cube)-EntityZ(Player)),5,5
                ;Линия указывающая направление. В твоем случае нужно просто установить угол.
                Line 256/2,256/2,(256/2)+Cos(-1*(EntityYaw(Player)+90))*10,(256/2)+Sin(-1*(EntityYaw(Player)+90))*10
                DrawImage RadarMask,0,0
        SetBuffer BackBuffer()
        DrawImage Image,(GraphicsWidth()/3)*2,(GraphicsHeight()/3)*2
End Function

Repeat
If KeyDown(17) MoveEntity Player,0,0,.5
If KeyDown(31) MoveEntity Player,0,0,-.5
If KeyDown(30) TurnEntity Player,0,1,0
If KeyDown(32) TurnEntity Player,0,-1,0
UpdateWorld
RenderWorld
Text 10,10,EntityYaw(Player)
Radar()
;DrawImage RadarMap,0,0
;DrawImage RadarMask,0,0
Flip
Until KeyHit(1)
End


tirarex 23.04.2012 19:33

Ответ: Круглый радар
 
угу изображение размером 10245x1050

burovalex 23.04.2012 20:07

Ответ: Круглый радар
 
Я предлагаю для меньшего гемороя (сам правда не реализовал)
- создать дополнительную камеру
- расположить ее над персом на нужной высоте и повернуть на перса
- отображать на этой камере нужные тебе фигуры вместо Entity
- рендерить это хозяйство и ложить в Image
- наложить нужную маску на Image или (как предлагали) DrawImageRect
Всё :)

Gector 23.04.2012 20:09

Ответ: Круглый радар
 
Цитата:

Сообщение от tirarex (Сообщение 226241)
угу изображение размером 10245x1050

А нафига тебе карта таких размеров? Сожми ее до 1000х100 и регулируй размеры по двум осям а не по одной как в примере. Ну или до 1000х1000 подкрути.
Цитата:

Сообщение от burovalex (Сообщение 226244)
Я предлагаю для меньшего гемороя (сам правда не реализовал)
- создать дополнительную камеру
- расположить ее над персом на нужной высоте и повернуть на перса
- отображать на этой камере нужные тебе фигуры вместо Entity
- рендерить это хозяйство и ложить в Image
- наложить нужную маску на Image или (как предлагали) DrawImageRect
Всё :)

Угу. И получить еще один рендер).

tirarex 23.04.2012 20:50

Ответ: Круглый радар
 
Цитата:

Сообщение от Gector (Сообщение 226245)
А нафига тебе карта таких размеров? Сожми ее до 1000х100 и регулируй размеры по двум осям а не по одной как в примере. Ну или до 1000х1000 подкрути.

Угу. И получить еще один рендер).

яб с радостью тоько придётся менять размер и у афто динамических обьектов и кучи всего это тоже очень сложно будет + у меня 15 авто у каждого 4 колеса у каждого колеса 3 настройки подумай сколько надо менять 180 настроек :''((

Gector 23.04.2012 21:03

Ответ: Круглый радар
 
Цитата:

Сообщение от tirarex (Сообщение 226251)
яб с радостью тоько придётся менять размер и у афто динамических обьектов и кучи всего это тоже очень сложно будет + у меня 15 авто у каждого 4 колеса у каждого колеса 3 настройки подумай сколько надо менять 180 настроек :''((

Ээээ... Я про размеры картинки карты).

tirarex 23.04.2012 21:24

Ответ: Круглый радар
 
лан думаю будет весить много но что уж сделать

Halk-DS 23.04.2012 21:47

Ответ: Круглый радар
 
Цитата:

Сообщение от burovalex (Сообщение 226244)
Я предлагаю для меньшего гемороя (сам правда не реализовал)
- создать дополнительную камеру
- расположить ее над персом на нужной высоте и повернуть на перса
- отображать на этой камере нужные тебе фигуры вместо Entity
- рендерить это хозяйство и ложить в Image
- наложить нужную маску на Image или (как предлагали) DrawImageRect
Всё :)

У меня в игре рендер бывает жрет 5-15 миллисекунд. Цикл 1000/30=33 миллисекунды. Если я включу 2-й рендер мой фпс накроется медным тазом. Такое можно реализовывать только в крайне редких случаях, и то я б сказал не самое качественное решение. Намного лучше сгенерировать миникарту программно во время загрузки раунда, но это тоже не всегда получится.

tirarex 23.04.2012 21:52

Ответ: Круглый радар
 
ну думаю генерировать карту это если ты делаеш поуровневую игру да и то лучше сделать рендер карты в максе потом обрисовать углы дороги и вставить в игру
в блитзе так неполучится

Gector 23.04.2012 22:02

Ответ: Круглый радар
 
Цитата:

Сообщение от tirarex (Сообщение 226272)
ну думаю генерировать карту это если ты делаеш поуровневую игру да и то лучше сделать рендер карты в максе потом обрисовать углы дороги и вставить в игру
в блитзе так неполучится

Есть способ, но годится больше для стратежек. Генерировать с помощью linepick карту которая будет строиться на том какой объект карты был пикнут.


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

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