Теория: 1. Запоминаем картинку "как есть". 2. Делаем два вспомогательных экземпляра, с помощью которых и будет происходить движение. * Первый экземпляр - картинка в белом цвете (все биты = 1111) (Черный цвет - прозрачен). * Второй экземпляр - картинка с трансформированными цветами color = (NOT color) AND 15 3. Движение выполняется по стадиям: - Запоминаем фон - Накладываем белый спрайт операцией OR - Накладываем трансформированный спрайт операцией XOR - Делаем паузу - Восстанавливаем фон Пример: SCREEN 12 ' Colors FOR x = 0 TO 640 STEP 40 LINE (x, 50)-(x + 40, 479), x \ 40, BF NEXT ' Sprite col = 10 DIM a(100), B(100), c(100) LINE (0, 0)-(9, 9), (NOT col) AND 15, B LINE (0, 10)-(9, 19), 15, B GET (0, 0)-(9, 9), a GET (0, 10)-(9, 19), B a$ = INPUT$(1) x = 0 dx = 1 DO GET (x, 200)-(x + 9, 209), c PUT (x, 200), B, OR PUT (x, 200), a, XOR MakePause 4 PUT (x, 200), c, PSET IF x + dx < 0 OR x + dx > 610 THEN dx = -dx x = x + dx LOOP WHILE INKEY$ = "" SCREEN 0 END DEFINT A-Z '///////////////////////////////////////////////////////////////////// ' Эта процедура делает задержку. [Tic = 1/10 тика (Тик = 18.2 сек)] '///////////////////////////////////////////////////////////////////// SUB MakePause (Tic) FOR n = 1 TO Tic SOUND 32767, .1 NEXT END SUB И еще один пример на стареньком C++ // Движение спрайта #include "setgrmode.inc" #include <dos.h> int main() { // Делаем фон for(int x=100,c=0;c<=15;c++,x+=20) { setfillstyle(SOLID_FILL,c); bar(x,0,x+20,479); } //Рисуем картинку 20x20 for(x=0,c=1;x<20;x+=2,c++) { setfillstyle(SOLID_FILL,c); bar(x,0,x+2,19); } setfillstyle(SOLID_FILL,0); bar(5,5,15,15); // Делаем вспомогательную картинку для спрайта // МАСКА ЭКРАНА (должна быть черно белой) for(int y=0;y<20;y++) for(x=0;x<20;x++) putpixel(x,y+20,(getpixel(x,y)==0?15:0)); // Запоминаем две картинки char p1[1000],p2[1000],p3[1000]; getimage(0,0,19,19,p1); getimage(0,20,19,39,p2); int d=getch(); // Начинаем движение for(x=70;x<600;x++) { //Запоминаем фон getimage(x,100,x+19,119,p3); // Создаем спрайт с прозрачным черным цветом!!! // Для этого операцией AND кладем маску экрана // а потом операцией XOR восстанавливаем спрайт putimage(x,100,p2,AND_PUT); putimage(x,100,p1,XOR_PUT); delay(100); // Восстанавливаем фон putimage(x,100,p3,COPY_PUT); if (kbhit()) break; } closegraph(); return 0; }
Справочник алгоритмов v0.05 © 2007-2025 Igor Salnikov aka SunDoctor