Помощь · Поиск · Пользователи · Календарь
Полная версия этой страницы: 640*480
Flash Zone Forum > Macromedia Flash > ActionScript
DJKOT
День добрый. Помогите советом, как можно сделать, чтобы флеш-проектор запускался на фулскрин и при этом насильно присваивал экрану разрешение 640*480? Дело в том, что там присутствует полноэкранное видео, бленды и некоторые эффекты, которые тормозят при 1280*1024 даже при Low Quality (а у меня проц. 2,4 ггц, и граф. карта 1 гБ). В видео превратить все подряд нельзя - ибо интерактивность. Есть ли решение данного вопроса в рамках флеша?
chingachgoog
Из браузера - нет, десктопно - можно.
MustLive
Цитата
640*480, регулировка разрешения дисплея.

DJKOT

Помимо решения этой задачи путём установки разрешения дисплея, как ты поставил вопрос и об этом уже ответил chingachgoog (что только на десктопе), можно решить её другим путём. А именно: ограничения размера флешки (при произвольном разрешении монитора пользователя). Этот вариант будет работать и в браузере и на десктопе, при запуске флешки в стационарном флеш плеере или в виде exe-проекта.

Если ограничить размер флешки (до 640х480 в данном случае) и при этом запускать не в полно-экранном режиме, то здесь всё понятно и это реализуется стандартным образом. А если нужен фулскрин, то можно разместить объекты в центре сцены и запретить масштабирование - таким образом флешка будет иметь одинаковые размеры своих объектов на любом разрешении. О том, каким кодом это реализуется, мы уже писали на форуме.
DJKOT
Цитата(MustLive @ 21.11.2011 - 05:06) *
DJKOT

Если ограничить размер флешки (до 640х480 в данном случае) и при этом запускать не в полно-экранном режиме, то здесь всё понятно и это реализуется стандартным образом. А если нужен фулскрин, то можно разместить объекты в центре сцены и запретить масштабирование - таким образом флешка будет иметь одинаковые размеры своих объектов на любом разрешении. О том, каким кодом это реализуется, мы уже писали на форуме.


мне нужно сменить именно разрешение дисплея. нужно чтобы разошлось на фулскрин полностью (чтобы заняло всю область экрана), а не только кусочек в центре экрана. демонстрироваться будет в оффлайне (Flash Projector), браузер не требуется.
 похожую функцию в Windows XP имеет галка "запускать в 640х480" в свойствах exe-шника. мне нужно как-то так.
DJKOT
Цитата
десктопно - можно.

а каким образом это осуществляется?
MustLive
Цитата
мне нужно сменить именно разрешение дисплея.

Значит сделаешь именно изменение разрешения дисплея. Тем более, что у тебя всё равно флеш-проектор для запуска на десктопе.

Цитата
а каким образом это осуществляется?

DJKOT, здесь есть несколько методов.

1. Можешь написать программу на таких языках как Visual Basic, C++ и других, IDE которых позволяют добавить ActiveX компонент. И таким образом ты напишешь код установки разрешения на высокоуровневом языке программирования и в эту программу включить свою флешку.

2. Сделай ярлык для exe-файла флеш-проектора. В ярлыке укажи настройку "запускать в 640х480". И дальше давай пользователю именно ярлык для работы с твоей флешкой.

3. Используй программы для создания продвинутых флеш-экзешников (которые мы уже многократно обсуждали на форуме, такие как Zinc). Которые могут поддерживать установку нужного разрешения.
DJKOT
 к сожалению, у Zinc максимум это 800*600, меньше он не хочет.

Цитата
1. Можешь написать программу на таких языках как Visual Basic, C++ и других, IDE которых позволяют добавить ActiveX компонент. И таким образом ты напишешь код установки разрешения на высокоуровневом языке программирования и в эту программу включить свою флешку.

а разве легально встраивать флешку в программы, скомпиленные на других языках?
chingachgoog
Цитата(DJKOT @ 23.11.2011 - 12:03) *
к сожалению, у Zinc максимум это 800*600, меньше он не хочет.


var ResChanged:String = mdm.System.setResolution(640, 480, 60); // Возвращает "false"?

Может данный монитор вообще такое разрешение не поддерживает? Или надо другую частоту кадров поставить?

Плюс есть способ и без Цинка обойтись. Можно из проектора напрямую запустить батник.
Или тут я давал ссылку на проект alexcon314, он что-то вроде Цинка сделал, но удобнее (не надо компилировать под Цинк - используется обычная swf-ка)
DJKOT
 мой монитор поддерживает. ибо игры и прочее-прочее прекрасно на нем рулят в таком размере. даже панель nvidia его принимает.

батник - это через FSCommand? батник был бы тоже неплохим решением. знать бы, как писать такой код. в интернете рыл - и батники, и exe и vbs, ничего не нашел.
ссылка на проект alexcon314 мертвая.


chingachgoog
Цитата(DJKOT @ 23.11.2011 - 14:53) *
мой монитор поддерживает.


