Pixilang v3.0 rc1

Pixilang по русски
User avatar
NightRadio
Site Admin
Posts: 3118
Joined: Fri Jan 23, 2004 12:28 am
Location: Ekaterinburg. Russia
Contact:

Pixilang v3.0 rc1

Post by NightRadio » Thu Jun 30, 2011 12:33 pm

Первый кандидат в релиз.

Ссылка: http://www.warmplace.ru/soft/pixilang3/pixilang3.0.zip

В этой версии множество небольших изменений. Из основных: загрузка PNG; функция file_dialog; интерполяция в сэмплере и в аудио-движке.
Возможно, что несколько функций, описанных в мануале, не присутствуют в данной версии - за это заранее извиняюсь, просто активно сейчас правлю код. Окончательный релиз ожидается в начале июля.

Все доки, как обычно, здесь: http://code.google.com/p/pixilang/w/list

J3d1
Posts: 175
Joined: Wed Oct 15, 2008 4:49 am
Location: г. Абакан, Хакасия
Contact:

Re: Pixilang v3.0 rc1

Post by J3d1 » Thu Jun 30, 2011 12:41 pm

Отлично! :Yahoo!: Спасибо NightRadio! Попробую компильнуть под wince.

J3d1
Posts: 175
Joined: Wed Oct 15, 2008 4:49 am
Location: г. Абакан, Хакасия
Contact:

Re: Pixilang v3.0 rc1

Post by J3d1 » Thu Jun 30, 2011 1:10 pm

С графическими форматами pixi3 ситуация ясна: есть jpeg и png. Правда нет пока команды сохранения контейнера в эти форматы. Планируется ли поддержка формата mp3 или wav?

User avatar
NightRadio
Site Admin
Posts: 3118
Joined: Fri Jan 23, 2004 12:28 am
Location: Ekaterinburg. Russia
Contact:

Re: Pixilang v3.0 rc1

Post by NightRadio » Thu Jun 30, 2011 2:26 pm

Сохранение в графические форматы обязательно будет. Из звуковых форматов планируется поддержка WAV и OGG Vorbis.

J3d1
Posts: 175
Joined: Wed Oct 15, 2008 4:49 am
Location: г. Абакан, Хакасия
Contact:

Re: Pixilang v3.0 rc1

Post by J3d1 » Thu Jun 30, 2011 5:55 pm

Небольшая программка-шутка. http://narod.ru/disk/17669632001/smile.zip.html

Several light
Posts: 67
Joined: Sun Jun 28, 2009 11:07 pm

Re: Pixilang v3.0 rc1

Post by Several light » Thu Jun 30, 2011 9:56 pm

А я уже собирался переписывать функции для чтения WAV файлов с версии 1.6 в на версию 3.0... :( ... хотя вкачестве встроенных функций это наверно будет работать более производительно, ктомуже неочнь хочется разбираться с 32х биттными форматами... Так что будем жадть! :)

Вопрос у меня по функции получения событий. Вот кусок программы:

xsc=0 ysc=0
while(1){
if get_event() {
n=EVT[EVT_KEY]

if n==140 {ysc=ysc-1 pixi(scr,xsc,ysc) frame()}
if n==141 {ysc=ysc+1 pixi(scr,xsc,ysc) frame()}
if n==142 {xsc=xsc-1 pixi(scr,xsc,ysc) frame()}
if n==143 {xsc=xsc+1 pixi(scr,xsc,ysc) frame()}
}
}

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

User avatar
NightRadio
Site Admin
Posts: 3118
Joined: Fri Jan 23, 2004 12:28 am
Location: Ekaterinburg. Russia
Contact:

Re: Pixilang v3.0 rc1

Post by NightRadio » Fri Jul 01, 2011 12:03 am

