Здравствуйте, гость ( Вход | Регистрация )

30 страниц V < 1 2 3 4 > »   
Ответить в эту темуОткрыть новую тему
> Разработка findcolor, findimage, Pure lua
cirus
сообщение 27.3.2021, 21:21
Сообщение #21


**********

Elder
Сообщений: 3.480
Регистрация: 18.8.2014
Группа: Пользователи
Наличность: 26702
Пользователь №: 16.971
Возраст: 29



Цитата
а в файл сохранить картинку можно?

Вариант1 (WriteFile)
Код
--lua
local ffi = require("ffi")
local SRCCOPY = 0x00CC0020
local DIB_RGB_COLORS = 0
local BI_RGB = 0
local GENERIC_WRITE = 0x40000000
local OPEN_ALWAYS = 4
local FILE_ATTRIBUTE_NORMAL = 0x00000080
ffi.cdef[[
    typedef long LONG;
    typedef unsigned short WORD;
    typedef unsigned long DWORD;
    typedef DWORD *LPDWORD;
    typedef unsigned char BYTE;
    typedef void *LPVOID;
    typedef const void *LPCVOID;
    #pragma pack (push, 1)
    typedef struct { WORD bfType; DWORD bfSize; WORD bfReserved1; WORD bfReserved2; DWORD bfOffBits;} BITMAPFILEHEADER;
    #pragma pack (pop)
     typedef struct {DWORD biSize; LONG  biWidth; LONG  biHeight; WORD  biPlanes; WORD  biBitCount; DWORD biCompression; DWORD biSizeImage;
        LONG  biXPelsPerMeter; LONG biYPelsPerMeter; DWORD biClrUsed; DWORD biClrImportant;} BITMAPINFOHEADER;
    typedef struct {BYTE rgbBlue; BYTE rgbGreen; BYTE rgbRed; BYTE rgbReserved;} RGBQUAD;
    typedef struct {BITMAPINFOHEADER bmiHeader; RGBQUAD bmiColors[1];} BITMAPINFO;
    int GetDC(int hWnd);
    int ReleaseDC(int hWnd, int hDC);
    int SelectObject(int hdc, int h);
    int CreateCompatibleDC(int hdc);
    int CreateCompatibleBitmap(int hdc, int cx, int cy);
    bool DeleteObject(int ho);
    bool BitBlt(int hdc, int x, int y, int cx, int cy, int hdcSrc, int x1, int y1, unsigned long rop);
    int GetDIBits(int hdc, int hbm, unsigned int start, unsigned int cLines, LPVOID lpvBits, BITMAPINFO* lpbmi, unsigned int usage);
    bool WriteFile(int hFile, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite, LPDWORD lpNumberOfBytesWritten, int lpOverlapped);
    int CreateFileA(const char* lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode,
        int lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, int hTemplateFile);
    bool CloseHandle(int hObject);
]]

