DirectDraw

Работа с 2D и 3D графикой, видео, звуком.

Модератор: Mikle

Lif#
Начинающий
Начинающий
 
Сообщения: 2
Зарегистрирован: 02.11.2003 (Вс) 14:06
Откуда: TrEkaterinburg

DirectDraw

Сообщение Lif# » 02.11.2003 (Вс) 14:12

:oops: КАк определять collision и делать rotate?
rtfm- не предлогать!

Дезертир
Начинающий
Начинающий
 
Сообщения: 14
Зарегистрирован: 15.12.2005 (Чт) 1:48

Сообщение Дезертир » 17.12.2005 (Сб) 2:41

У меня 2 вопроса по DirectDraw:
1. Как спрайт на экране повернуть, отразить по вертикали\горизонтали, что б не создавать лишние кадры анимации с

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

DirectXManiac
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1543
Зарегистрирован: 03.11.2005 (Чт) 13:32
Откуда: из DirectX SDK

Сообщение DirectXManiac » 17.12.2005 (Сб) 7:40

В поиск, как сказал бы d3drm. Поищи на 5-8 страницах.Щас найду и дам ссылку
#define ROFL 0xDDDD

Odrick
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 503
Зарегистрирован: 28.09.2003 (Вс) 2:04

Сообщение Odrick » 27.12.2005 (Вт) 17:45

2Дезертир - я тебе отвечал уже по этому поводу. Поворот спрайта - могу дать пример. Цвет пикселя возвращает метод поверхности GetLockedPixel.

2Lif# - по поворотам - см. выше. По столкновениям все зависит от задачи, методов хранения данных и т.д.
То, что для одних константа, для других только переменная...

Дезертир
Начинающий
Начинающий
 
Сообщения: 14
Зарегистрирован: 15.12.2005 (Чт) 1:48

Сообщение Дезертир » 29.12.2005 (Чт) 0:35

Да, с GetLockedPixel разобрался, про цвет работает, спасибо! А пример про повороты - дай пожалуйста! И, если не понял, мне повороты не так нужны, а нужно отражение спрайта по вертик или гориз. оси, чтоб создать во время игры кадры персонажа, идущего влево или вправо и т.п.
Даешь нормальные программы в Винды!

Odrick
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 503
Зарегистрирован: 28.09.2003 (Вс) 2:04

Сообщение Odrick » 29.12.2005 (Чт) 1:53

Ну в таком случае тебе больше ничего не нужно. Если не нужны повороты на произвольный градус, то и заморачиваться особенно нечего: создаеш временную поверхность, лочиш ее и исходную поверхность, в цикле перебираеш все точки (GetLockedPixel) и ставиш в нужное место (SetLockedPixel). После чего копируеш из временной поверхности изображение куда тебе нужно.
То, что для одних константа, для других только переменная...

Дезертир
Начинающий
Начинающий
 
Сообщения: 14
Зарегистрирован: 15.12.2005 (Чт) 1:48

Сообщение Дезертир » 29.12.2005 (Чт) 23:05

Я извиняюсь, но в среде VB такой перебор точек работает очень медленно, тем паче для изображений более, скажем, 200*200. Или под DX это будет куда быстрее? Сейчас проверю. Если ж все-таки медленно, то в реальном времени рендерить нужный спрайт не удастся, и прошу, если кто знает, показать, как это делать средствами DD? Есть, например, некие константы MIRRORLEFTRIGHT и MIRRORUPDOWN в параметрах .BltFx. Что они делают, как их использовать?
Даешь нормальные программы в Винды!

Odrick
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 503
Зарегистрирован: 28.09.2003 (Вс) 2:04

Сообщение Odrick » 30.12.2005 (Пт) 0:30

??? А кто тебя заставляет делать это в каждую итерацию??? Делай это ОДИН раз - при загрузке и храни все нужные кадры в разных поверхностях. На быстродействии это не скажеться никак.

Я извиняюсь, но в среде VB такой перебор точек работает очень медленно, тем паче для изображений более, скажем, 200*200


А, извините, при чем тут VB ;)
То, что для одних константа, для других только переменная...

Odrick
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 503
Зарегистрирован: 28.09.2003 (Вс) 2:04

Сообщение Odrick » 30.12.2005 (Пт) 0:32

Кстати, у меня производиться не просто отражения, а повороты на произвольный угол с наложением масок этак 200-300 спрайтов. Но это делается один раз и тормозит загрузку на 3-5 секунд ;)
То, что для одних константа, для других только переменная...

Дезертир
Начинающий
Начинающий
 
Сообщения: 14
Зарегистрирован: 15.12.2005 (Чт) 1:48

Сообщение Дезертир » 30.12.2005 (Пт) 14:36