Ок. А какое значение возвращает Цинк? Может эта команда вообще не обрабатывается? Какой Цинк?

Цитата(DJKOT @ 23.11.2011 - 14:53) *
ссылка на проект alexcon314 мертвая.


http://code.google.com/p/extprojector/
DJKOT
Цитата
А какое значение возвращает Цинк? Может эта команда вообще не обрабатывается? Какой Цинк?

Zinc 4.0 триалка.
Куда она вводится-то, эта команда?
chingachgoog
Цитата(DJKOT @ 23.11.2011 - 15:36) *
Куда она вводится-то, эта команда?


Как куда? В AS код. Хоть на таймлайне написать.
Только если проект на AS2 надо в параметрах публикации во флеш-редакторе выставить 8-й ФП (хотя это можно обойти)
А если на AS3, то в коде надо сначала проинициализировать Цинк.
DJKOT
 собственно я в восьмом и сижу.
возвращает undefined
chingachgoog
Цитата(DJKOT @ 23.11.2011 - 15:49) *
возвращает undefined


А, блин - там с 3-го Цинка надо вручную эксеншены выбирать. В закладке экстеншены (внизу) поставить галочку на системе.
DJKOT
 выдал false
chingachgoog
Значит функция работает, но что-то не понравилось. Может частота, может еще что.
У меня, например, на мониторе нет такого разрешения, и мне выдало null (странно - в хелпе это не написано ))) ), но установило в минимально возможное на моем мониторе разрешение: 800х600.
DJKOT
 полуркал хелп и обнаружил, что еще надо приписывать битовую глубину
Код
var ResChanged:String = mdm.System.setResolution(640, 480, 16, 60);

так работает и выдает true

DJKOT
 ага. теперь осталось найти 399 баксов на покупку этой проги...
батник в данном случае кажется дешевле )))
chingachgoog
Что-то у alexcon314 не нашел я где разрешение менять. Спрошу у него, когда он в эфир выйдет )))
Может даже и добавит функционала, если нет, по просьбам трудящихся )))
DJKOT
 спасибо тебе большое. жду ответа.
chingachgoog
Обещал в ближайшее время проапдейтить.
Но у него для AS3 это будет. (его разработка работает с AS2 только до 9-го ФП). Вряд ли для AS2 проапдейтит - но надо проверить.

add:

архивы в гугле обновлены:

PSystem.setDisplayResolution(800, 600, 0);
третий параметр - режим обновления, типа тест или насовсем, 0 - рекомендуемое значение.
При выходе из приложения надо установить обратно. то что было - с помощью
PSystem.getDisplayResolution() - вернет объект о{x,y} с текущими значениями.

AS2 доступен (но плеер не старше 9)


PS

Вот еще решение от alexcon314:

Цитата
Код
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2")
Set colItems = objWMIService.ExecQuery( _
    "SELECT * FROM Win32_DesktopMonitor",,48)
For Each objItem in colItems
    Wscript.Echo "-----------------------------------"
    Wscript.Echo "Win32_DesktopMonitor instance"
    Wscript.Echo "-----------------------------------"
    Wscript.Echo "ScreenWidth: " & objItem.ScreenWidth
Next


это получить скриптом

Код
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2")
Set colItems = objWMIService.ExecQuery( _
    "SELECT * FROM Win32_DesktopMonitor",,48)
For Each objItem in colItems
    objItem.ScreenWidth = 800
    objItem.ScreenHeight = 600
Next


это установить скриптом
у меня в проекторе это можно сделать с помощью класса PScript/
и из батника можно. только надо сначала как-то извратиться, считать текущие. короче из батника тоже можно, если захотеть
DJKOT
 спасибо за развернутый ответ. теперь осталось понять что это значит(с моими скромным знаниями в этой области)
так понимаю, что PSystem это из его extprojector?
я нашел еще код - exe-шник, по моему, C++
но проблема в том, что запускается из консоли (с указанием параметров х и у). если была бы возможность привинтить к fscommand - было бы проще...
Код
#include <windows.h>

struct DDList {
    DISPLAY_DEVICE    Device;
    struct DDList    *Next;
};
static void DDList_Build(struct DDList **ppDD);
static void DDList_Clean(struct DDList **ppDD);
static BOOL DDList_Pop(struct DDList **ppDD, DISPLAY_DEVICE    *device);

static BOOL getResolution(int argc, char **argv, int *width, int *height);

