Помогите новичку

Applications development, KoOS API questions
  • I confirm that current issue causes only in case when these two libraries are included simultaniously.
    Accurate the problem and confirm it or not can only kernel-guys.

    Hmm... Could anyone check in FASM does the app that uses http.obj and libini.jbj crashes?
    Из хаоса в космос
  • I suggest to read and continue the discussion in this topic then: viewtopic.php?f=24&t=2063
    "Any intelligent fool can make things bigger, more complex, and more violent. It takes a touch of genius -- and a lot of courage -- to move in the opposite direction." Albert Einstein
  • Итак, мне нужен алгоритм смешивания цветов.
    Тут https://toster.ru/q/19490 нашел следующий R= R1*a + R2*(1-a)

    Написал прогу:
    Spoiler:

    Code: Select all

    #define MEMSIZE 4096*4
    
    #include "../lib/kolibri.h"
    
    void main()
    {
    	loop() switch(WaitEvent())
    	{
    		case evButton: 
    		ExitProcess();
    		case evReDraw: 
    		DrawWindow();
    	}
    }
    
    void DrawWindow() 
    {
    	int i;
    	dword col;
    	DefineAndDrawWindow(215,100,350,200,0x34,0xFFFFFF,"Mix colors");
    	for (i=0; i<=10; i++) {
    		col = DrawMixedColor(0xFFFfff, 0x000000, i);
    		DrawBar(20*i+10,10,20,80,col);
    	}
    }
    
    unsigned DrawMixedColor(dword _base, _overlying, _alpha) 
    {
    	// R= R1*a + R2*(1-a)
    	unsigned r1, r2;
    	r1 = _base / 10 * _alpha;
    	r2 = _overlying / 10;
    	return 10 - _alpha * r2 + r1;
    }
    Результат:
    Screenshot_1.png
    Screenshot_1.png (8.57 KiB)
    Viewed 15462 times
    Почему не градиент с белого в черный?
    Из хаоса в космос
  • Нужно смешивать не весь цвет, а каждую составляющую.
    Если поделить #FFFFFF на 10 и умножить на 5 будет 0xFFFFFF/10*5 = 16777215/10*5 = 8388605 = 0x7FFFFD. Если считать целочисленно.
    Нужно же найти r1_red, r1_blue, r1_green и r2_red, r2_blue, r2_green, смешать их и потом склеить.

    А float в C-- нету? Тогда лучше использовать для прозрачности один байт, то есть от 0 до 255, а не от 0 до 10.

    Code: Select all

    unsigned DrawMixedColor(dword _base, _overlying, byte _alpha) {
       byte b1 = byte(_base & 0xFF); _base >>= 8;
       byte g1 = byte(_base & 0xFF); _base >>= 8;
       byte r1 = byte(_base & 0xFF);
       byte b2 = byte(_overlying & 0xFF); _overlying >>= 8;
       byte g2 = byte(_overlying & 0xFF); _overlying >>= 8;
       byte r2 = byte(_overlying & 0xFF);
    
       byte n_a = 255 - a;
    
       byte r = r1*a/255 + r2*n_a/255;
       byte g = g1*a/255 + g2*n_a/255;
       byte b = b1*a/255 + b2*n_a/255;
       return dword(r)<<16 + dword(g)<<8 + dword(b);
    }
    
  • Перемога, спасибо. Флоат есть, но я не очень хорошо знаю как с ним работать.
    Attachments
    Screenshot_1.png
    Screenshot_1.png (19.24 KiB)
    Viewed 15435 times
    Из хаоса в космос
  • В чем отличие 68.27 от обычного чтения файла, кроме автоматической распаковки файла?
    to infinity and beyond
  • 1. 68.27 сама резервирует память для данных, 70-й функции нужно указывать, куда считывать данные
    2. 68.27 не загрузит файлы размером более 16 Мбайт
    3. 68.27 читает файл целиком, а 70-я может считать определённую часть - с указанного места и нужного размера
    Т.к. из 68.27 вызываются подфункции 70-й функции (определение размера и считывание), то для 68.27 также должны работать относительные пути.
  • Самое главное - 68.27 автоматически распаковывает файл, сжатый kpack. Это очень удобно при загрузке ресурсов.
  • Я пробую свои силы в портировании и попытался портировать демку http://codentronix.com/projects/html5/3 ... field.html
    Результат в аттаче, вот только он работает не так, как хотелось бы.
    В чем ошибка?
    Spoiler:

    Code: Select all

    #define MEMSIZE 4096*100
    
    #include "../lib/io.h"
    #include "../lib/gui.h"
    #include "../lib/math.h"
    #include "../lib/random.h"
    #include "../lib/draw_buf.h"
    
    proc_info Form;
    
    DrawBufer canvas;
    
    void main()
    {
    	initStars();
    	loop() {
    		WaitEventTimeout(1);
    		switch(EAX & 0xFF)
    		{
    			case evButton:
    				ExitProcess();
    				break;
    			case evReDraw:
    				DefineAndDrawWindow(215,100,500+9,400+skin_height+4,0x73,0xFFFFFF,"Window header");
    				GetProcessInfo(#Form, SelfInfo);
    				canvas.zoom = 1;
    				canvas.Init(0, 0, Form.cwidth, Form.cheight);
    				break;
    			default:
    				if (buf_data) drawStars();
    		}
    	}
    }
    
    #define MAX_DEPTH 32;
    #define STARS_COUNT 512
    
    struct star
    {
    	int x;
    	int y;
    	float z;
    } stars[STARS_COUNT];
    
    int randomRange(int minVal,maxVal) {
    	float rand;
    	rand = random(100)/100;
    	return math.floor( maxVal - minVal - 1 * rand ) + minVal;
    }
    
    void initStars() {
    	int i;
    	for( i = 0; i < STARS_COUNT; i++ ) {
    		stars[i].x = randomRange(-25,25);
    		stars[i].y = randomRange(-25,25);
    		stars[i].z = randomRange(1,MAX_DEPTH);
    	}
    }
    
    void drawStars() {
    	float k;
    	float temp;
    	int i, shade, px, py, size;
    	int halfWidth  = Form.cwidth / 2;
    	int halfHeight = Form.cheight / 2;
    	dword color;
    
    	canvas.Fill(0);
    
    	for( i = 0; i < STARS_COUNT; i++ ) 
    	{
    		stars[i].z -= 0.2;
    
    		if( stars[i].z <= 0 ) {
    			stars[i].x = randomRange(-25,25);
    			stars[i].y = randomRange(-25,25);
    			stars[i].z = MAX_DEPTH;
    		}
    
    		k  = 128.0 / stars[i].z;
    		px = math.ceil(stars[i].x * k + halfWidth);
    		py = math.ceil(stars[i].y * k + halfHeight);
    
    		if( (px >= 0) && (px + 5 <= Form.cwidth) && (py >= 0) && (py + 5 <= Form.cheight) ) {
    			temp = stars[i].z / 32.0;
    			size = math.ceil(1 - temp * 5);
    			shade = math.ceil(1 - stars[i].z * 255 / 32);
    			color = calc(shade << 16) + calc(shade << 8) + shade;
    			canvas.DrawBar(px, py, size, size, color);
    		}
    	}
    	canvas.Show();
    }
    
    /*
    
    ///!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!ORIGINAL CODE BELOW!!!!!!!!!!/////////////////////////
    
        MAX_DEPTH = 32;
        
        var canvas, ctx;
        var stars = new Array(512);
        
        window.onload = function() {
          canvas = document.getElementById("tutorial");
          if( canvas && canvas.getContext ) {
            ctx = canvas.getContext("2d");
            initStars();
            setInterval(loop,33);
           }
        }
    
        // Returns a random number in the range [minVal,maxVal] 
        function randomRange(minVal,maxVal) {
          return Math.floor(Math.random() * (maxVal - minVal - 1)) + minVal;
        }
    
        function initStars() {
          for( var i = 0; i < stars.length; i++ ) {
            stars[i] = {
              x: randomRange(-25,25),
              y: randomRange(-25,25),
              z: randomRange(1,MAX_DEPTH)
             }
          }
        }
    
        function loop() {
          var halfWidth  = canvas.width / 2;
          var halfHeight = canvas.height / 2;
          
          ctx.fillStyle = "rgb(0,0,0)";
          ctx.fillRect(0,0,canvas.width,canvas.height);
    
          for( var i = 0; i < stars.length; i++ ) {
            stars[i].z -= 0.2;
    
            if( stars[i].z <= 0 ) {
              stars[i].x = randomRange(-25,25);
              stars[i].y = randomRange(-25,25);
              stars[i].z = MAX_DEPTH;
            }
    
            var k  = 128.0 / stars[i].z;
            var px = stars[i].x * k + halfWidth;
            var py = stars[i].y * k + halfHeight;
    
            if( px >= 0 && px <= 500 && py >= 0 && py <= 400 ) {
              var size = (1 - stars[i].z / 32.0) * 5;
              var shade = parseInt((1 - stars[i].z / 32.0) * 255);
              ctx.fillStyle = "rgb(" + shade + "," + shade + "," + shade + ")";
              ctx.fillRect(px,py,size,size);
            }
          }
        }
      
     */
    11111.gif
    11111.gif (202.78 KiB)
    Viewed 12981 times
    Attachments
    space.zip (3.36 KiB)
    Downloaded 343 times
    Из хаоса в космос
  • Leency, а вот, например, у тебя там

    Code: Select all

             shade = math.ceil(1 - stars[i].z * 255 / 32);
    но shade объявлена как int

    Code: Select all

    int i, shade, px, py, size;
    Вообще, трудно сказать, как с-- работает, если в выражении используются смешанные типы(int и float).

    Я заметил

    Code: Select all

    #include "../lib/math.h"
    Интересно просто стало.

    Code: Select all

            float cos(float x);
            float sin(float x);
            float sqrt(float x);
            float tan(float x);
            float abs(float x);
    А вот из документации к с--:
    Spoiler:
    11.14 Встроенные в компилятор процедуры.


    Для некоторых процедур Вы не найдете их исходные тексты в библиотеках
    компилятора. Код этих процедур генерирует компилятор. Вот список этих
    процедур:

    ABORT Прекращение выполнения программы
    atan Вычислить арктангенс числа
    atan2 Вычислить арктангенс числа
    ATEXIT Зарегистрировать функцию выполняющуюся при выходе.
    cos Возвращает косинус угла
    EXIT Закончить программу с кодом ошибки
    exp Возвращает экспоненту числа
    inp/inportb Считать один байт из порта
    inport Считать слово из порта
    inportd Считать двойное слово из порта
    fabs Возвращает абсолютное значение числа
    log Вычисляет натуральный логарифм числа
    log10 Вычисляет десятичный логарифм числа
    outp/outportb Записать один байт в порт
    outport Записать слово в порт
    outportd Записать двойное слово в порт
    sin Возвращает синус угла
    sqrt Извлечь квадратный корень через FPU.
    tan Возвращает тангенс угла
    Похоже, что товарищ велосипедист, снова изобрёл очередной велосипед :mrgreen:
  • Ошибаешься, math.h писал не я.

    В оригинальном коде var shade = parseInt((1 - stars.z / 32.0) * 255);
    У меня переменная int shade. Что здесь не верного?
    Да и вообще, shade - это просто цвет, с ним проблем нет.
    Из хаоса в космос
  • Ну может тогда с random что-то не так. Или где-то происходит ненужное преобразование float в целое. Тебя не устраивает, что звёзды на других местах?
    Ошибаешься, math.h писал не я.
    Так я и не про тебя же :) На svn написано, кто автор кода. Просто он уже не в первый раз велосипед изобретает :lol:
  • Я его побеждат.
    Attachments
    starfield.zip (4.02 KiB)
    Downloaded 328 times
    starfield_final.gif
    starfield_final.gif (741.06 KiB)
    Viewed 12938 times
    Из хаоса в космос
  • Leency, молодец, прикольно :)

    Там, кстати, на сайте есть ещё picolzo, его тоже не трудно портировать, по крайней мере, оно у меня запускалось в PELoad
    http://www.c--sphinx.narod.ru/FILES/picolzo.zip
  • Who is online

    Users browsing this forum: No registered users and 3 guests