Помощь - Поиск - Пользователи - Календарь
Полная версия: Обеспечить движение качелей
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Svetka
Код

setfillstyle(9,blue);
bar(0,0,640,75);
setcolor(14);
circle(45,40,30);
setfillstyle(1,14);
floodfill(45,40,14);
setcolor(6);
setlinestyle(0,brown,3);
line(220,100,380,100);
line(220,300,220,100);
line(380,300,380,100);
line(260,250,260,100);
line(340,250,340,100);
setfillstyle(1,darkgray);
bar(250,250,350,260);
setfillstyle(1,green);
Bar(0,300,640,360);

вот сами качели...помогите обеспечить движение качелей!! очень надо smile.gif
Altair
Для движения, рисуем качели (это у вас реализованно), ждем пока пользователь их увидит (delay) и закрашиваем цветом фона .
Все повторяем.

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

Цитата
repeat
draw (color);
delay(time);
draw(0);
run; {передвигаем качели}
until {условиевыхода, напрмиер keypressed}


добавил позже:
я не подумал, качели ведь наклоняются когда двигаются smile.gif....
То есть рисунок еще поворачивать надо ...
Svetka
а как это сделать? я вообще не понимаю как можно обеспечить движение качелей sad.gif
hiv
Все просто: смещение качелей по координате X=sin(t), по координате Y=1-cos(sin(t)). Не забыть еще что Y вниз идет при рисовании.
Код

program kach;
uses Crt,Graph;

procedure DrawFon;  {рисуем фон}
begin
setfillstyle(9,blue);
bar(0,0,640,75);
setcolor(14);
circle(45,40,30);
setfillstyle(1,14);
floodfill(45,40,14);
setcolor(6);
setlinestyle(0,0,3);
line(200,100,400,100);
line(200,300,200,100);
line(400,300,400,100);
line(260,250,260,100);
line(340,250,340,100);
setfillstyle(1,darkgray);
bar(250,250,350,260);
setfillstyle(1,green);
Bar(0,300,640,360);
setlinestyle(0,0,3);
end;

procedure DrawKach(x,y:integer); {рисуем качели со смещением по x и y}
begin
setcolor(6);
line(260+x,250-y,260,100);
line(340+x,250-y,340,100);
setfillstyle(1,darkgray);
bar(250+x,250-y,350+x,260-y);
end;

procedure DrawNoKach(x,y:integer); {стираем качели со смещением по x и y}
begin
setcolor(0);
line(260+x,250-y,260,100);
line(340+x,250-y,340,100);
setfillstyle(1,black);
bar(250+x,250-y,350+x,260-y);
end;

var  driver,mode:integer;
    t,h :real;

begin
    h:=2*pi/400;
    t:=0;
    driver:=VGA; mode:=VGAhi;
    InitGraph(driver,mode,'C:\BP\BGI');

    DrawFon;
    repeat
    DrawNoKach(trunc(20*(sin(t))),trunc(20*(1-cos(sin(t)))));
    t:=t+h;
    if t>2*pi then t:=0;
    DrawKach(trunc(20*(sin(t))),trunc(20*(1-cos(sin(t)))));
    delay(1000);
    until keypressed;

    CloseGraph;
end.

:smoke:
Altair
ДА ну, слишком круто, для подобной задачи, все проще можно сделать:
Код
uses graph,crt;
procedure draw(shag:byte; color:byte);
begin
setcolor(color);
line(260,100,260,100+10*shag); {2}
line(340,100,340,100+10*shag); {1 ступень}
setfillstyle(1,color); {!}
bar(250,100+10*shag,350,100+13*shag+5); {сиденье}
end;
var
gd,gm:integer;
k:byte;
begin
gd:=detect; initgraph(gd,gm,'');
 setfillstyle(9,blue);
bar(0,0,640,75);
setcolor(14);
circle(45,40,30);
setfillstyle(1,14);
floodfill(45,40,14);
setcolor(6);
setlinestyle(0,brown,3);
line(220,100,380,100);
line(220,300,220,100);
line(380,300,380,100);
setfillstyle(1,green);
Bar(0,300,640,360);
k:=1;
repeat
 for k:=1 to 10 do begin draw(k,8); delay(2000); draw(k,0); end;
 for k:=10 downto 1 do begin draw(k,8); delay(2000); draw(k,0); end;
until keypressed;
readkey;
end.
Altair
эээ.... только мы в разные стороны мыслим smile.gif
Я реализовал движение простое - качели качаются именно так smile.gif
(только вчера качался :P :D ) smile.gif


