Общество изобретателей велосипедов
GameDev.ru / Сообщества / Вело-изобретатели / Форум / 2D движок SR2D, Софтверный движок для работы с 2D графикой на VB6, vb.net, C# (37 стр)

2D движок SR2D, Софтверный движок для работы с 2D графикой на VB6, vb.net, C# (37 стр)

Страницы: 134 35 36 37 38 39 Следующая »
SilentPrayerCGПостоялецwww21 окт. 201819:46#540
Mikle
А в этом есть нужда? Ну менять его на другой тип? Так-же все работает. И кстати, как он будет работать, я вроде видел что некоторые цвета имеют отрицательный аРГБ, или если сделать его без знаковым просто сместится в плюс?

Еще хотел спросить, а можно ли спрайт диспозить принудительно? Я видел там у тебя финалайз.
Просто не так давно в цикле сейвил файлы, (255 штук) и случайно объявление спрайта свежего оставил внутри цикла, дак гдето на 188 что-ли спрайте (они были 1080р) программа рухалась, с жалобой на аут оф мемори.
Разумеется когда выкинул объявление за пределы, и потом просто стирал спрайт, рухаться перестало, но навело на мысль, что с битмапом можно было бы диспоз поставить и перестало бы падать, а в спрайте что-то нет его.
Я как-то давно пытался изучить вопрос как сделать свой диспоз, но это выше моей компетенции.

MikleМодераторwww21 окт. 201819:53#541
SilentPrayerCG
> А в этом есть нужда?
У меня пока не возникала.
SilentPrayerCG
> если сделать его без знаковым просто сместится в плюс?
Да. Изменится только A.
SilentPrayerCG
> можно ли спрайт диспозить принудительно?
Можно. Просто:
Spr = Nothing

Правка: 22 окт. 2018 16:36

SilentPrayerCGПостоялецwww23 окт. 201812:22#542
Mikle
Ок. просто Nothing, тогда finalize срабатывает?

хотел еще заодно склеивание а р г б в ргб сделать независимое от колора или sr2d, а аРГБ как раз на _Асм написана, оказывается...

MikleМодераторwww23 окт. 201812:34#543
SilentPrayerCG
> просто Nothing, тогда finalize срабатывает?
Оно сработает, когда фреймворк решит, что пора :)
Если нужно без задержки освободить память, можно выполнить Init (1, 1).
SilentPrayerCGПостоялецwww23 окт. 201813:26#544
Mikle
Спасибо)
MikleМодераторwww23 окт. 201813:41#545
А для сборки-разборки ARGB на .net есть такая удобная штука, как Union.
SilentPrayerCGПостоялецwww24 окт. 201812:02#546
Mikle
Юнион который метод в массиве что-ли? Который вроде-бы сливает массив с массивом, учитывая только уникальные элементы. Или ты что-то другое имел ввиду?
MikleМодераторwww24 окт. 201812:29#547
Нет, он "сливает" разные типы внутри одной структуры на одно адресное пространство:
Imports System.Runtime.InteropServices

Public Class Form1
  <StructLayout(LayoutKind.Explicit)> Public Structure Union
    <FieldOffset(0)> Public I As Integer
    <FieldOffset(0)> Public B As Byte
    <FieldOffset(1)> Public G As Byte
    <FieldOffset(2)> Public R As Byte
    <FieldOffset(3)> Public A As Byte
  End Structure

  Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    Dim U As Union

    U.I = &H11223344
    Me.Text = Hex(U.A) & "," & Hex(U.R) & "," & Hex(U.G) & "," & Hex(U.B)
  End Sub
End Class

SilentPrayerCGПостоялецwww24 окт. 201812:39#548
не пойму честно, как это использовать так-же как сейчас ARGB функция работает
MikleМодераторwww24 окт. 201813:24#549
SilentPrayerCG
> как это использовать так-же как сейчас ARGB функция работает
Например, так, в обе стороны:
  Function ARGB(ByVal A As Byte, ByVal R As Byte, ByVal G As Byte, ByVal B As Byte) As Integer
    Dim U As Union

    U.A = A
    U.R = R
    U.G = G
    U.B = B
    Return U.I
  End Function

  Function ARGBGetA(ByVal I As Integer) As Byte
    Dim U As Union

    U.I = I
    Return U.A
  End Function

  Function ARGBGetR(ByVal I As Integer) As Byte
    Dim U As Union

    U.I = I
    Return U.R
  End Function

  Function ARGBGetG(ByVal I As Integer) As Byte
    Dim U As Union

    U.I = I
    Return U.G
  End Function

  Function ARGBGetB(ByVal I As Integer) As Byte
    Dim U As Union

    U.I = I
    Return U.B
  End Function