Немного обновил версию. Ссылка та же.
Добавил билд для Win Mobile (wince), исправил кое-какие ошибки и упростил работу с клавишами. Теперь не нужно забивать номера кнопок влево-вправо, достаточно лишь написать имя клавиши. Например, KEY_LEFT. Подробнее описано здесь: http://code.google.com/p/pixilang/wiki/ ... RU#События
Добавил новый пример graphics/keyboard.pixi, в котором показано, как управлять квадратиком при помощи клавиш со стрелками. Думаю, этот пример хорошо отвечает на последний вопрос от Several light. На всякий случай исходник привожу ниже:

Code: Select all

creen = get_screen()
xsize = get_xsize( screen )
ysize = get_ysize( screen )

x = 0
y = 0

while( 1 )
{
    print( "Press left/right/up/down", 0, -ysize / 2 + 8, WHITE )
    fbox( x, y, 2, 2, WHITE )
    frame()
    while( get_event() )
    {
        if EVT[ EVT_TYPE ] == EVT_BUTTONDOWN
        {
            key = EVT[ EVT_KEY ]
            if key == KEY_UP { y - 1 }
            if key == KEY_DOWN { y + 1 }
            if key == KEY_LEFT { x - 1 }
            if key == KEY_RIGHT { x + 1 }
        }
        if EVT[ EVT_TYPE ] == EVT_QUIT { halt }
    }
}

J3d1
Posts: 175
Joined: Wed Oct 15, 2008 4:49 am
Location: г. Абакан, Хакасия
Contact:

Re: Pixilang v3.0 rc1

Post by J3d1 » Fri Jul 01, 2011 10:30 am

NightRadio, прошу пояснить как использовать контейнеры в функциях pixilang3 в качестве передаваемых параметров. Суть проблемы: хочу создать функцию для работы с контейнером (чтобы ее можно было вызвать потом для любого контейнера). Как мне это сделать правильно?

User avatar
NightRadio
Site Admin
Posts: 3118
Joined: Fri Jan 23, 2004 12:28 am
Location: Ekaterinburg. Russia
Contact:

Re: Pixilang v3.0 rc1

Post by NightRadio » Fri Jul 01, 2011 10:34 am

Очень просто. Приведу пример.

Code: Select all

fn do_something_with_container( $c )
{
  $c[ 0 ] = 23 //Пишем что-то в контейнер
  a = $c[ 1 ] //Читаем
  pixi( $c ) //Рисуем контейнер
}
//Далее идет основной код программы:
cont = new( 32, 32 )
do_something_with_container( cont )
То есть, тут главное не забывать, что все контейнеры пронумерованы. И если мы пишем cont = new( 32, 32 ), то это значит, что cont - самая обычная переменная, в которой лежит число - номер контейнера. Pixilang не делает никаких различий между обычной переменной и переменной с контейнером - это одно и то же. Типа как в ассемблере, в регистре лежит число, а что это за число - знает только программист.

J3d1
Posts: 175
Joined: Wed Oct 15, 2008 4:49 am
Location: г. Абакан, Хакасия
Contact:

Re: Pixilang v3.0 rc1

Post by J3d1 » Fri Jul 01, 2011 10:57 am

Спасибо.
Еще вопрос: требуется сохранять вводимые с клавиатуры данные (количество байт заранее неизвестно). Что делать: создать контейнер "с запасом" или сделать по-другому (ведь если задаем жесткий размер контейнера, то увеличить потом нельзя, я так понимаю)

User avatar
NightRadio
Site Admin
Posts: 3118
Joined: Fri Jan 23, 2004 12:28 am
Location: Ekaterinburg. Russia
Contact:

Re: Pixilang v3.0 rc1

Post by NightRadio » Fri Jul 01, 2011 12:18 pm

Можно на лету изменять размер контейнера через resize().
Например, так

Code: Select all

cont = new( 1, 1, INT8 ) //Начальный размер - 1 байт
resize( cont, 2 ) //Увеличили размер до 2х байт (указали только ось X, размер по Y оставляем неизменным).
resize( cont, 4, 4 ) //Увеличили размер до 16 байт (4 в ширину и 4 в высоту).
Данные в контейнере остаются, после масштабирования не удаляются. А новая (пустая) область может быть заполнена любым мусором.