function screen(path, x, y, x2, y2, handle)
    local C = ffi.C
    local hdcWindow = C.GetDC(handle or 0)  -- если хендл не указан, то получим скрин с экрана
    local hdcMemDC = C.CreateCompatibleDC(hdcWindow)
    local hbmScreen = C.CreateCompatibleBitmap(hdcWindow, x2-x, y2-y)
    C.SelectObject(hdcMemDC,hbmScreen)
    C.BitBlt(hdcMemDC, 0, 0, x2-x, y2-y, hdcWindow, x, y, SRCCOPY)  -- сохранить в памяти скрин с окна или экрана

    local bi = ffi.new('BITMAPINFO', { {ffi.sizeof('BITMAPINFOHEADER'), x2-x, y2-y, 1, 32, BI_RGB,0,0,0,0,0} })
    C.GetDIBits(hdcWindow, hbmScreen, 0, y2-y, nil, bi, DIB_RGB_COLORS)   -- узнать какого размера нужен массив

    local bmpFileHeader = ffi.new('BITMAPFILEHEADER', {0x4d42, bi.bmiHeader.biSizeImage, 0, 0, ffi.sizeof('BITMAPFILEHEADER')+ffi.sizeof('BITMAPINFOHEADER')})
    local bits = ffi.new('unsigned char[?]', bi.bmiHeader.biSizeImage)
    local result = C.GetDIBits(hdcWindow, hbmScreen, 0, y2-y, bits, bi, DIB_RGB_COLORS)

    local dwWritten = ffi.new('DWORD[1]')
    local hFile = C.CreateFileA(path, GENERIC_WRITE, 0, 0, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL,0)

    C.WriteFile(hFile, bmpFileHeader, ffi.sizeof('BITMAPFILEHEADER'), dwWritten, 0)
    C.WriteFile(hFile, bi, ffi.sizeof('BITMAPINFOHEADER'), dwWritten, 0)
    C.WriteFile(hFile, bits, bi.bmiHeader.biSizeImage, dwWritten, 0)
    C.CloseHandle(hFile)

    C.ReleaseDC(handle or 0, hdcWindow)
    C.DeleteObject(hdcMemDC)
    C.DeleteObject(hbmScreen)
end


screen([[C:\screen_desktop.bmp]], 200, 200, 500, 500) -- скрин с экрана
screen([[C:\screen_window.bmp]], 200, 200, 500, 500, workwindow()) -- скрин с рабочего окна (может быть перекрыто)

Вариант2 (fwrite)
Код
--lua
local ffi = require("ffi")
local msvcrt = ffi.load('msvcrt.dll')
local SRCCOPY = 0x00CC0020
local DIB_RGB_COLORS = 0
local BI_RGB = 0
ffi.cdef[[
    typedef long LONG;
    typedef unsigned short WORD;
    typedef unsigned long DWORD;
    typedef DWORD *LPDWORD;
    typedef unsigned char BYTE;
    typedef void *LPVOID;
    typedef const void *LPCVOID;
    #pragma pack (push, 1)
    typedef struct { WORD bfType; DWORD bfSize; WORD bfReserved1; WORD bfReserved2; DWORD bfOffBits;} BITMAPFILEHEADER;
    #pragma pack (pop)
     typedef struct {DWORD biSize; LONG  biWidth; LONG  biHeight; WORD  biPlanes; WORD  biBitCount; DWORD biCompression; DWORD biSizeImage;
        LONG  biXPelsPerMeter; LONG biYPelsPerMeter; DWORD biClrUsed; DWORD biClrImportant;} BITMAPINFOHEADER;
    typedef struct {BYTE rgbBlue; BYTE rgbGreen; BYTE rgbRed; BYTE rgbReserved;} RGBQUAD;
    typedef struct {BITMAPINFOHEADER bmiHeader; RGBQUAD bmiColors[1];} BITMAPINFO;
    int GetDC(int hWnd);
    int ReleaseDC(int hWnd, int hDC);
    int SelectObject(int hdc, int h);
    int CreateCompatibleDC(int hdc);
    int CreateCompatibleBitmap(int hdc, int cx, int cy);
    bool DeleteObject(int ho);
    bool BitBlt(int hdc, int x, int y, int cx, int cy, int hdcSrc, int x1, int y1, unsigned long rop);
    int GetDIBits(int hdc, int hbm, unsigned int start, unsigned int cLines, LPVOID lpvBits, BITMAPINFO* lpbmi, unsigned int usage);
    int *fopen(const char *filename, const char *mode);
    int fwrite(const void *buffer, int size, int count, int *stream);
    int fclose(int *stream);
]]