p.s. а скажи, Svetka, кто будет качаться на качелях ночью? smile.gif
а если не нось, то почему экран черный? smile.gif) солнце вроде есть smile.gif
hiv
Прикольно! :p7:
Хотя это первое, что я сделал... Но потом подумал, что это нужно девушке... и переделал ;)
Svetka
Цитата(Oleg_Z @ 22.03.05 16:15)
эээ.... только мы в разные стороны мыслим smile.gif
Я реализовал движение простое  - качели качаются именно так smile.gif
(только вчера качался :P :D ) smile.gif
p.s. а скажи, Svetka, кто будет качаться на качелях ночью? smile.gif
а если не нось, то  почему экран  черный? smile.gif) солнце вроде есть smile.gif

хехе,Олег......ночью катаца на качелях это классно,правда сама не пробовала;)
пасибо за задачу;) unsure.gif
Altair
да всегда пожалуйста! smile.gif а ты не из Москвы случайнО? (ответ мне в приват smile.gif )
Svetka
Цитата(hiv @ 22.03.05 16:22)
Прикольно!  :p7:
Хотя это первое, что я сделал... Но потом подумал, что это нужно девушке... и переделал  ;)

пасиба большое за задачу;)
Svetka
вот у меня было меню......из трёх пунктов.........там был пункт(качели) тока пока без движения.........я туда вместо неё вставила исправленную.........запускаю а у мя не появляетца меню....а сразу качели и сразу выходит из проги...почему? не знаешь?
hiv
Если бы весь код опубликовала - тогда проблем не было бы...
Можешь оформить тело прогаммы (там где begin ........ end.), что я тебе давал, в виде процедуры. Вызов процедуры вставь в код своей прогаммы там где меню (или где твои качели рисовались).
Svetka
вот мой весь код
Код

Program www;
uses crt,graph;
var c:char;
 menu:array[0..2]of string;
 item,i:integer;
procedure Zastavka;
var
GrDriver,grmode:integer;
begin
grdriver:=detect;
initgraph(grdriver,grmode, 'c:\TP\TP\BGI');
setfillstyle(9,blue);
bar(0,0,640,75);
setcolor(14);
circle(45,40,30);
setfillstyle(1,14);
floodfill(45,40,14);
setcolor(6);
setlinestyle(0,brown,3);
line(220,100,380,100);
line(220,300,220,100);
line(380,300,380,100);
line(260,250,260,100);
line(340,250,340,100);
setfillstyle(1,darkgray);
bar(250,250,350,260);
setfillstyle(1,green);
Bar(0,300,640,360);
readkey;
closegraph;
end;
procedure Zadacha;
begin
clrscr;
Writeln('zadacha=)');
readln;
end;
begin
 menu[0]:='1.Zastavka';
 menu[1]:='2.Zadacha';
 menu[2]:='3.Vyhod';
 item:=0;
 while true do begin
   clrscr;
   for i:=0 to 2 do begin
     if i=item
       then begin
         textcolor(15);
         textbackground(5);
       end
       else begin
         textcolor(7);
         textbackground(0);
       end;
     writeln(menu[i]);
   end;
   textbackground(0);
   case readkey of
     #0: case readkey of
       #72: if item>0 then item := item - 1;
       #80: if item<2 then item := item + 1;
     end;
     #13: case item of
       0: Zastavka;
       1: Zadacha;
       2: Halt;
     end;
     '1': Zastavka;
     '2': Zadacha;
     '3': Halt;
   end;
 end;
end.

вот куда надо изменё1нную часть вставить что б сначало меню показывалось?
FreeMan
дык меню итак первым показывается. а чтоб качельки качались, надо процедуру заставки заменить.
hiv
Замени код в процедуре Zastavka на тот код что я написал.
Svetka
ну я заменила...всё равно меню не показывается.....
Svetka
вот получившийся код:
Исходный код

Program www;
uses crt,graph;
var {c:char;}
menu:array[0..2] of string;
item,i:integer;
procedure Zatavka;
var
GrDriver,grmode:integer;
begin
grdriver:=detect;
initgraph(grdriver,grmode, 'c:\TP\TP\BGI');
setfillstyle(9,blue);
bar(0,0,640,75);
setcolor(14);
circle(45,40,30);
setfillstyle(1,14);
floodfill(45,40,14);
setcolor(6);
setlinestyle(0,brown,3);
line(200,100,400,100);
line(200,300,200,100);
line(400,300,400,100);
line(260,250,260,100);
line(340,250,340,100);
setfillstyle(1,darkgray);
bar(250,250,350,260);
setfillstyle(1,green);
Bar(0,300,640,360); {’а ў }
setlinestyle(0,0,3);
end;
procedure DrawKach(x,y:integer);
begin
setcolor(6);
line(260+x,250-y,260,100);
line(340+x,250-y,340,100);
setfillstyle(1,darkgray);
bar(250+x,250-y,350+x,260-y);
end;
procedure DrawNoKach(x,y:integer);
begin
setcolor(0);
line(260+x,250-y,260,100);
line(340+x,250-y,340,100);
setfillstyle(1,black);
bar(250+x,250-y,350+x,260-y);
end;
var driver,mode:integer;
t,h:real;
begin
h:=2*pi/400;
t:=0;
driver:=VGA;mode:=VGAhi;
initGraph(driver,mode,'c:\tp\tp\bin');

