Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Графическая задача (анимация)

Автор: Nike0 29.11.2009 17:42

Доброго времени суток. Прошу помочь в решении задачи. Вот условие: нужно составит программу вывода в верхнюю часть экрана изображение тучи, а в нижнюю – емкость для воды; при нажатии клавиши Enter начинает идти дождь. В то время, как идет дождь, туча начинает уменьшаться, а емкость наполняется.

Автор: Archon 29.11.2009 17:56

Окей, условие понятно. Чем помочь?

Автор: Nike0 29.11.2009 18:21

как вообще нарисовать тучу, анимацию дождя и уменьшение тучи? искал много где похожих задач, но что все неудачно

Автор: Archon 29.11.2009 21:44

С помощью стандартного модуля graph, например. В нем есть процедуры и функции для рисования линий, окружностей, дуг и так далее. Если нет учебника, вот краткое описание с примерами: http://www.rus-edu.bg/schooldoc/ftp/inf/bookinf/practice/2_8/2_8_0.html.

Попробуй написать сам, для начала, и выложи результат. Если что-то не получится, сделаем вместе.

Автор: Nike0 29.11.2009 22:15

на графику фулскрин обязательно? а то win7 стоит, даже простые шаблоны не запускает, ругается на разрешение, в турбо или фри норм будет, не знаете?

Автор: Archon 30.11.2009 0:30

Используй FreePascal, там все нормально. Качать http://www.freepascal.org/down/i386/win32-russia.var.

Автор: Nike0 2.12.2009 17:54

Program tu4ki;
uses
crt,graph;

procedure graphinterface;
var
Gd,Gm:Integer;
begin
Gd:=Detect;
InitGraph(Gd,Gm,'');
if GraphResult<>grOk then
begin
Halt(1);
end;
end;
begin
clrscr;
graphinterface;
setbkcolor(9);
arc(120,100,45,315,40);
arc(170,100,45,135,40);
arc(220,100,225,360,40);
arc(220,100,0,135,40);
arc(170,100,225,315,40);
sector(165,400,180,360,120,90);
floodfill(170,100,7);
readkey;
CloseGraph;
end.


сори что долго не писал, был занят на учебе, ну вот, написал, но во фри почему-то у меня не отображаются цвета, только черный фон и фигуры, а заливка и остальное не работает, хотя в колледже на XP с борланда все отлично... вот в чем проблема, я знаю что анимацию с помощью циклов делать надо, только не знаю КАК сделать.. если можете помогите

Автор: Lapp 2.12.2009 18:21

Не знаю, что у тебя там работало, потому что работать не особо должно было..

1. Сомневаюсь, что тебе нужен SetBkColor. Ты попробуй сначала без него, а потом подключи, если надо будет. Он работает не совсем так, как иногда хочется..

2. Устанавливай цвет в SetColor(<color>);.

3. Перед FloodFill установи SetFillStyle(SolidFill,<color>);


Добавлено через 1 мин.
и еще:

4. В FloodFill нужно указывать цвет границы, до чего заполнять (то есть твой <color>)

Добавлено через 6 мин.
То есть, примерно так:

var
CloudBorderCol,CloudCol: integer;

begin
graphinterface;
CloudBorderCol:=DarkGray;
CloudCol:=LightGray;
SetColor(CloudBorderCol);
arc(120,100,45,315,40);
arc(170,100,45,135,40);
arc(220,100,225,360,40);
arc(220,100,0,135,40);
arc(170,100,225,315,40);
sector(165,400,180,360,120,90);
SetFillStyle(SolidFill,CloudCol);
floodfill(170,100,CloudBorderCol);
readkey;
CloseGraph;
end.


Добавлено через 3 мин.
Цитата(Nike0 @ 2.12.2009 13:54) *
я знаю что анимацию с помощью циклов делать надо, только не знаю КАК сделать..
Да, в цикле. Принцип простой: рисуешь - стираешь - рисуешь - стираешь - ...
Ты поищи по форуму, много было анимации. Если что-то будет неясно - спрашивай конкретно.

Автор: Nike0 22.12.2009 16:18

решил поднять тему, принцип понял, но реализовать не могу... пробовал по-разному, но безуспешно, единственное что понятно, чтобы чтото начало двигаться, надо вместо цифр ставить параметры и в циклах их изменять и все)

Автор: Lapp 23.12.2009 15:47

Цитата(Nike0 @ 22.12.2009 12:18) *
чтобы чтото начало двигаться, надо вместо цифр ставить параметры и в циклах их изменять и все)
Хорошо. Вот тебе дождь. Этого тебе достаточно для начала?
uses
WinCRT,Graph;

const
n=40;
l1=10;
l2=20;
a=-0.2;
b=20;
SkyCol=Black;
RainCol=Cyan;

type
tRain= record
x,y,z,dx,dy: integer
end;

var
Rain: array[1..n]of tRain;
Gd,Gm,i,g: Integer;

begin
Gd:=Detect;
InitGraph(Gd,Gm,'');
if GraphResult<>grOk then Halt(1);
g:=GetMaxY-b-l2-l1;
for i:=1 to n do with Rain[i] do begin
dy:=l1+Random(l2-l1+1);
dx:=Round(dy*a);
x:=b+Random(GetMaxX-2*b);
y:=b+Random(GetMaxY-2*b)
end;
repeat
for i:=1 to n do with Rain[i] do begin
if y>g then begin
SetColor(SkyCol);
Line(x,y,x+dx,y+dy);
Line(x+dx,y+dy,x+2*dx,y+2*dy);
dy:=l1+Random(l2-l1+1);
dx:=Round(dy*a);
x:=b+Random(GetMaxX-2*b);
y:=b
end;
SetColor(SkyCol);
Line(x,y,x+dx,y+dy);
SetColor(RainCol);
Line(x+2*dx,y+2*dy,x+3*dx,y+3*dy);
Inc(x,dx);
Inc(y,dy)
end;
until KeyPressed;
while KeyPressed do ReadKey;
CloseGraph;
end.


Автор: Nike0 23.12.2009 16:47

да спасибо, можно же сделать чтобы дождь шел только в определенной области? поставить ограничения на параметры?

Автор: Lapp 23.12.2009 18:35

Цитата(Nike0 @ 23.12.2009 12:47) *
да спасибо, можно же сделать чтобы дождь шел только в определенной области? поставить ограничения на параметры?

Запросто. Параметры уже там. Разберешься, что и как ограничивать?

Автор: Nike0 23.12.2009 18:37

Цитата
Разберешься, что и как ограничивать?
тут их много очень, если не тяжело по x и у какие отвечают, я на них тогда и поставлю

Автор: Lapp 23.12.2009 20:32

Цитата(Nike0 @ 23.12.2009 14:37) *
тут их много очень, если не тяжело по x и у какие отвечают, я на них тогда и поставлю
Nike0, ты обнаглел. Ты полагаешь, я все это делал, чтоб ты сдал зачет/курсовик/т.п.? Мне плевать на твои зачеты. Я думал, ты хоть чему-то научиться хочешь. А ты не хочешь разобраться в пяти параметрах.. Если так - я буду только рад, если ты завалишь сессию - одним протирателем штанов меньше будет.

все, больше я твои мессаджи даже не читаю.
гудбай.