Хорошо, я написал функцию, кот. должна отражать спрайт по горизонтали. Но на строке, кот. я пометил, происходит Automation Error. Что я делаю не так?
Function GetMirrorPic(obj As clsCommon) As DirectDrawSurface7
Dim rc As RECT
Dim rc2 As RECT
Dim i As Long
Dim j As Long
Dim ddsd As DDSURFACEDESC2
Dim ddsd2 As DDSURFACEDESC2
rc.Left = obj.CurFrameFromAnim * obj.SizeX
rc.Top = 0
rc.Right = rc.Left + obj.SizeX
rc.Bottom = obj.SizeY
rc2.Left = obj.CurFrameFromAnim * obj.SizeX
rc2.Top = 0
rc2.Right = rc2.Left + obj.SizeX
rc2.Bottom = obj.SizeY
Game.Tex(obj.Pic).Lock rc2, ddsd, DDLOCK_WAIT, 0
Set getMirror = Game.Tex(obj.Pic)
getMirror.Lock rc, ddsd2, DDLOCK_WAIT, 0 'Здесь ошибкаFor i = rc.Top To rc.Bottom
For j = rc.Left To rc.Right
getMirror.SetLockedPixel rc.Right - j, i, Game.Tex(Screen.Objects(obj).Pic).GetLockedPixel(j, i)
Next j
Next i
Game.Tex(Screen.Objects(obj).Pic).Unlock rc
getMirror.Unlock rc2
End Function
Даешь нормальные программы в Винды!

Odrick
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 503
Зарегистрирован: 28.09.2003 (Вс) 2:04

Сообщение Odrick » 30.12.2005 (Пт) 15:02

Ну во-первых, исходя из приведенного кода, где у тебя объявление ddsd2? Оно у тебя просто пустое, отсюда и ошибка ;) Во вторых, непонятно что за класс clsCommon? Что в нем за объекты?
То, что для одних константа, для других только переменная...

Odrick
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 503
Зарегистрирован: 28.09.2003 (Вс) 2:04

Сообщение Odrick » 30.12.2005 (Пт) 15:14

Да, и зачем тебе их вообще 2? Ты что, создаеш 2 отдельных инстанса DirectDraw? Вот, например, функцийка для поворота спрайта (или его куска) на произвольный угол:


Код: Выделить всё
Public Const Deg2Rad As Double = 0.017453292519943

Public Sub DXRotateSprite(Source As DirectDrawSurface7, Region As RECT, ByVal Angle As Double, dest As DirectDrawSurface7)
    Dim RegTmp As RECT
    Dim X As Integer
    Dim Y As Integer
    Dim SourceWidth As Integer
    Dim SourceHeight As Integer
    Dim DestWidth As Integer
    Dim DestHeight As Integer
    Dim cx As Integer
    Dim cy As Integer
    Dim DX As Integer
    Dim dy As Integer
    Dim cosa As Double
    Dim sina As Double
    Dim yin As Double
    Dim xin As Double
    Dim rx As Double
    Dim ry As Double
    Dim irx As Double
    Dim iry As Double
    Dim pcol As Long
   
    RegTmp.Left = 0
    RegTmp.Top = 0
    RegTmp.Right = Region.Right - Region.Left
    RegTmp.Bottom = Region.Bottom - Region.Top
    dest.BltColorFill RegTmp, 0
   
    Source.Lock Region, ddsd2, DDLOCK_WAIT, 0
    dest.Lock RegTmp, ddsd2, DDLOCK_WAIT, 0
   
    SourceWidth = RegTmp.Right + 1
    SourceHeight = RegTmp.Bottom + 1
    DestWidth = SourceWidth
    DestHeight = SourceHeight
   
    cx = SourceWidth * 0.5
    cy = SourceHeight * 0.5
   
    DX = DestWidth * 0.5
    dy = DestHeight * 0.5
   
    cosa = Cos(Angle * Deg2Rad * -1)
    sina = Sin(Angle * Deg2Rad * -1)
   
    For Y = Region.Top To Region.Bottom
        yin = Y - dy
        For X = Region.Left To Region.Right
            xin = X - DX
           
            rx = xin * cosa - yin * sina + cx
            ry = xin * sina + yin * cosa + cy
           
            irx = Int(rx)
            iry = Int(ry)
           
            If (PtInRect(RegTmp, irx, iry)) Then
                pcol = Source.GetLockedPixel(irx, iry)
                dest.SetLockedPixel X, Y, pcol
            End If
        Next X
    Next Y
   
    Source.Unlock Region
    dest.Unlock RegTmp
End Sub
То, что для одних константа, для других только переменная...

Дезертир
Начинающий
Начинающий
 
Сообщения: 14
Зарегистрирован: 15.12.2005 (Чт) 1:48

Сообщение Дезертир » 02.01.2006 (Пн) 0:49

Так и знал, что не понятен код будет, надо было комментить. clsCommon у меня - класс для всех объектов игрового мира, разъяснение его здесь не нужно, в примере лишь использую его свойства для получения координат спрайта. ddsd2, если приглядеться, объявлен. И еще на уровне модуля объявлена GetMirror As DirectDrawSurface7. И почему ошибка, я всеравно не понимаю
Даешь нормальные программы в Винды!

Odrick
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 503
Зарегистрирован: 28.09.2003 (Вс) 2:04

Сообщение Odrick » 02.01.2006 (Пн) 2:30

Блин... Извини, но это уже слишком. Я тебе ВСЕ расписал и разложил по полочкам. Что еще не понятно? Ты заставил меня с бодуна написать тебе пример в час ночи! :twisted: Коротче - смотри, вникай и ищи ошибки у себя в коде. Я сейчас пьян, так что мог наглючить с красотой и оптимизацией. Но надеюсь, что смысл станет ясным наконец-то...
У вас нет доступа для просмотра вложений в этом сообщении.
То, что для одних константа, для других только переменная...


Вернуться в Мультимедиа

Кто сейчас на конференции

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

    TopList