Правка: 24 окт. 2018 13:47

SilentPrayerCGПостоялецwww24 окт. 201818:30#550
Работает, но я смутно вообще понимаю как, и результат такой-же выдает.
И я первый раз вижу структуры вот с таким <блабла>
А почему это именно юнион называется? Просто ты так сказал что в фреймворке есть юнион, хотя это кастомное название в данном случае ведь?

У меня был еще кстати вопрос, по поводу getnewbitmap который ты мне тогда написал

    Public Function GetNewBitmap() As Bitmap
        Dim BmpDest As Bitmap

        BmpDest = New Bitmap(meWidth, meHeight, Imaging.PixelFormat.Format32bppArgb)
        Dim BMD As Imaging.BitmapData = BmpDest.LockBits(Rectangle.Round(BmpDest.GetBounds(GraphicsUnit.Pixel)), Imaging.ImageLockMode.ReadOnly, Imaging.PixelFormat.Format32bppArgb)
        Marshal.Copy(cBuf, 0, BMD.Scan0, meWidth * meHeight)
        BmpDest.UnlockBits(BMD)
        Return BmpDest
    End Function

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

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

Правка: 24 окт. 2018 18:31

MikleМодераторwww24 окт. 201820:42#551
SilentPrayerCG
> может можно так-же сделать между спрайтом и битмапом? (может связать cbuf
> как-то напрямую?)
Да, именно cbuf.
SilentPrayerCG
> ты так сказал что в фреймворке есть юнион, хотя это кастомное название в данном
> случае ведь?
Да, можно было назвать по-другому, просто это аналог сишного юниона.

Правка: 24 окт. 2018 20:42

SilentPrayerCGПостоялецwww24 окт. 201823:03#552
Mikle
вот тот пример
> Есть еще один способ, который быстрее и гораздо удобнее. Если вы посмотрите на конструкторы Bitmap, вы найдете тот, который берет,
> и IntPtr в качестве последнего параметра. Этот IntPtr предназначен для хранения данных пикселей.
> Итак, как вы его используете?
Dim imageWidth As Integer = 1920
Dim imageHeight As Integer = 1080

Dim fmt As PixelFormat = PixelFormat.Format32bppRgb
Dim pixelFormatSize As Integer = Image.GetPixelFormatSize(fmt)

Dim stride As Integer = imageWidth * pixelFormatSize
Dim padding = 32 - (stride Mod 32)
If padding < 32 Then stride += padding

Dim pixels((stride \ 32) * imageHeight) As Integer
Dim handle As GCHandle = GCHandle.Alloc(pixels, GCHandleType.Pinned)
Dim addr As IntPtr = Marshal.UnsafeAddrOfPinnedArrayElement(pixels, 0)

Dim bitmap As New Bitmap(imageWidth, imageHeight, stride \ 8, fmt, addr)

pixels я так понимаю это cBuf
не уверен, что я смогу это правильно адаптировать, все равно нефига не знаю про работу с памятью

MikleМодераторwww25 окт. 20189:13#553
Да, pixels() - это то же, что в SR2D cBuf(), только его pinned (прикалывают, фиксируют). В 32-х битах я обходился без этого, но в 64-х, как показывает практика, без этого всё равно не обойтись, буду переделывать, заодно, может быть, и динамически связать с битмапом получится.
Всё это позже, у нас тут потоп...
SilentPrayerCGПостоялецwww25 окт. 201814:48#554
Mikle
было бы не плохо, как альтернативный вывод инфы, ну альтернативный паинттодевайсу.
погоди, потоп? Ты на Кубане где-то живешь что-ли?, по крайней мере по новостям, там какие-то проблемы с потопом
Страницы: 134 35 36 37 38 39 Следующая »

/ Форум / Общество изобретателей велосипедов / SR2D - софтовый 2D движок

2001—2018 © GameDev.ru — Разработка игр