Zatavka;
repeat
DrawNoKach(trunc(20*(sin(t))),trunc(20*(1-cos(sin(t)))));
t:=t+h;
if t>2*pi then t:=0;
DrawKach(trunc(20*(sin(t))),trunc(20*(1-cos(sin(t)))));
delay(1000);
until keypressed;
CloseGraph;
end.
procedure Zadacha;
begin
clrscr;
Writeln('zadacha=)');
readln;
end;
begin
menu[0]:='1.Заставка ';
menu[1]:='2.Задача ';
menu[2]:='3.Выход';
item:=0;
while true do begin
clrscr;
for i:=0 to 2 do begin
if i=item
then begin
textcolor(14);
textbackground(4);
end
else begin
textcolor(7);
textbackground(0);
end;
writeln(menu[i]); {ЊҐ­о}
end;
textbackground(0);{–ўҐв д®­ -—са­л©}
case readkey of
#0: case readkey of
#72: if item>0 then item := item - 1;
#80: if item<2 then item := item + 1;
end;
#13: case item of
0: Zastavka;
1: Zadacha;
2: Halt;
end;
'1': Zastavka;
'2': Zadacha;
'3': Halt;
end;
end.
hiv
Вот как надо:
Код
Program www;
uses crt,graph;
var c:char;
menu:array[0..2]of string;
item,i:integer;

procedure Zastavka;

procedure DrawFon;  {рисуем фон}
begin
setfillstyle(9,blue);
bar(0,0,640,75);
setcolor(14);
circle(45,40,30);
setfillstyle(1,14);
floodfill(45,40,14);
setcolor(6);
setlinestyle(0,0,3);
line(200,100,400,100);
line(200,300,200,100);
line(400,300,400,100);
line(260,250,260,100);
line(340,250,340,100);
setfillstyle(1,darkgray);
bar(250,250,350,260);
setfillstyle(1,green);
Bar(0,300,640,360);
setlinestyle(0,0,3);
end;

procedure DrawKach(x,y:integer); {рисуем качели со смещением по x и y}
begin
setcolor(6);
line(260+x,250-y,260,100);
line(340+x,250-y,340,100);
setfillstyle(1,darkgray);
bar(250+x,250-y,350+x,260-y);
end;

procedure DrawNoKach(x,y:integer); {стираем качели со смещением по x и y}
begin
setcolor(0);
line(260+x,250-y,260,100);
line(340+x,250-y,340,100);
setfillstyle(1,black);
bar(250+x,250-y,350+x,260-y);
end;

var  driver,mode:integer;
    t,h :real;

begin
    h:=2*pi/400;
    t:=0;
    driver:=VGA; mode:=VGAhi;
    InitGraph(driver,mode,'C:\BP\BGI');

    DrawFon;
    repeat
    DrawNoKach(trunc(20*(sin(t))),trunc(20*(1-cos(sin(t)))));
    t:=t+h;
    if t>2*pi then t:=0;
    DrawKach(trunc(20*(sin(t))),trunc(20*(1-cos(sin(t)))));
    delay(1000);
    until keypressed;

    CloseGraph;
end;

procedure Zadacha;
begin
clrscr;
Writeln('zadacha=)');
readln;
end;

begin
menu[0]:='1.Zastavka';
menu[1]:='2.Zadacha';
menu[2]:='3.Vyhod';
item:=0;
while true do begin
  clrscr;
  for i:=0 to 2 do begin
    if i=item
      then begin
        textcolor(15);
        textbackground(5);
      end
      else begin
        textcolor(7);
        textbackground(0);
      end;
    writeln(menu[i]);
  end;
  textbackground(0);
  case readkey of
    #0: case readkey of
      #72: if item>0 then item := item - 1;
      #80: if item<2 then item := item + 1;
    end;
    #13: case item of
      0: Zastavka;
      1: Zadacha;
      2: Halt;
    end;
    '1': Zastavka;
    '2': Zadacha;
    '3': Halt;
  end;
end;
end.

И учите процедуры... sad.gif
Svetka
пасибо большоеsmile.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.