function screen(path, x, y, x2, y2, handle)
    local C = ffi.C
    local hdcWindow = C.GetDC(handle or 0)  -- если хендл не указан, то получим скрин с экрана
    local hdcMemDC = C.CreateCompatibleDC(hdcWindow)
    local hbmScreen = C.CreateCompatibleBitmap(hdcWindow, x2-x, y2-y)
    C.SelectObject(hdcMemDC,hbmScreen)
    C.BitBlt(hdcMemDC, 0, 0, x2-x, y2-y, hdcWindow, x, y, SRCCOPY)  -- сохранить в памяти скрин с окна или экрана

    local bi = ffi.new('BITMAPINFO', { {ffi.sizeof('BITMAPINFOHEADER'), x2-x, y2-y, 1, 32, BI_RGB,0,0,0,0,0} })
    C.GetDIBits(hdcWindow, hbmScreen, 0, y2-y, nil, bi, DIB_RGB_COLORS)   -- узнать какого размера нужен массив

    local bmpFileHeader = ffi.new('BITMAPFILEHEADER', {0x4d42, bi.bmiHeader.biSizeImage, 0, 0, ffi.sizeof('BITMAPFILEHEADER')+ffi.sizeof('BITMAPINFOHEADER')})
    local bits = ffi.new('unsigned char[?]', bi.bmiHeader.biSizeImage)
    local result = C.GetDIBits(hdcWindow, hbmScreen, 0, y2-y, bits, bi, DIB_RGB_COLORS)

    local hFile = msvcrt.fopen(path, "wb")
    if hFile then
        msvcrt.fwrite(bmpFileHeader, ffi.sizeof('BITMAPFILEHEADER'), 1, hFile)
        msvcrt.fwrite(bi, ffi.sizeof('BITMAPINFOHEADER'), 1, hFile)
        msvcrt.fwrite(bits, bi.bmiHeader.biSizeImage, 1, hFile)
        msvcrt.fclose(hFile)
    else
        log('Файл не открылся')
    end

    C.ReleaseDC(handle or 0, hdcWindow)
    C.DeleteObject(hdcMemDC)
    C.DeleteObject(hbmScreen)
end


screen([[C:\screen_desktop.bmp]], 200, 200, 500, 500) -- скрин с экрана
screen([[C:\screen_window.bmp]], 200, 200, 500, 500, workwindow()) -- скрин с рабочего окна (может быть перекрыто)
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
sutra
сообщение 28.3.2021, 10:15
Сообщение #22


*******

Adept
Сообщений: 923
Регистрация: 10.8.2018
Группа: Пользователи
Наличность: 0
Пользователь №: 19.007



Дарк, прочитал мануал. Что точно нужно добавить - это шаг поиска. Что возможно тоже может понадобиться - направление поиска. В остальном вроде всё как надо.

Cirus - спасибо большое. Пока ещё толком не тестил новые вещи. Чуть позже поделюсь мыслями.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
sutra
сообщение 28.3.2021, 10:41
Сообщение #23


*******

Adept
Сообщений: 923
Регистрация: 10.8.2018
Группа: Пользователи
Наличность: 0
Пользователь №: 19.007



Для чего нужен шаг? Например для поиска активной радиокнопки ("галочки", и т.п.)
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 28.3.2021, 12:31
Сообщение #24


***********

Модератор UOPilot
Сообщений: 9.465
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27680
Пользователь №: 11.279



Как весело провести вечер и утро.

А знаете ли вы, что если получить указатель на локальный C массив и выйти за пределы видимости, то сборщик мусора в дебаге ее не почстит и ffi.cast будет работать, а если выключить дебаг, то переменная будет почищена и все отвалится? Включаешь дебаг - работает, выключаешь - не работает. Белочка рядом =)


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
sutra
сообщение 28.3.2021, 13:43
Сообщение #25


*******

Adept
Сообщений: 923
Регистрация: 10.8.2018
Группа: Пользователи
Наличность: 0
Пользователь №: 19.007



Попробовал новый getimage. Работает намного быстрее. Прирост скорости зависит от зоны сканирования - это ОЧЕНЬ хорошо, так как нет принципиального тормоза.

