Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
I_semestr.doc
Скачиваний:
8
Добавлен:
23.09.2019
Размер:
356.35 Кб
Скачать

Глава 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);

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]