Здесь показаны различия между двумя версиями данной страницы.
msx:basic_programming_guide:05 [2020-05-31 11:19] |
msx:basic_programming_guide:05 [2020-06-05 19:04] |
||
---|---|---|---|
Строка 2974: | Строка 2974: | ||
__//Рис. 6//__ | __//Рис. 6//__ | ||
- | FIXME {{anchor:colorsprites}} Цветные спрайты | + | FIXME |
+ | {{anchor:colorsprites}} | ||
+ | ==== Цветные спрайты ==== | ||
В режиме ''SCREEN 4'', однако, имеются //новые// операторы для работы со спрайтами. | В режиме ''SCREEN 4'', однако, имеются //новые// операторы для работы со спрайтами. | ||
Строка 2994: | Строка 2996: | ||
где: | где: | ||
* ''COLOR'', ''SPRITE'' — служебные слова; | * ''COLOR'', ''SPRITE'' — служебные слова; | ||
- | * NS — арифметическое выражение, целая часть значения которого определяет номер сформированного в оперативной памяти спрайта; | + | * ''NS'' — арифметическое выражение, целая часть значения которого определяет номер сформированного в оперативной памяти спрайта; |
- | * A$ — строковое выражение, причём значение А$ должно содержать не более 16 символов (LEN(A$)≤16). | + | * ''A$'' — строковое выражение, причём значение А$ должно содержать не более 16 символов (''LEN(A$)''≤16). |
- | Каждый символ значения строки A$ воздействует на одну линию спрайта (или как говорят, //спрайтовую// линию). | + | Каждый символ значения строки A$ воздействует на одну линию спрайта. |
- | + | ||
- | Поэтому следует использовать 8 символов, когда образы спрайтов кодируются в 8 байтах (''SCREEN 4,0'' и ''SCREEN 4,1'') и 16 символов при кодировании образа спрайта в 32 байтах (''SCREEN 4,2'' и ''SCREEN 4,3''). | + | |
- | Этот оператор рассматривает двоичную структуру, соответствующую коду ASCII каждого символа, и действует на каждую спрайтовую линию в соответствии со значением битов, составляющих эту структуру: | + | Поэтому следует использовать: |
+ | * 8 символов, когда образы спрайтов кодируются в 8 байтах (''SCREEN 4,0'' и ''SCREEN 4,1'') | ||
+ | * 16 символов при кодировании образа спрайта в 32 байтах (''SCREEN 4,2'' и ''SCREEN 4,3''). | ||
+ | Этот оператор рассматривает двоичную структуру, соответствующую коду ASCII каждого символа, и действует на каждую линию спрайта в соответствии со значением битов, составляющих эту структуру: | ||
- <WRAP> //биты// 0, 1, 2, 3. Четыре младших бита позволяют закодировать номер палитры (0÷15), присвоенный этой линии. | - <WRAP> //биты// 0, 1, 2, 3. Четыре младших бита позволяют закодировать номер палитры (0÷15), присвоенный этой линии. | ||
- | {{anchor:e059-01}} __//Пример 1//__. Спрайт, у которого все 8 спрайтовых строк различного цвета. | + | {{anchor:e059-01}} __//Пример 1//__. Спрайт, у которого все 8 строк спрайта различного цвета. |
\\ {{.examples:059-01.bas|}} \\ [[+tab|wmsxbpge>059-01.bas]] | \\ {{.examples:059-01.bas|}} \\ [[+tab|wmsxbpge>059-01.bas]] | ||
<code> | <code> | ||
Строка 3031: | Строка 3034: | ||
</code> | </code> | ||
</WRAP> | </WRAP> | ||
- | - <WRAP> //бит// 6. Если этот бит равен 1, то пересечение спрайтовой линии спрайта с номером NS с другими спрайтами не будет обнаружено. Правило приоритета (если "накладываются" два спрайта, то спрайт с меньшим "экранным" номером перекрывает спрайт с большим "экранным" номером) более не соблюдается. Оказывается область пересечения спрайтов имеет цвет, определяемый результатом логической операции OR (ИЛИ), применённой к цветам "наложенных" спрайтов. | + | - <WRAP> //бит// 6. Если этот бит равен 1, то пересечение линии спрайта с номером NS с другими спрайтами не будет обнаружено. Правило приоритета (если "накладываются" два спрайта, то спрайт с меньшим "экранным" номером перекрывает спрайт с большим "экранным" номером) более не соблюдается. Оказывается область пересечения спрайтов имеет цвет, определяемый результатом логической операции OR (ИЛИ), применённой к цветам "наложенных" спрайтов. |
- | Более того, спрайтовые линии, отмеченные в операторе ''[[#colorsprite1|COLOR SPRITE$]]'' и не "затронутые" пересечением, исчезают! | + | Более того, линии спрайта , отмеченные в операторе ''[[#colorsprite1|COLOR SPRITE$]]'' и не "затронутые" пересечением, исчезают! |
{{anchor:e059-03}} __//Пример3//__. Пример, иллюстрирующий "работу" бита 6 спрайтовой линии. | {{anchor:e059-03}} __//Пример3//__. Пример, иллюстрирующий "работу" бита 6 спрайтовой линии. | ||
Строка 3040: | Строка 3043: | ||
NEW | NEW | ||
Ok | Ok | ||
- | 10 SCREEN 4,3 'Область пересечения спрайтов окрашена цве- | + | 10 SCREEN 4,3 'Область пересечения спрайтов окрашена цве- |
20 SPRITE$(0)=STRING$(32,255)'том с номером 11, так как 9 OR 10 = 11 | 20 SPRITE$(0)=STRING$(32,255)'том с номером 11, так как 9 OR 10 = 11 | ||
30 PUT SPRITE 0,(100,100),,0 'В спрайте 1 6-й бит установлен в единицу, | 30 PUT SPRITE 0,(100,100),,0 'В спрайте 1 6-й бит установлен в единицу, | ||
Строка 3053: | Строка 3056: | ||
- <WRAP> //бит// 7 (крайний левый). Если этот бит равен 1, то спрайтовая линия отображается на 32 точки левее координаты Х, заданной в операторе ''[[#putsprite|PUT SPRITE]]''; | - <WRAP> //бит// 7 (крайний левый). Если этот бит равен 1, то спрайтовая линия отображается на 32 точки левее координаты Х, заданной в операторе ''[[#putsprite|PUT SPRITE]]''; | ||
- | {{anchor:e059-04}} __//Пример 4//__. Сдвиг двух верхних спрайтовых линий с изменением цвета. | + | {{anchor:e059-04}} __//Пример 4//__. Сдвиг двух верхних линий спрайта с изменением цвета. |
\\ {{.examples:059-04.bas|}} \\ [[+tab|wmsxbpge>059-04.bas]] | \\ {{.examples:059-04.bas|}} \\ [[+tab|wmsxbpge>059-04.bas]] | ||
<code> | <code> | ||
Строка 3075: | Строка 3078: | ||
│ │ | │ │ | ||
сдвиг номер | сдвиг номер | ||
- | спрайтовой линии палитры | + | линии спрайта палитры |
</code> | </code> | ||
Строка 3104: | Строка 3107: | ||
│ │ | │ │ | ||
отсутствие сдвига номер | отсутствие сдвига номер | ||
- | спрайтовой линии палитры | + | линии спрайта палитры |
</code> | </code> | ||
Спрайт 0 изображается красным цветом (8), а спрайт 1 — темно–синим (7). При нажатии любой клавиши, все линии спрайта 1, находящиеся "под" спрайтом 0, сохраняются, остальные "исчезают"(цвет пересечения — //белый//, так как 7 OR 8 = 15). \\ | Спрайт 0 изображается красным цветом (8), а спрайт 1 — темно–синим (7). При нажатии любой клавиши, все линии спрайта 1, находящиеся "под" спрайтом 0, сохраняются, остальные "исчезают"(цвет пересечения — //белый//, так как 7 OR 8 = 15). \\ | ||
Строка 3123: | Строка 3126: | ||
</code> | </code> | ||
Если исправить 30–ю строку следующим образом: | Если исправить 30–ю строку следующим образом: | ||
- | 30 SC$=STRING$(4,&B11100100):T=255 | + | <WRAP group> |
+ | <WRAP half column> | ||
+ | <code> | ||
+ | 30 SC$=STRING$(4,&B11100100):T=255 | ||
+ | </code> | ||
+ | </WRAP> | ||
+ | |||
+ | <WRAP half column> | ||
+ | , | ||
+ | </WRAP> | ||
+ | </WRAP> | ||
то при столкновении двух спрайтов спрайт с меньшим "экранным" номером вначале уменьшится в два раза, а затем восстановит свои размеры. | то при столкновении двух спрайтов спрайт с меньшим "экранным" номером вначале уменьшится в два раза, а затем восстановит свои размеры. | ||
Строка 3142: | Строка 3155: | ||
</code> | </code> | ||
</WRAP> | </WRAP> | ||
- | * <WRAP>{{anchor:colorsprite}} B) Оператор ''COLOR SPRITE'' очень похож на оператор ''[[#colorsprite1|COLOR SPRITE$]]'', но действует на всех спрайтовых линиях спрайта с номером NS. | + | * <WRAP>{{anchor:colorsprite}} B) Оператор ''COLOR SPRITE'' очень похож на оператор ''[[#colorsprite1|COLOR SPRITE$]]'', но действует на всех линиях спрайта с номером NS. |
Формат оператора: | Формат оператора: | ||
<WRAP group> | <WRAP group> | ||
Строка 3199: | Строка 3212: | ||
10 COLOR 15,4:SCREEN 4:SPRITE$(0)=STRING$(8,255) | 10 COLOR 15,4:SCREEN 4:SPRITE$(0)=STRING$(8,255) | ||
30 PUT SPRITE 0,(200,100),15,0 | 30 PUT SPRITE 0,(200,100),15,0 | ||
- | 40 ON SPRITE GOSUB 100:SPRITEON' Включен режим прерываний по столкнове- | + | 40 ON SPRITE GOSUB 100:SPRITEON ' Включен режим прерываний по |
- | 55 COLOR SPRITE(0)=&B00100001' нию спрайтов! | + | 55 COLOR SPRITE(0)=&B00100001 ' столкновению спрайтов! |
60 FOR X=0 TO 240:PUT SPRITE 1,(X,100),15,0:NEXT ▲ | 60 FOR X=0 TO 240:PUT SPRITE 1,(X,100),15,0:NEXT ▲ | ||
90 GOTO 60 '──▶ │ | 90 GOTO 60 '──▶ │ | ||
Строка 3254: | Строка 3267: | ||
где: | где: | ||
* ''SET'', ''PAGE'' — служебные слова; | * ''SET'', ''PAGE'' — служебные слова; | ||
- | * M, N — арифметические выражения, целые части значения которых принадлежат отрезку [0,3]. Первый аргумент SET PAGE указывает номер отображаемой страницы, а второй — номер активной страницы. | + | * M, N — арифметические выражения, целые части значения которых принадлежат отрезку [0,3]. Первый аргумент ''SET PAGE'' указывает номер отображаемой страницы, а второй — номер активной страницы. |
{{anchor:e0510-01}} __//Пример 1//__. | {{anchor:e0510-01}} __//Пример 1//__. | ||
Строка 3262: | Строка 3275: | ||
Ok | Ok | ||
10 SCREEN 5:OPEN "GRP:" AS #1 | 10 SCREEN 5:OPEN "GRP:" AS #1 | ||
- | 30 SET PAGE 0,0:CLS:PSET(100,100):PRINT #1,"ABCD" 'Страница 0 отображается и активизируется (ситуация - по умолчанию). На страницу 0 записывается небольшой текст. | + | 30 SET PAGE 0,0:CLS:PSET(100,100):PRINT #1,"ABCD" |
- | 50 FOR I=1 TO 1000:NEXT:SET PAGE 1,1:CLS 'Страница 1 отображается и активизируется; рисуются 8 линий. | + | 'Страница 0 отображается и активизируется (ситуация - по умолчанию). |
+ | На страницу 0 записывается небольшой текст. | ||
+ | 50 FOR I=1 TO 1000:NEXT:SET PAGE 1,1:CLS | ||
+ | 'Страница 1 отображается и активизируется; рисуются 8 линий. | ||
60 FOR I=0 TO 7:FOR J=0 TO 127 | 60 FOR I=0 TO 7:FOR J=0 TO 127 | ||
70 PSET(2*J,I+108),I+2:PSET STEP(1,0),I+3:NEXTJ,I: P=1 | 70 PSET(2*J,I+108),I+2:PSET STEP(1,0),I+3:NEXTJ,I: P=1 | ||
- | 90 IF INKEY$="" THEN 90 ' Ожидание нажатия клавиши! Если клавиша нажата,то номер (P) отображенной страницы изменяется оператором XOR | + | 90 IF INKEY$="" THEN 90 |
+ | ' Ожидание нажатия клавиши! Если клавиша нажата, | ||
+ | то номер (P) отображенной страницы изменяется оператором XOR | ||
100 P=P XOR 1:SET PAGE P,P 'Листание страниц! | 100 P=P XOR 1:SET PAGE P,P 'Листание страниц! | ||
120 GOTO 90 '──▶ | 120 GOTO 90 '──▶ |