Как я сейчас делаю. Получаю образ и потом на его базе ищу разные объекты (их немало). Потом чищу память.

А вот как прикручивать новый getimage на практике пока не знаю. Вариант пока только такой. Для каждого поиска используется свой getimage, в принципе по скорости всё приемлемо. НО. Иногда мне требуется работать с 2-мя образами, анализируя изменения (до и после). Как в таком случае? И опять же ... выполнил поиск одного объекта. Начал выполнять другой поиск, а на этот момент сменился кадр в окне. И по факту ищется уже при других условиях. В некоторых ситуациях это крайне нежелательно. Короче надо думать как это привести к единому знаменателю.

Вот я и думаю. Может сделать массив bits глобальным. И пусть он потом просто обновляется. Выделить под него память исходя из возможного максимума и собственно всё. Если я где-то сильно не прав - поправьте.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 28.3.2021, 13:54
Сообщение #26


***********

Модератор UOPilot
Сообщений: 9.465
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27680
Пользователь №: 11.279



Цитата
Выделить под него память исходя из возможного максимума

А максимума нет. Размер окна может быть намного больше размера экрана. В свое время так скринил сайты (попросили).
Цитата
Иногда мне требуется работать с 2-мя образами, анализируя изменения (до и после). Как в таком случае?

Точно так же, как с обычным гетимиджем. Я просто делаю массив видимый только непосредственно гетимиджу и свой делит под это дело. Сегодня - завтара выложу, что получилось, дальше по ходу буду править.


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
sutra
сообщение 28.3.2021, 13:59
Сообщение #27


*******

Adept
Сообщений: 923
Регистрация: 10.8.2018
Группа: Пользователи
Наличность: 0
Пользователь №: 19.007



Насколько я понимаю, по уму надо бы возвращать адрес массива bits, а по ненадобности освобождать память (как всё это делать я не знаю).
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 28.3.2021, 14:03
Сообщение #28


***********

Модератор UOPilot
Сообщений: 9.465
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27680
Пользователь №: 11.279



Цитата
Насколько я понимаю, по уму надо бы возвращать адрес массива bits, а по ненадобности освобождать память (как всё это делать я не знаю).

Я так и делаю.

Все скоро будет =)


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 28.3.2021, 23:12
Сообщение #29


***********

Модератор UOPilot
Сообщений: 9.465
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27680
Пользователь №: 11.279



Бэкапу пару дней. !@#$ notepad++


Эскизы прикрепленных изображений
Прикрепленное изображение

--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
sutra
сообщение 29.3.2021, 15:11
Сообщение #30


*******

Adept
Сообщений: 923
Регистрация: 10.8.2018
Группа: Пользователи
Наличность: 0
Пользователь №: 19.007



А тут как дела? Подвижки есть?
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 29.3.2021, 15:51
Сообщение #31


***********

Модератор UOPilot
Сообщений: 9.465
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27680
Пользователь №: 11.279



Цитата
А тут как дела? Подвижки есть?

Есть, откатился из-за чудес выше до момента пока getimage от cirus не существовал. Восстанавливаю, переписываю заново. Кстати в коде cirus есть ошибки. В частности там берется разность координат, а должна браться ширина в части мест, так же есть вопросы по созданию массива через new, есть информация, что это в дальнейшем хорошие риски получить битый указатель из-за работы сборщика мусора. Вроде правильно надо через malloc.


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 29.3.2021, 17:09
Сообщение #32


***********

Модератор UOPilot
Сообщений: 9.465
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27680
Пользователь №: 11.279



Захват изображения. Вот так вроде похоже на правду. Пока никуда еще в финды не подсовывал. Утрачено реально дофига, но там было очень много моментов, которые надо было понять и осознать. Восстановлю, конечно, шустрее, чем писать с нуля.

getimage

Код

local ffi=require "ffi"
local rmem=ffi.cast
local C=ffi.C

