|
Начало » Конспекты школьника » Часть 1 » [Учимся программировать][Создание движущихся изображений]
Учимся программировать!
Конспекты школьника.
Создание движущихся
изображений.
Как нарисовать графический объект вам уже
понятно. Но как заставить его двигаться?
Очень просто!
1. Рисуем объект цветом отличным от цвета
фона.
2. Рисуем объект цветом
фона.
3. Изменяем координаты.
4. Повторяем 1-3 столько раз сколько
потребуется.
Пример 1: Движущийся круг.
REM Движущийся круг
SCREEN 1
x = 1
y = 1
REM цвет фона - 0(черный), цвет рисунка - 1
FOR i = 1 TO 150
REM Рисуем объект цветом отличным от цвета
фона.
c = 1
CIRCLE (x, y), 2, c
REM задержка
FOR j = 1 TO 250000
NEXT j
REM Рисуем объект цветом цветом
фона.
c = 0
CIRCLE (x, y), 2, c
REM Изменяем координаты
x = x + 2
y = y + 1
NEXT i
END
Для того чтобы глаз мог зафиксировать
нарисованное изображение используем
пустой цикл:
REM задержка
FOR j = 1 TO 250000
NEXT j
Пример 2: Усложним траекторию движения.
Пусть шарик прыгает по поверхности, а
когда поверхность закончится - упадет вниз.
REM Прыгающий шарик
SCREEN 1
x = 1
y = 100
REM поверхность
LINE (0, y + 20)-(220, y + 20)
FOR i = 1 TO 140
c = 1
CIRCLE (x, y), 2, c
PAINT (x, y), c, c
FOR j = 1 TO 250000
NEXT j
c = 0
CIRCLE (x, y), 2, c
PAINT (x, y), c, c
x = x + 2
IF i < 115 THEN
y = y + 10 * COS(.5 * i)
ELSE
y = y + 4
SOUND 200, 1
END IF
NEXT i
LOCATE 10, 15: PRINT "GAME OVER :)"
END
Пример 3: Шарик, заключенный в
прямоугольную область. При касании границ
отскакивает обратно.
REM Шарик, заключенный в прямоугольную область
SCREEN 1
REM Границы области
xx1 = 1
xx2 = 200
yy1 = 1
yy2 = 150
LINE (xx1, yy1)-(xx1, yy2)
LINE (xx2, yy1)-(xx2, yy2)
LINE (xx1, yy1)-(xx2, yy1)
LINE (xx1, yy2)-(xx2, yy2)
REM Начальные координаты и скорость шарика
x = RND * (xx1 + (xx2 - xx1) / 2)
y = RND * (yy1 + (yy2 - yy1) / 2)
vx = RND * 20 - 10
vy = RND * 20 - 10
CIRCLE (x, y), 2, c
PAINT (x, y), c, c
REM Движение шарика, до тех пор пока не нажмем любую клавишу
DO
c = 1
CIRCLE (x, y), 2, c
PAINT (x, y), c, c
FOR j = 1 TO 150000
NEXT j
c = 0
CIRCLE (x, y), 2, c
PAINT (x, y), c, c
IF x < (xx1 + 5) OR x > (xx2 - 5) THEN vx = -vx
IF y < (yy1 + 6) OR y > (yy2 - 7) THEN vy = -vy
x = x + vx
y = y + vy
LOOP WHILE INKEY$ = ""
LOCATE 10, 15: PRINT "GAME OVER :)"
END
LOCATE - перемещает курсор на экране в
указанную позицию.
Пример 4: Идущие часы (входит в состав примеров
QBasic 4.5).
' *** DRAW_EX.BAS ***
'
' Объявление процедуры.
DECLARE SUB Face (Min$)
'
' Установка графического режима 640 x 200
SCREEN 2
DO
CLS
' Получаем строковое значение количества минут
Min$ = MID$(TIME$,4,2)
' Рисуем изображение часов
Face Min$
' Ждем пока не изменится минута или пока не будет нажата клавиша
DO
' Печатаем время вверху экрана
LOCATE 2,37
PRINT TIME$
' Проверяем нажатие клавиши
Test$ = INKEY$
LOOP WHILE Min$ = MID$(TIME$,4,2) AND Test$ = ""
' Конец программы если нажата клавиша
LOOP WHILE Test$ = ""
END
'
' Процедура рисования часов
SUB Face (Min$) STATIC
LOCATE 23,30
PRINT "Press any key to end"
CIRCLE (320,100),175
' Преобразовываем строку в число
Hr = VAL(TIME$)
Min = VAL(Min$)
' Преобразовываем число в угол
Little = 360 - (30 * Hr + Min/2)
Big = 360 - (6*Min)
' Рисуем стрелки
DRAW "TA=" + VARPTR$(Little) + "NU40"
DRAW "TA=" + VARPTR$(Big) + "NU70"
END SUB
INKEY$ считывает символ с клавиатуры.
Пример:
PRINT "Для выхода нажмите Esc..."
DO
LOOP UNTIL INKEY$ = CHR$(27) '27 - это ASCII код
для клавиши Esc.
- INKEY$ возвращает нулевую строку символов, если нет символа для
возврата.
- Для стандартных клавиш INKEY$ возвращает 1-байтовую строку символов,
содержащую считанный символ.
- Для расширенных клавиш INKEY$ возвращает 2-байтовую строку символов,
состоящую из символа нуля (ASCII 0) и скан-кода клавиатуры.
Несложно осуществить не просто движение
объекта, а управляемое движение.
Пример 5: Художник (входит в состав примеров
QBasic). Управление художников клавишами со
стрелками.
' Значение для клавиш управления и пробела:
CONST UP = 72, DOWN = 80, LFT = 75, RGHT = 77
CONST UPLFT = 71, UPRGHT = 73, DOWNLFT = 79, DOWNRGHT = 81
CONST SPACEBAR = " "
' Null$ это первый байт(символ) 2-байтовой строки символов
' для расширенных клавиш (таких, например, как ВВЕРХ и ВНИЗ)
' значение которой возвращает INKEY$
Null$ = CHR$(0)
' Plot$ = "" рисование линий; Plot$ = "B" только перемещение
' Перемещаемся, но не рисуем линии:
Plot$ = ""
PRINT "Use the cursor movement keys to draw lines."
PRINT "Press the spacebar to toggle line drawing on and off."
PRINT "Press <ENTER> to begin. Press q to end the program."
' ждем нажатие клавиши для начала рисования
DO: LOOP WHILE INKEY$ = ""
SCREEN 1
CLS
DO
SELECT CASE KeyVal$
CASE Null$ + CHR$(UP)
DRAW Plot$ + "C1 U2"
CASE Null$ + CHR$(DOWN)
DRAW Plot$ + "C1 D2"
CASE Null$ + CHR$(LFT)
DRAW Plot$ + "C2 L2"
CASE Null$ + CHR$(RGHT)
DRAW Plot$ + "C2 R2"
CASE Null$ + CHR$(UPLFT)
DRAW Plot$ + "C3 H2"
CASE Null$ + CHR$(UPRGHT)
DRAW Plot$ + "C3 E2"
CASE Null$ + CHR$(DOWNLFT)
DRAW Plot$ + "C3 G2"
CASE Null$ + CHR$(DOWNRGHT)
DRAW Plot$ + "C3 F2"
CASE SPACEBAR
IF Plot$ = "" THEN Plot$ = "B " ELSE Plot$ = ""
CASE ELSE
' Пользователь нажал какую-то из клавиш,
' кроме клавиш управления (вверх, вниз, вправо, влево, пробел, выход(q))
' так что ничего не делаем
END SELECT
KeyVal$ = INKEY$
LOOP UNTIL KeyVal$ = "q"
END
предыдущий урок
:: содержание :: следующий
урок
|
|
|
|