Инструменты пользователя

Инструменты сайта


msx:basic_programming_guide:05

Различия

Здесь показаны различия между двумя версиями данной страницы.

Ссылка на это сравнение

msx:basic_programming_guide:05 [2020-04-01 14:23]
msx:basic_programming_guide:05 [2020-06-05 19:04]
Строка 2412: Строка 2412:
 20 A$="​Мы":​B$="​изучаем":​C$="​язык":​D$="​MSX BASIC" 20 A$="​Мы":​B$="​изучаем":​C$="​язык":​D$="​MSX BASIC"
 30 SPRITE$(1)=A$:​SPRITE$(2)=B$:​SPRITE$(3)=C$:​SPRITE$(4)=D$ 30 SPRITE$(1)=A$:​SPRITE$(2)=B$:​SPRITE$(3)=C$:​SPRITE$(4)=D$
-40 FOR I=1 TO 4:PUT SPRITE 2,​(90,​90),​11,​I'​Обратите внимание на то, что номер спрайта изменяется в цикле, а "​экранный"​ номер постоянен!+40 FOR I=1 TO 4:PUT SPRITE 2,​(90,​90),​11,​I 
 +  ​'​Обратите внимание на то, что номер спрайта изменяется ​ 
 +  ​в цикле, а "​экранный"​ номер постоянен!
 50 FOR U=1 TO 200:​NEXT:​NEXT:​GOTO 40 50 FOR U=1 TO 200:​NEXT:​NEXT:​GOTO 40
 </​code>​ </​code>​
Строка 2972: Строка 2974:
 __//Рис. 6//__ __//Рис. 6//__
  
-FIXME {{anchor:​colorsprites}} Цветные спрайты+FIXME 
 +{{anchor:​colorsprites}} 
 +==== Цветные спрайты ​====
  
 В режиме ''​SCREEN 4'',​ однако,​ имеются //​новые//​ операторы для работы со спрайтами. В режиме ''​SCREEN 4'',​ однако,​ имеются //​новые//​ операторы для работы со спрайтами.
Строка 2992: Строка 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>​
Строка 3029: Строка 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 спрайтовой линии.
Строка 3038: Строка 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-й бит установлен в единицу,​
Строка 3051: Строка 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>​
Строка 3073: Строка 3078:
         │               │         │               │
       сдвиг ​          ​номер       сдвиг ​          ​номер
-спрайтовой линии ​    палитры+  линии ​спрайта      ​палитры
  
 </​code>​ </​code>​
Строка 3102: Строка 3107:
         │               │         │               │
 отсутствие сдвига ​     номер отсутствие сдвига ​     номер
-спрайтовой линии ​     ​палитры+  линии ​спрайта       палитры
 </​code>​ </​code>​
 Спрайт 0 изображается красным цветом (8), а спрайт 1 — темно–синим (7). При нажатии любой клавиши,​ все линии спрайта 1, находящиеся "​под"​ спрайтом 0, сохраняются,​ остальные "​исчезают"​(цвет пересечения — //​белый//,​ так как 7 OR 8 = 15). \\ Спрайт 0 изображается красным цветом (8), а спрайт 1 — темно–синим (7). При нажатии любой клавиши,​ все линии спрайта 1, находящиеся "​под"​ спрайтом 0, сохраняются,​ остальные "​исчезают"​(цвет пересечения — //​белый//,​ так как 7 OR 8 = 15). \\
Строка 3121: Строка 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>​
 то при столкновении двух спрайтов спрайт с меньшим "​экранным"​ номером вначале уменьшится в два раза, а затем восстановит свои размеры. то при столкновении двух спрайтов спрайт с меньшим "​экранным"​ номером вначале уменьшится в два раза, а затем восстановит свои размеры.
  
Строка 3140: Строка 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>
Строка 3197: Строка 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 '​──▶ ​                                  │
Строка 3252: Строка 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//__.
Строка 3260: Строка 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 '​──▶
msx/basic_programming_guide/05.txt · Последние изменения: 2022-09-09 23:26 (внешнее изменение)