local SRCCOPY = 0x00CC0020
local DIB_RGB_COLORS = 0
local BI_RGB = 0
ffi.cdef[[
    typedef long LONG;
    typedef unsigned short WORD;
    typedef unsigned long DWORD;
    typedef unsigned char BYTE;
    typedef void *LPVOID;
    typedef struct {DWORD biSize; LONG  biWidth; LONG  biHeight; WORD  biPlanes; WORD  biBitCount; DWORD biCompression; DWORD biSizeImage;
        LONG  biXPelsPerMeter; LONG biYPelsPerMeter; DWORD biClrUsed; DWORD biClrImportant;} BITMAPINFOHEADER;
    typedef struct {BYTE rgbBlue; BYTE rgbGreen; BYTE rgbRed; BYTE rgbReserved;} RGBQUAD;
    typedef struct {BITMAPINFOHEADER bmiHeader; RGBQUAD bmiColors[1];} BITMAPINFO;
    int GetDC(int hWnd);
    int ReleaseDC(int hWnd, int hDC);
    int SelectObject(int hdc, int h);
    int CreateCompatibleDC(int hdc);
    int CreateCompatibleBitmap(int hdc, int cx, int cy);
    bool DeleteObject(int ho);
    bool BitBlt(int hdc, int x, int y, int cx, int cy, int hdcSrc, int x1, int y1, unsigned long rop);
    int GetDIBits(int hdc, int hbm, unsigned int start, unsigned int cLines, LPVOID lpvBits, BITMAPINFO* lpbmi, unsigned int usage);

    void free(void *ptr);
    void *malloc(size_t size);
]]

local ext = {}
local internal = {}
local images = {}

internal.deleteimage_orig = deleteimage
ext.getimage = function(x1, y1, x2, y2, handle, abs_flag)
    if handle > 2 or handle == 1 then
        local a, w, h, l
        w = x2-x1 + 1
        h = y2-y1 + 1
        
        local hdcWindow = C.GetDC(handle or 0)  -- если хендл не указан, то получим скрин с экрана
        local hdcMemDC = C.CreateCompatibleDC(hdcWindow)
        local hbmScreen = C.CreateCompatibleBitmap(hdcWindow, w, h)
        
        C.SelectObject(hdcMemDC,hbmScreen)
        C.BitBlt(hdcMemDC, 0, 0, w, h, hdcWindow, x1, y1, SRCCOPY)  -- сохранить в памяти скрин с окна или экрана

        local bi = ffi.new('BITMAPINFO', { {ffi.sizeof('BITMAPINFOHEADER'), w, -h, 1, 24, BI_RGB,0,0,0,0,0} })
        C.GetDIBits(hdcWindow, hbmScreen, 0, h, nil, bi, DIB_RGB_COLORS)   -- узнать какого размера нужен массив

        local bitmap_address = ffi.gc(C.malloc(bi.bmiHeader.biSizeImage), C.free)
        local h_copied = C.GetDIBits(hdcWindow, hbmScreen, 0, h, bitmap_address, bi, DIB_RGB_COLORS)   -- получить битовый массив


        --return h_copied and ffi.cast("int", bitmap_address) or nil, w, h_copied, math.floor(w*3/4+0.75)*4
        if h_copied > 0 then
            a = tonumber(ffi.cast("int", bitmap_address))
            
            images[a] = {}
            images[a].handle = handle
            images[a].hdcWindow = hdcWindow
            images[a].hdcMemDC = hdcMemDC
            images[a].hbmScreen = hbmScreen
            images[a].bitmap_address = bitmap_address

            return a, w, h_copied, math.floor(w*3/4+0.75)*4
        else
            return nil
        end
    else
        return internal.getimage_orig(x1, y1, x2, y2, handle, abs_flag)
    end
end

