Перейти к содержанию
Fire Monkey от А до Я

Mars M

Пользователи
  • Постов

    63
  • Зарегистрирован

  • Посещение

  • Победитель дней

    4

Сообщения, опубликованные Mars M

  1. Тема старая, но вот тоже понадобилось работать с запаролеными zip архивами в Windows.

    Наткнулся на это http://www.uweraabe.de/Blog/2017/05/07/tzipfile-with-password-encryption-part-3/

    Там статья из трех частей. Если кратко то в третьей части можно скачать конечный результат модуля, во второй, в комментах есть пример работы.

    Все в сборе приаттачил к сообщению :)

    Проверил, вроде работает. Из минусов если добавлять в архив папку с файлами(ZipDirectoryContents) то файлы не паролятся, ну это не проблема.

     

    ZipTest.rar

  2. Что никто не встречал подобного?

    Переношу один старый проект на FMX, оказалось сложней чем предполагал.

    Но отступать уже поздно :)

    Одна из проблем как раз отсутствие hex реактора.

    В принципе нужен даже не редактор а просмотрщик с минимальными возможностями редактирования.

     

  3. Такая проблема - есть ListBox, MultiSelectStyle выставлен в None.

    Вроде все нормально, но если выделить какой нибудь итем, потом правой кнопкой кликнуть по любому итему то выделенный итем так и останется выделенным, даже если выбрал уже другой.

    Это косяк листбокса или так и должно быть и как это обойти?

  4. Нужен компонент Hex редактора для FMX. 

    Поиском ничего не нашел.

    Когда то бы прекрасный компонент TMPHexEditor, но сейчас найти подобное для FMX думаю не реально.

    Или может кто сам подобное делал и посоветует чего: :)

     

  5. Кинул на ScrollBox несколько TExpander, если у всех свойство isExpanded := True то все нормально.

    Если у какого выставить в false то с ним во время выполнения программы начинаются проблемы, может не раскрыться или исчезнуть заголовок.

    IDE Delphi Tokyo 10.2, в предыдущих версиях не проверял.

    Отрыл проект из папки samples, там у всех TExpander установлено true, если устанавливаю в false то тоже такая же проблема.

    Проблема только в Токио или во всех версиях так?

    PS: пока вышел из положения вот так.

    Выставил у всех isExpanded := True и в onCreate формы добавил

      for i := 0 to ComponentCount - 1 do
        if Components[i] is TExpander then
          TExpander(Components[i]).IsExpanded := False;

    Работает конечно, но в дальнейшем могут быть неудобства, нужно будет проверять какие нужны раскрыты а какие нет.

     

  6. denprox, твое желание сделать по проще понятно. Но нужно понимать что если ты делаешь проще для себя, то усложняешь все для пользователя :)

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

    Редактор можно сделать примерно по такому принципу.

    Скрытый текст

    Пользователь загружает картинку, указывает что это - например фон сцены или просто картинка для красоты, то есть которая не участвует в игре.

    Их просто отрисовываем на общем битмапе, который в игре будет грузиться как фон.

    Или картинка может быть каким нибудь объектом, например мишенью или стеной. Эти картинки сохраняем отдельно а размеры и координаты сохраняем в файл.

    Так же для объектов можно указать какие нибудь действия(которые предусмотрены редактором), например если попали по мишени то она падает.

    Если нужны прозрачные регионы на "объектах", опять же не нужно заставлять пользователя что то делать в фотошопе, ему достаточно  будет мышкой выделить нужную область, размеры и координаты которой так же сохраняются в файл.

    Далее в игре

    Скрытый текст

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

    Но в случае если загружать карту созданную в редакторе то и тут все сильно облегчается :)

    И совсем не обязательно точь в точь следовать моему примеру, то есть отрисовывать все битмапами.

    Зная координаты и размеры например мишени, можно по ним создать любой контрол, например TPanel, на нем уже отрисовать картину выбранную пользователем в редакторе.

    А уж с контролом потом можно делать что угодно, при этом не зная его хэндла, но зная его координаты :)

    Из моего примера видно, что определение того "попала" пуля в нужные координаты или нет используется всего одна функция.

    На самом деле все проще чем кажется, к тому же убиваем еще одного зайца, код получается кроссплатформенным.

    Хотя тут утверждать не буду, на Токио у меня проекты под андроид не собираются а других девайсов нету :)

     

     

     

  7. 29 минут назад, denprox сказал:

    Мишени и укрытия заранее не известны.

    Сделать так что бы были известны :)

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

    А потом в игре отрывать его и будет известно все что нужно.

    Для примера, создать запись(record)

    type
      TMap = record
        Texture: string[255];
        wallRect: TRectF;
        targetRect: TRectF;
        winRect: TRectF;
        RadArr: array[0..3] of Single;
        ClrArr: array[0..3] of TAlphaColor;
      end;

    Пользователь во время создания/редактирования карты заполняет его.

    ...............
    var
    Map: TMap;
    ...............
    Texture := 'wall.bmp';
    wallRect := TRectF.Create(0, 0, 20, 50);
    ...............
    ...............

    Сохраняем в файл

    var
      mStream: TMemoryStream;
    begin
     mStream := TMemoryStream.Create;
     mStream.Write(Map, SizeOf(TMap));
     mStream.SaveToFile('maps\tire.dat');
     mStream.Free;
    end;

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

    var
      mStream: TMemoryStream;
      Map: TMap;
    begin
     mStream := TMemoryStream.Create;
     mStream.LoadFromFile('maps\tire.dat');
     mStream.Read(Map, SizeOf(TMap));
     mStream.Free;
    end;

    В таком случае будут все нужные параметры известны, и примерно так же в играх и делают.

  8. Описание того что нужно как то расплывчато, но вот примерно так можно сделать.

    Всего один TImage который используется для отрисовки битмапов.

    Видео

    Скрытый текст
    Скачать видео

     

     и проект 

     

    Tire.rar

  9. В общем свой вопрос решил. Вышеописанные функции удобны для работы с координатами.

    И подошли бы мне если бы нужно было перемещать саму модель, но в моем случае нужно работать только с камерой, а это значит что нужно постоянно учитывать ее положение. Короче слишком много математики для фичи которая будет только для того что бы была :)

    Но к счастью есть свойство ScreenBounds, которое все сделает за меня.

    Вот обновленный пример, по правой кнопке куб вписывается в окно, что мне и нужно.

    https://yadi.sk/d/KVJFHajd3J9ALD

     

    Projects.rar

  10. Есть такие функции LocalToAbsolute3D и AbsoluteToLocal3D 

    С первой разобрался(пример), со второй тоже в принципе ясно.

    Осталось только разобраться как это применить :)

    PS: пример честно скопипастил отсюда :) у него там есть и другие интересные проекты.

    https://github.com/LUXOPHIA/Sketch3D

     

    Projects.rar

  11. Возможно название темы не правильно задал, но просто не понимаю сути вопроса :)

    Есть ViewPort3D, на нем TDummy, на котором рисую модель.

    Вопрос вот в чем, модель может быть как большая, так и маленькая, как мне вписать ее в размеры ViewPort3D?

    Разумеется все максимальные и минимальные координаты модели мне известны, но вот как их использовать не могу сообразить.

     

  12. Подниму тему. CUDA конечно хорош(а?), но только для nvidia.

    Наткнулся тут на работу с OpenCL в делфи http://www.delphisources.ru/forum/showthread.php?t=28188

    Там по ссылке в первом сообщение в принципе все есть что нужно. Кому оттуда не удобно перезалил все файлы https://yadi.sk/d/t3mPqlJT3HnfiX

    Вот пример использования https://yadi.sk/d/bmDKXZ0k3Hnfny

    Проверял на картах nvidia и ati, конечно же карты должны поддерживать OpenCL.

    Если в MyOpenCL.pas чего то не хватает, можно взять это в CL.pas из GLScene https://sourceforge.net/p/glscene/code/HEAD/tree/trunk/Source/ParallelAPIs/

    Я например добавил константу   CL_DEVICE_LOCAL_MEM_SIZEэ

    А можно использовать родные CL.pas и CL_Platform.pas, в первом архиве есть пример использования.

    В 03.05.2017 в 20:29, Евгений Корепов сказал:

    Хоть и не в тему топика, но хочу какие нибудь вычисления замонстрячить!

    В архиве как раз есть рабочий пример вычислений :)

  13. Вот так вот вроде работает:

    Скрытый текст
    
      TCudaDeviceProp = packed record
        Name: array[0..256 - 1] of AnsiChar;
        TotalGlobalMem: Cardinal;
        SharedMemPerBlock: Cardinal;
        RegsPerBlock: Integer;
        WarpSize: Integer;
        MemPitch: Cardinal;
        MaxThreadsPerBlock: Integer;
        MaxThreadsDim: array[0..3 - 1] of Integer;
        MaxGridSize: array[0..3 - 1] of Integer;
        ClockRate: Integer;
        TotalConstMem: Cardinal;
        Major: Integer;
        Minor: Integer;
        TextureAlignment: Cardinal;
        texturePitchAlignment: Cardinal;
        DeviceOverlap: Integer;
        MultiProcessorCount: Integer;
        kernelExecTimeoutEnabled: Integer;
        integrated: Integer;
        canMapHostMemory: Integer;
        computeMode: Integer;
        maxTexture1D: Integer;
        maxTexture1DMipmap: Integer;
        maxTexture1DLinear: Integer;
        maxTexture2D: array[0..2 - 1] of Integer;
        maxTexture2DMipmap: array[0..1] of integer;
        maxTexture2DLinear: array[0..3 - 1] of Integer;
        maxTexture2DGather: array[0..2 - 1] of Integer;
        maxTexture3D: array[0..3 - 1] of Integer;
        maxTexture3DAlt: array[0..2] of integer;
        maxTextureCubemap: Integer;
        maxTexture1DLayered: array[0..2 - 1] of Integer;
        maxTexture2DLayered: array[0..3 - 1] of Integer;
        maxTextureCubemapLayered: array[0..2 - 1] of Integer;
        maxSurface1D: Integer;
        maxSurface2D: array[0..2 - 1] of Integer;
        maxSurface3D: array[0..3 - 1] of Integer;
        maxSurface1DLayered: array[0..2 - 1] of Integer;
        maxSurface2DLayered: array[0..3 - 1] of Integer;
        maxSurfaceCubemap: Integer;
        maxSurfaceCubemapLayered: array[0..2 - 1] of Integer;
        surfaceAlignment: Cardinal;
        concurrentKernels: Integer;
        ECCEnabled: Integer;
        pciBusID: Integer;
        pciDeviceID: Integer;
        pciDomainID: Integer;
        tccDriver: Integer;
        asyncEngineCount: Integer;
        unifiedAddressing: Integer;
        memoryClockRate: Integer;
        memoryBusWidth: Integer;
        l2CacheSize: Integer;
        maxThreadsPerMultiProcessor: Integer;
        streamPrioritiesSupported: Integer;
        globalL1CacheSupported: Integer;
        localL1CacheSupported: Integer;
        sharedMemPerMultiprocessor: Cardinal;
        regsPerMultiprocessor: Integer;
        managedMemory: integer;
        isMultiGpuBoard: integer;
        multiGpuBoardGroupID: Integer;
      end;

     

    Только нужно будет закомментировать строчку

    assert(sizeof(TCudaDeviceProp) = 540, 'sizeof(TCudaDeviceProp) <> 540');

     

  14. Теперь вот окончательно разобрался что к чему :)

    Ошибку в коде что я писал уже появилась после того как я код переделал что бы буферы векторов и индексов делить на части.

    Думая что ошибка найдена я вернул все к первоначальному виду и тут та же проблема.

    В общем наткнулся в исходниках fmx на метод Create для индексного буфера.

    TIndexBuffer.Create(const ALength: Integer; const AFormat: TIndexFormat = TIndexFormat.UInt16);

    Из которого стала понятна причина проблемы :)

    При создании буфера указал TIndexFormat.UInt32   и первоначальный код заработал без проблем.

    Возможно плохо искал, но сколько инет перерыл не попадалось про это. Хотя на gamedev.ru читал про тоже самое но касательно OpenGL, но не обратил внимание :)

     

×
×
  • Создать...