forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   3D-программирование (http://forum.boolean.name/forumdisplay.php?f=12)
-   -   Работа со спрайтами (Sprite) (http://forum.boolean.name/showthread.php?t=191)

Lexa 12.10.2005 00:39

Я вот ту уперся написал обработчик события нажатия на кнопку(17). Сообразил как повернуть и как передвинуть спрайт,а как зделать так чтоб этот спрайт сначала поворачивался(медленно) а потом двигался. Ну например нажал влево катринка повернулась в лево и поехала, нажал вправо повернулась на 180 и поехала вправо?

:dontknow:





PS: извините что начал новую тему. :pardon:

SubZer0 12.10.2005 01:31

эта задача не из простых (как кажется), во первых нужно искать кротчайший путь поворота на заданный градус (что я не сделал), потом ввести дополнительные переменные, в одной хранить угол (можно прямо из спрайта брать) а другая для цели поворота...

Код:

graphics3d 800,600,32,2
setbuffer backbuffer()

camera=createcamera()
positionentity camera,20,20,-50
rotateentity camera,20,20,0

rotateentity createlight(),40,20,0

Player=createcube()
scaleentity player,1,1,5

PA#=0
PA1#=PA#

repeat

 if keydown(200) then PA1=0
 if keydown(208) then PA1=180
 if keydown(203) then PA1=90
 if keydown(205) then PA1=270
 
 if pa1<pa
 pa=pa-2
 elseif pa1>pa
 pa=pa+2
 endif
 
 if pa1=pa and (keydown(200) or keydown(208) or keydown(203) or keydown(205)) then moveentity player,0,0,1
 

 rotateentity player,0,PA#,0

 renderworld
 flip

until keyhit(1)

end


Lexa 12.10.2005 01:43

:blink: МДЯ... :?? через неделю вернусь.

1.Что значит - (можно прямо из спрайта брать)?
2.Равно ли выражение ?
Код:

PA#=0
PA1#=0
и
PA#=0
PA1#=PA#

Код:

PA1#=PA#
и
PA#=PA1#


pax 12.10.2005 01:57

В первом случае верно

Во втором PA1#=PA# т.е. переменной PA1# присваиваеш значение PA#,
а PA#=PA1# наоборот.

SubZer0 12.10.2005 02:09

мммда, извини, заболтался я, из спрайта в блице никак угол поворота не возьмешь... это только с объекта... извини ещераз...

Код:

PA#=0
PA1#=0
и
PA#=0
PA1#=PA#

да, записи по смыслу идентичные...

Код:

PA1#=PA#
и
PA#=PA1#

нет, в превом примере PA1 будет содержать значение PA, а во втором наоборот...

допустим PA=5 и PA1=3

PA1#=PA#

теперь PA=5 и PA1=5

а после PA#=PA1# будет PA=3 и PA1=3

:)

Жека 13.10.2005 13:11

Чтобы не начинать аналогичную тему, хочу сказать и спросить!

Я, значится, собрался свой "Космос" сделать в 3д спрайтами (щас он полностью на 2д командах). Причины простые: прозрачность без внешних библиотек, поворот спрайтов, частицы (более реалистично можно сделать).

Начал экспериментировать со спрайтами...
Написал 2 примера (говорю на что надо обратить внимание):
1. Выводит на экран 1 рисунок (DrawImage) размером 32х32 точки
Исползую команду Graphics 1024,768,32,1 - получаю 380 fps
Исползую команду Graphics3D 1024,768,32,1 - получаю 1400 fps!!!

2. выводит на экран 1 спрайт - получаю около 700 fps

Выходит, что рисунок выводится быстрее, причем в 3д режиме!

После сделал вывод 1000 рисунков и 1000 спрайтов, опять же быстрее выводятся рисунки - соотв. 80 и 50 fps.

Спрайты гружу с флагом 4, то есть с маской (список фильтров текстур очистил перед загрузкой).

Примеров нет под рукой, выложу если надо при первой возможности.

Так что я разочаровался в быстром 2д, которое на самом деле 3д

Жека 13.10.2005 13:21

Вопрос про спрайты: как убрать черный фон у спрайта, чтобы это получилось быстрее, чем после загрузки спрайта с флагом 4 ("с маской")? Маска тормозит конкретно! Почему?

Я сделал спрайту EntityBlend spr,2, то есть "смешивать умножением" (не знаю как правильно переводится), при этом подложил "под" этот спрайт белый (пустой) спрайт, чтобы смесь была нормальной, но спрайт в этом случае становится полупрозрачным, что нежелательно.

Или даже так: как сделать так, чтобы цвета у спрайта соответствовали его текстуре? Если грузить без флагов, то цвета меняются до неузнаваемости.

Lexa 13.10.2005 16:01

Жека я не совсем всё понял из ного что ты написал но то что, в 3D быстрее я уже убедился. Хотя интересно почему :( ведь 2D просчитывать проще :dontknow:

Lexa 15.10.2005 04:45

Подскажите как реализовать полоску здоровья над обьектом в 3D,
ну или там процент здоровья?
:)

impersonalis 15.10.2005 05:05

берёшь камеру, для которой, идёт рендер - далее camera
берёшь объект, над которым будет надпись - далее obj
Далее получаешь 2 координаты проекции 3д-мира на камеру
Код:

CameraProject camera,entityx(obj),entityy(obj),entityz(obj)
x=ProjectedX()
y=ProjectedY()

всё - теперь в x и y у тебя координаты.
Можешь написать (учтя отступы), что-нибудь по этим координатам.

impersonalis 15.10.2005 05:11

Сформулируй по-точнее:
надписи должны быть над объектами даже когда они за препятствиями? только когда камера наведена на объект? и т.п.
Так как рациональный алгоритм подбирается именно из этих условий

SubZer0 15.10.2005 05:13

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

Код:

; графический режим и буфер (как всегда)
graphics3d 800,600,32,2
setbuffer backbuffer()

; создаем камеру и помещаем ее в место откуда нам все видно
camera=createcamera()
positionentity camera,0,20,-50

; создаем свет
rotateentity createlight(),0,20,40

; создаем препятствие и делаем ему полигональний пик-режим
cube=createcube()
positionentity cube,0,0,20
scaleentity cube,5,10,5
entitypickmode cube,2

; создаем игрока и делаем ему тоже полигональный пик-режим
player= CreateCube()
entitycolor player,50,250,50
scaleentity player,3,3,3
entitypickmode player,2

; создаем зрителя (может быть и камера), для него пик-режим не устанавливаем
; этот режим нужен только для тех объектов на которые будем "смотреть"
; помещаем зрителя под камерой (для наглядности)
viewer = CreateSphere()
positionentity viewer,0,16,-45

; главный цикл
repeat

; самая главная функция (из-за нее все работает)
; функция смотрит по вектору (в трехмерных координатах) от "XYZ" с длиной "XYZ" и
; возвращает нам идентификатор первого попавшегося на этой линии объекта
; делаем начальные координаты в точке нашено зрителя EntityX(viewer)...
; а сам вектор направляем в игрока (простая геометрия) путем
; вычитания координат EntityX(player)-EntityX(viewer)...
Pickentity=linepick(EntityX(viewer),EntityY(viewer),EntityZ(viewer), EntityX(player)-EntityX(viewer),EntityY(player)-EntityY(viewer),EntityZ(player)-EntityZ(viewer))

; приравниваем координаты вывода текста к нулю
px#=0
py#=0
; если игрок находится в видимости камеры и
; он является первым на линии просмотра от viewer до player (ничего другого на пути нет,
; иначе в Pickentity будет другой объект, за который игрок спрятался и условие не сработает
; ТО
if EntityInView(player,camera) And Pickentity=player
; записываем в px и py координаты вывода имени персонажа на экран
cameraproject(camera,EntityX(player),EntityY(player),EntityZ(player))
px=ProjectedX()
py=ProjectedY()
endif

; тут думаю понятно, по клавишам перемещаем игрока по полю
if KeyDown(200) Then TranslateEntity player,0,0,1
if KeyDown(208) Then TranslateEntity player,0,0,-1

if KeyDown(205) Then TranslateEntity player,1,0,0
if KeyDown(203) Then TranslateEntity player,-1,0,0


; прорисовываем мир
renderworld

; теперь смотрим если какаянибудь координата отлична от нуля,
; значит сработало условие (см. выше) значит объект находится в поле зрения камеры
; и в поле зрения зрителя, значит выводим его имя на экран
if px or py Then
Color 255,0,0
Text px,py,"Player"
Color 255,255,255
endif

; меняем буфер обмена
flip

; закрываем цикл
until KeyHit(1)

; конец программы
end

надеюсь тебе поможет... если нет, то пиши, постараемся написать конкретную функцию.

Lexa 15.10.2005 05:21

ну... это... камера
Код:

cam=CreateCamera()
 PositionEntity cam,0,50,0

 PointEntity cam , geroi

герой должен видеть свой паказатель и ботов которые играют за него
но не врагов

а показателей 2
полоска времени (время действия призика)
и уровень героя звёхдочками (ну.. скока уровень стока звезд)

а припядствий за которые можно спрятатся нет

Lexa 15.10.2005 05:25

Отличный пример я его гдето видел он у меня даже на HDD есть. храню мож пригодится ;) :super:

ну это не совсем 2D


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

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