
- •1.2. Правила записи программ на языке с
- •1.3 Правила формального описания синтаксиса языка программирования
- •1.5.3. Описание данных в языке с
- •1.5.4 Правила записи констант различных типов
- •1.5.5. Символьные строки
- •Глава 2. Понятие функции
- •2.1. Стандартная функция printf
- •2.2. Стандартная функция scanf
- •Перед каждым аргументом, не являющимся строкой (адресом) ставится знак & и трактуется как вычисление адреса.
- •2.3. Стандартные математические функции
- •2.4. Простейшие функции, определяемые программистом
- •3.5. Дополнительные арифметические операции
- •3.6. Дополнительные операции присваивания
- •3.7. Битовые операции
- •3.8. Операторы отношения
- •Глава 4. Структурное программирование и язык с
- •4.2. Операторы языка с
- •4.3. Оператор цикла while
- •4.4. Оператор цикла do – while (цикл с постусловием)
- •4.5. Условный оператор и условная операция
- •4.6. Оператор цикла for (цикл с известным числом повторений)
- •4.7. Запись алгоритмов при помощи диаграмм Несси-Шнейдермана
- •4.8. Оператор прерывания цикла
- •4.9. Оператор продолжения цикла (continue)
- •4.10. Множественный выбор
- •Глава 5. Типовые приемы в программировании
- •5.1. Использование счетчиков
- •5.2. Вычисление суммы и произведения.
- •5.3. Вычисление минимума и максимума последовательностей.
- •5.4. Использование флагов
- •Глава 6. Простейшая графика
- •6.1.Графические режимы
- •6.2. Идеология bgi и WinBgi
- •6.3.Основные графические функции
- •6.3.1. Управление графическими режимами
- •6.3.2. Графические примитивы
- •6.3.3. Установки и их проверка
- •6.3.4. Работа с текстом
- •Глава 7. Модульное программирование
- •7.2. Библиотеки функций
- •Глава 8. Массивы
- •8.1. Описание массива
- •8.2. Ввод – вывод массивов
- •8.3. Инициализация массива
- •8.6. Двумерные массивы
- •8.6.1. Инициализация двумерного массива
- •8.7. Многомерные массивы
- •Глава 9. Работа с файлами
- •9.1. Открытие и закрытие файлов
- •Глава 10. Структуры языка с
- •10.1. Описание структур
- •10.2. Трактовка имени структуры
- •10.2.1. Доступ к полям структуры
- •10.3. Инициализация структур
- •10.4. Структуры и функции
- •10.5. Поля бит в структурах
- •10.6. Объединение
- •Глава 11. Дополнительные сведения о функциях
- •11.1. Области видимости.
- •Глава 12. Анимация
- •Глава 13. Рекурсия
- •13.1. Понятие рекурсии
- •13.2. Вычисление факториала
- •13.3. Числа Фибоначчи
- •13.4. Замена итерационных алгоритмов рекурсивными
- •13.5. Применение рекурсии в графике
Глава 12. Анимация
В случае обработки нескольких однотипных объектов можно создать массив таких объектов и обрабатывать поэлементно в цикле. Каждый объект можно представить экземпляром структуры. В качестве примера рассмотрим программу, отображающую несколько движущихся шариков. Для удобства, сцену будем загружать из файла. Сцена – совокупность всех объектов.
//main.cpp
#include <stdio.h>
#include <graphics.h>
#include “animation.h”
int main()
{
Scene sc;
LoadScene(&sc,”initial.scn”);
initwindow(scwidth,scheigth,”Animation example”);
int dt=10;
DrowScene(&sc);
while(1)
{
CalculateScene(&sc,dt/500.0);
DrowScene(&sc);
delay(10);
if(kbheat)//если клавиша нажата
break;
}
closegraph();
return 0;
}
//animation.h
#ifndef ANIMATION_H
#define ANIMATION_H
struct Ball
{
double x;//координата x шарика
double y;//координата y шарика
double r;//радиус
double vx;
double vy;//компоненты скорости
double color1,color2;//цвет1 и цвет2
int type;//тип шарика
};
//StructScene
{
//общие параметры
int bgcolor;//цвет фона
int width;
int height; //ширина и высота сцены
double g;//гравитационный компонент ускорения свободн паден
double k;//коэффициент трения
//объекты на сцене
int ballcount;//количество шариков
int balls[100];//массив шариков
};
//функции, доступные пользователю
int LoadScene(Scene *s, char fname[]);
void DrowScene(Scene *s);
void CalculateScene(Scene *s, double dt);
Ball ReadBall(FILE *f);
void DrowBall(Ball b);
void MoveBall(Ball *b, double dt);
void TrueMoveBall(Scene &sc, Ball *b, double dt);
void CalcGravity(Scene &sc, Ball *b, double dt);
ifendif
//animation.cpp
#include <stdio.h>
#include <graphics.h>
#include “animation.h”
static int BallColors[]= {RGB(0,0,0),RGB(255,0,0),RGB(0,255,0),RGB(0,0,255);
int LoadScene(Scene &sc, char fname[])
{
int i;
s->ballcount=-1;//признак ошибки
FILE *f=fopen(fname,”rt”)
if(f)
{
fscanf(f,”%d%d%%d%lf%lf”,&s->bgcolor,&s->width,&s->heihth,&s->g,&s->k,&s->ballcount);
for(i=0;i<s->ballcount;i++);
{
s->Balls[i]=ReadBall(f);
ifeof(f)
f->ballcount=-1;
return 1;
}
}
return 0;
fclose(f);
}
void DrawScene(Scene *sc)
{
setbkcolor(sc->bgcolor);
cleardevice();
for(int i=0;i<sc->ballcount;i++)
DrawBall(sc->balls[i]);
}
void CalculateScene(Scene *sc)
{
for(int i=0;i<sc->ballcount;i++)
{
Gravity(sc,sc->balls[i],dt);
TrueMoveBall(sc,sc->balls[i],dt);
}
}
Ball ReadBall(FILE *f)
{
Ball b;
fscanf(f,”%lf%lf%lf%lf%lf%d%d%d”,&b.x,&b.y,&b.r,&&b.wx,&b.wy,&b.color1,&b.color2,&b.type);
return b;
}
void DrawBall(ball.b)
{
if(b.type==1)
DrawBall1(b);
else
DrawBall2(b);
}
static void DrawBall1(Ball.b)
{
setcolor(BallColors[b.color1]);
setlinestyle(SOLIDLINE,1,4);
setfillstyle(SOLIDFILL,BallColors[b.color2]);
fillellipse(b.x,b.y,b.r,b.r);
}
static void DrawBall2(Ball.b)
{
setcolor(BallColors[b.color2]);
setlinestyle(SOLIDLINE,1,4);
setfillstyle(SOLIDFILL,BallColors[b.color1]);
fillellipse(b.x,b.y,b.r,b.r);
}