int main(int argc, char **argv) {
    DISPLAY_DEVICE    device        = {0};
    struct DDList    *ddList        = NULL;
    DEVMODE            deviceMode    = {0};
    int                newWidth    = 0;
    int                newHeight    = 0;
    int                actualWidth    = 0;
    int                actualHeight= 0;

    if(!getResolution(argc, argv, &newWidth, &newHeight)) {
        return 1;
    }

    //    build display devices list
    DDList_Build(&ddList);

    //    get the first display device, if any (...);
    //    decision is with user, or relying on other considerations
    device.cb = sizeof(device);
    if(DDList_Pop(&ddList, &device)) {
        //    now change the display settings
            //    enumerate current (we can user NULL instead of device.DeviceName,
            //    but this is more generic)
        deviceMode.dmSize            = sizeof(deviceMode);
        deviceMode.dmDriverExtra    = 0;
        if(EnumDisplaySettingsEx(device.DeviceName, ENUM_CURRENT_SETTINGS, &deviceMode, 0)) {
            actualWidth = deviceMode.dmPelsWidth;
            actualHeight = deviceMode.dmPelsHeight;
            if((actualWidth != newWidth) || (actualHeight != newHeight)) {
                //    change requested
                deviceMode.dmPelsWidth    = newWidth;
                deviceMode.dmPelsHeight    = newHeight;
                if(ChangeDisplaySettingsEx(device.DeviceName, &deviceMode,                     
                    NULL, 0, NULL) == DISP_CHANGE_SUCCESSFUL) {
                    //    broadcast change to system
                    SendMessage(HWND_BROADCAST, WM_DISPLAYCHANGE,
                        (WPARAM)(deviceMode.dmBitsPerPel),
                        MAKELPARAM(newWidth, newHeight));
                }
            }
        }
    }

    //    clear list
    DDList_Clean(&ddList);

    return 0;
}

static void DDList_Build(struct DDList **ppDD) {
    DWORD            deviceNum    = 0;
    DISPLAY_DEVICE    device        = {0};
    struct DDList    *ddList        = NULL;
    struct DDList    *dd            = NULL;
    struct DDList    *ddLastNode    = NULL;

    if(ppDD == NULL) {
        return;
    }
    *ppDD = NULL;

    //    build display devices list
    device.cb = sizeof(device);
    do {
        if(!EnumDisplayDevices(NULL, deviceNum, &device, 0)) {
            break;
        }
        if(device.StateFlags & DISPLAY_DEVICE_ATTACHED_TO_DESKTOP) {
            dd = (struct DDList *)malloc(sizeof(struct DDList));
            if(!dd) {
                break;
            }
            dd->Device    = device;
            dd->Next    = NULL;

            if(ddList) {
                ddLastNode->Next = dd;
                ddLastNode = dd;
            }
            else {
                ddList = dd;
                ddLastNode = ddList;
            }
        }
        deviceNum++;
    } while(1);

    *ppDD = ddList;
}

static void DDList_Clean(struct DDList **ppDD) {
    struct DDList    *ddList        = NULL;
    struct DDList    *dd            = NULL;

    if(ppDD == NULL) {
        return;
    }
    ddList = *ppDD;
    //    clear list
    while(ddList) {
        dd = ddList;
        ddList = ddList->Next;
        free(dd);
    }
}

static BOOL DDList_Pop(struct DDList **ppDD, DISPLAY_DEVICE    *device) {
    struct DDList *ddList = NULL;
    struct DDList *ddHead = NULL;
    size_t cbDD = sizeof(DISPLAY_DEVICE);

    if(ppDD == NULL) {
        return FALSE;
    }
    if(device == NULL) {
        return FALSE;
    }
    if(device->cb < cbDD) {
        return FALSE;
    }
    ddList = *ppDD;
    CopyMemory(device, &ddList->Device, cbDD);

    ddHead = ddList;
    ddList = ddList->Next;
    free(ddHead);

    *ppDD = ddList;
    return TRUE;
}

static BOOL getResolution(int argc, char **argv, int *width, int *height) {
    char *arg = NULL;
    int n = 0;

    if(width == NULL || height == NULL) {
        return FALSE;
    }
    if(argc != 3) {
        return FALSE;
    }
    //    width
    arg = argv[1];
    n = atoi(arg);
    if(n <= 0) {
        return FALSE;
    }
    *width = n;
    //    height
    arg = argv[2];
    n = atoi(arg);
    if(n <= 0) {
        return FALSE;
    }
    *height = n;

    return TRUE;
}
MustLive
Цитата
а разве легально встраивать флешку в программы, скомпиленные на других языках?

Легально и реально. Собственно флеш-проджекторы сделанные из флеш плеера/редактора (т.е. от разработчика технологии Flash) и программы для создания продвинутых флеш-экзешников (Zinc и другие) так и делают.

Только в отличии от ручной работы, когда самому в различных IDE (в том же Visual Studio) создавать ПО и внедрять в неё флешку, когда нужно лишь немного дополнительных фишек, которых нет в флеш-проджекторах, при использовании специального ПО (такого как Zinc) можно сделать эту работу проще и быстрее. Что весьма удобно для флеш разработчиков - сделал флешку, потом пропустил её через Zinc или подобную программу, и на выходе получил exe-шник, который выглядит как полноценная программа.

Цитата
архивы в гугле обновлены

Делать через батник, Zinc или extprojector - это уже на собственное усмотрение.
Русская версия IP.Board © 2001-2013 IPS, Inc.