Студопедия
rus | ua | other

Home Random lecture






Создание движущихся изображений.


Date: 2015-10-07; view: 334.


Как нарисовать графический объект вам уже понятно. Но как заставить его двигаться?

Очень просто!
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


<== previous lecture | next lecture ==>
Графический режим работы. | Работа с файлами.
lektsiopedia.org - 2013 год. | Page generation: 0.003 s.