ext.deleteimage = function(address)
    if images[address] then
        C.ReleaseDC(images[address].handle, images[address].hdcWindow)            
        C.DeleteObject(images[address].hdcMemDC)
        C.DeleteObject(images[address].hbmScreen)
        ffi.C.free(ffi.gc(images[address].bitmap_address, nil)) -- Manually free the memory
        images[address] = nil
    else
        deleteimage_orig(address)
    end
end



Скорре всего:
Код
        C.ReleaseDC(images[address].handle, images[address].hdcWindow)             
        C.DeleteObject(images[address].hdcMemDC)
        C.DeleteObject(images[address].hbmScreen)

Можно выкинуть в getimage и прям там уничтожать, но я пока не тестил.

Ну и идейно я делаю замену пилотовских функций с полной обратной совместимостью. Т.е. предполагается:
deleteimage = ext.deleteimage
getimage = ext.getimage
без какого-либо ущерба для старых скриптов.

Сообщение отредактировал DarkMaster - 29.3.2021, 17:21


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Cockney
сообщение 29.3.2021, 20:33
Сообщение #33


********

Master
Сообщений: 1.395
Регистрация: 22.6.2013
Группа: Пользователи
Наличность: 21046
Пользователь №: 16.156



Цитата(DarkMaster @ 29.3.2021, 17:09) *

Ну и идейно я делаю замену пилотовских функций с полной обратной совместимостью. Т.е. предполагается:
deleteimage = ext.deleteimage
getimage = ext.getimage
без какого-либо ущерба для старых скриптов.



Без ущерба это классно, но по своему опыту создания точно такого же костыля могу сказать, что правильней сделать кучу маленьких функций, засунуть их в условный core неймспейс, а уже потом из них лепить целевую функцию-замену.


Где-то на диске валяются потуги, на плюсы была портирована работа с мышью и клавиатурой. Если надо, могу опубликовать, да и кстати, а почему бы не сделать github проект для данного дела. Вроде 21 год, а версионирование через посты форума.
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 29.3.2021, 21:00
Сообщение #34


***********

Модератор UOPilot
Сообщений: 9.465
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27680
Пользователь №: 11.279



Цитата
Где-то на диске валяются потуги, на плюсы была портирована работа с мышью и клавиатурой. Если надо, могу опубликовать, да и кстати, а почему бы не сделать github проект для данного дела. Вроде 21 год, а версионирование через посты форума.

Планов очень много, идей очень много. Я очень не хочу спешить. У меня появилось желание и возможность - я сидел ковырял некоторые баги пилота, некоторые потерянные возможности при переходе на луа. Если бы не sutra, то узнали бы об этом позже по релизу. Появится смысл - все будет. В целом я хочу сделать достаточно сильный упор на луа и возможность адаптации/прикручивания фишечек намного более нативным и спокойно расширяемым пользователем, форумными скриптами и т.д. Но давай не спешить. Сохранится возможность и желание - все будет. Вариант рассказать вагон баек и оставить все как было - меня не устраивает.
Цитата
Без ущерба это классно, но по своему опыту создания точно такого же костыля могу сказать, что правильней сделать кучу маленьких функций, засунуть их в условный core неймспейс, а уже потом из них лепить целевую функцию-замену.

Есть у меня два массивчика: internal и ext. Оба содержат только функции (не забываем про ограничение на 63 элемента в корне неймспейса в рамках луа). Соответственно ext - некоторый интерфейс поставляемый пользователю, internal - вся реальная обработка, куча фукнций для мелочей и т.д.


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Cockney
сообщение 29.3.2021, 23:47
Сообщение #35


********

Master
Сообщений: 1.395
Регистрация: 22.6.2013
Группа: Пользователи
Наличность: 21046
Пользователь №: 16.156



Цитата(DarkMaster @ 29.3.2021, 21:00) *