J3d1
Posts: 175
Joined: Wed Oct 15, 2008 4:49 am
Location: г. Абакан, Хакасия
Contact:

Re: Pixilang v3.0 rc1

Post by J3d1 » Sat Jul 02, 2011 6:13 am

Спасибо за разъяснение.
Еще вопросик: для создания простого скриптового языка для анимации делаем парсер. выборку лексем из контейнера (файла) сделать не сложно, а как лучше реализовать переходы к функции, обрабатывающей полученную лексему, ведь таких лексем и их функций будет много. Пока кроме как использовать множество операторов if ( lex == ....) {........} ничего не придумал... Может быль есть какой-то хитроумный прием организовать таблицу переходов?

J3d1
Posts: 175
Joined: Wed Oct 15, 2008 4:49 am
Location: г. Абакан, Хакасия
Contact:

Re: Pixilang v3.0 rc1

Post by J3d1 » Mon Jul 04, 2011 9:40 am

Странно, но размеры контейнеров con1 и con2 в коде ниже совпадают и равны 1.

Code: Select all

con1 = "1"
con2 = ""

ts = ""   
sprintf ( ts, "size of con1 = %d  size of con2 = %d\n", get_size ( con1 ), get_size ( con2 ) )
fputs ( ts )

J3d1
Posts: 175
Joined: Wed Oct 15, 2008 4:49 am
Location: г. Абакан, Хакасия
Contact:

Re: Pixilang v3.0 rc1

Post by J3d1 » Wed Jul 06, 2011 7:57 am

Заметил странность в работе функции line (). Пример: рисование линий длиной len = 100 под углом в angle = 45 градусов. Начиная с определенного x1 возникают "ступеньки".

Code: Select all

len = 100  //длина линии
angle = 45  //угол в градусах
rad = angle * M_PI / 180  //перевели угол в радианы
x1 = -( WINDOW_XSIZE >> 1 )  //левый край экрана
y1 = -( WINDOW_YSIZE >> 1 ) + 10  //верх экрана + 10 пикс.
while ( x1 < 86 )
{
  x2 = x1 +  len * cos ( rad )  //координаты второй точки линии
  y2 = y1 +  len * sin ( rad )
  line ( x1, y1, x2, y2, WHITE )
  x1 = x1 + 10
  frame ()
}
frame ( 10000 ) 
Image
Пробовал округлять координаты перед рисованием прибавлением к ним 0.5 - не помогает. Как рисовать правильно?
Возможно, это результат отсечения (не округления) в расчетах координат точек в самой функции line ()?

User avatar
NightRadio
Site Admin
Posts: 3118
Joined: Fri Jan 23, 2004 12:28 am
Location: Ekaterinburg. Russia
Contact:

Re: Pixilang v3.0 rc1

Post by NightRadio » Mon Jul 11, 2011 11:56 am

По поводу таблицы переходов - увы, switch case я еще не реализовал, поэтому сейчас самым быстрым способом будет именно табличка. Создаем массив M из 32-битных значений. Заполняем его ссылками на функции: M[ 0 ] = fun1 M[ 1 ] = fun2 и т.д. А далее нужную функцию вызываем прямо из массива: M[ 0 ]()

Про размеры контейнеров еще гляну, но, видимо, это нормально ) А чтобы по честному определить размер строки внутри массива, пользуемся функцией strlen().

По поводу линий. Я подозреваю, что ошибка накапливается где-то в вычислениях с плавающей точкой. Попробуй значения ( len * cos ( rad ) ) и ( len * sin ( rad ) ) заранее просчитать за телом цикла и преобразовать их в целые. Как-то так:
xx = ( len * cos ( rad ) ) div 1
yy = ( len * sin ( rad ) ) div 1
while( ......

Post Reply