Планов очень много, идей очень много. Я очень не хочу спешить. У меня появилось желание и возможность - я сидел ковырял некоторые баги пилота, некоторые потерянные возможности при переходе на луа. Если бы не sutra, то узнали бы об этом позже по релизу. Появится смысл - все будет. В целом я хочу сделать достаточно сильный упор на луа и возможность адаптации/прикручивания фишечек намного более нативным и спокойно расширяемым пользователем, форумными скриптами и т.д. Но давай не спешить. Сохранится возможность и желание - все будет. Вариант рассказать вагон баек и оставить все как было - меня не устраивает.



Не понимаю почему нельзя создать гитхаб реп уже сейчас и иметь нормальную кодовую базу, а не вот "ну опять этот блокнот...". Работа остановится - кто-то может продолжит. Это дело добровольное.
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 29.3.2021, 23:55
Сообщение #36


***********

Модератор UOPilot
Сообщений: 9.465
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27680
Пользователь №: 11.279



Если угодно - сглазить не хочу.
Блокнот реально подвел тупо из-за того, что обновился. У меня по дефолту в бекапах чуть более, чем все =) Разные винты, разные верссии, что-то в оффлайн, что-то допом в облака. Произошло старое любимое "не было печали - апдейтов накачали".


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
sutra
сообщение 30.3.2021, 11:51
Сообщение #37


*******

Adept
Сообщений: 923
Регистрация: 10.8.2018
Группа: Пользователи
Наличность: 0
Пользователь №: 19.007



Ну вот, я явился возмутителем спокойствия и благоденствия. Просто я ставил вполне себе понятные цели. Если мой глаз что-то видит и мозг даёт команду ткнуть куда-то, то это точно можно запрограммировать. Вопрос в степени сложности алгоритма (моё любимое занятие - придумывать). И именно из-за объёма вычислений и нужна эта самая скорость. Но даже реализация этих целей меня не устраивает. Я иду дальше, на основе собранной статистики - я пытаюсь ПРЕДСКАЗАТЬ то, что глаз ещё не видит. И это получается (цель ещё не появилась, а по факту она уже уничтожена - если очень грубо описать сей процесс).
Получается что это надо только мне. Но ради меня точно не надо напрягаться - для меня это просто хобби. Я своё давно отпрограммировал.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
sutra
сообщение 30.3.2021, 13:16
Сообщение #38


*******

Adept
Сообщений: 923
Регистрация: 10.8.2018
Группа: Пользователи
Наличность: 0
Пользователь №: 19.007



Попробовал сохранить картинку. Ничего не получилось. Пробовал всяко. С потерянной единичкой на ширине и высоте, без единички, 32 битами, 24 битами - результат один. Совершенно не догоняю почему зашит жёстко адрес 0x4d42 при инициализации заголовка файла.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 30.3.2021, 13:43
Сообщение #39


**********

Elder
Сообщений: 3.480
Регистрация: 18.8.2014
Группа: Пользователи
Наличность: 26702
Пользователь №: 16.971
Возраст: 29



Цитата
Совершенно не догоняю почему зашит жёстко адрес 0x4d42 при инициализации заголовка файла.

Это начало bmp файла BM.
Цитата
Попробовал сохранить картинку. Ничего не получилось.

Указать другую папку, возможно нет прав каких-то.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
sutra
сообщение 30.3.2021, 15:31
Сообщение #40


*******

Adept
Сообщений: 923
Регистрация: 10.8.2018
Группа: Пользователи
Наличность: 0
Пользователь №: 19.007



Создаёт файл 14 байт. Доступ к нему действительно отсутствует, пока не закроешь Пилот.

Пробовал в разные папки. Результат тот же.

Пишет только заголовок.

Всё от имени администратора. ???

Поменял местами, сначала пишу инфо выход - 40 байт. Значит блокирует после первой записи в файл. Что за хрень, непонятно.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения

30 страниц V < 1 2 3 4 > » 
Ответить в эту темуОткрыть новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия | Версия для КПК Сейчас: 19.4.2024, 18:16
Designed by Nickostyle