Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Pascal] Объекты, Двжиение закрошеного круга по краю экран 
:(
    Опции темы
neic
Дата 25.12.2009, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 839
Регистрация: 28.1.2007

Репутация: 5
Всего: 7



Вот код программы:
Код

PROGRAM Objects_Varl3;
USES Graph,Crt;
 TYPE
TLOCATION=OBJECT
        x,y:INTEGER;
        CONSTRUCTOR Init (initx,inity:integer);
        DESTRUCTOR Done;
    END;
TPOINT=OBJECT (TLOCATION)
    PROCEDURE Show (color:BYTE); VIRTUAL;
    PROCEDURE Hide;VIRTUAL;
    PROCEDURE MoveTo (newx, newy: INTEGER;color:BYTE) ;
       END;
TTREUG=OBJECT(TPOINT)
    a,b: INTEGER;
    CONSTRUCTOR Init (initx, inity: INTEGER) ;
    PROCEDURE Show (color: BYTE) ; VIRTUAL;
    PROCEDURE Hide; VIRTUAL;
       END;
TGRAPH=OBJECT
    grdriver:INTEGER;
    grmode:INTEGER;
    PROCEDURE Init (gb, gm: INTEGER;path:STRING) ;
    PROCEDURE Fin;
       END;
CONSTRUCTOR TLOCATION. Init (initx, inity: INTEGER) ;
BEGIN
    x:=initx;
    y:=inity;
END;
DESTRUCTOR TLOCATION.Done;
BEGIN
  WriteLn;
end;
PROCEDURE TPOINT.Show(color:BYTE);
Begin
      PutPixel(x,y,color);
END;
PROCEDURE TPOINT.Hide;
Begin
    PutPixel (x, y, GetBkColor);
end;
PROCEDURE TPOINt.Moveto(newx,newy:integer;color:BYTE);
BEGIN
hide;
X:=newx;
y:=newy;
Show(color);
End;
Procedure Tgraph.init(gb,gm:integer;path:string);
BEGIN
    grdriver:=gb;
    grmode:=gm;
    IniTGraph(grdriver,grmode, path);
END;
PROCEDURE TGRAPH.Fin;
BEGIN
    CloseGraph;
END;
CONSTRUCTOR TTREUG.Init (initx, inity: INTEGER);
BEGIN
    TPOINT.Init(initx,inity);
END;

PROCEDURE TTREUG.Show(color:BYTE);
BEGIN
    SetColor(Color);
    SetFillStyle(1,color);
    circle(x,y,20);
    FloodFill(x+2,y+2,color);
END;
PROCEDURE TTREUG.Hide;
BEGIN
    SetColor (GetBkColor);
    SetFillStyle(1,GetBkColor);
    circle(x,y,20);
    FloodFill(x+2,y+2,GetBkColor);
    SetColor(GetColor);
END;
VAR
    pt:TTREUG;
    world:TGRAPH;
    x,y:INTEGER;
    col:BYTE;
    ax,bx,ay,by,rad:INTEGER;
    px,py,v:byte;
    alf:REAL;
Begin
  CLRSCR;
  WriteLn('DVIZENIE ZAKRASHENNOGO KRUGA PO KRAJU EKRANA');
  col:=12;
  Write('ENTER');
  readln;
  World.Init(DETECT,DETECT,'C: \TP7\BGI');
  Delay(1000);
  X:=20;
  Y:=20;
  pt.Init(x,y);
  rad:=20;
  pt.Show(col);
  Delay(10000);
  readkey;
  ax:=20;
  bx:=640;
  ay:=20;
  by:=480;
  px:=5;
  py:=5;
  v:=1;
  REPEAT
    Delay(800);
    x:=Round(ax);
    Y:=Round(ay);
    if v=1 then
    begin
        ax:=ax+px;
        if ax>=bx-20 then
        begin
            v:=2;
        end;
    end;

    if v=2 then
    begin
        ay:=ay+py;
        if ay>=by-20 then
        begin
            v:=3;
        end;
    end;

    if v=3 then
    begin
        ax:=ax-px;
        if ax<=20 then
        begin
            v:=4;
        end;
    end;

    if v=4 then
    begin
        ay:=ay-py;
        if ay<=20 then
        begin
            v:=1;
        end;
    end;


    pt.MoveTo(x,y,col);
  UNTIL KeyPressed;
  World.Fin;
END.


Не могу понять как передать из программы объекту радиус.

Нужно сделать с использованием динамической и оперативной памяти.
PM MAIL WWW ICQ Skype   Вверх
volvo877
Дата 25.12.2009, 17:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2073
Регистрация: 15.11.2004

Репутация: 34
Всего: 116



neic, 
1) почему объект с названием TTreug занимается перемещением круга? Только мне кажется, что название больше подходит для треугольника?
2) измени конструктор этого самого объекта, добавь в него еще и радиус, и будешь иметь возможность передать его объекту.
PM MAIL   Вверх
neic
Дата 25.12.2009, 19:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 839
Регистрация: 28.1.2007

Репутация: 5
Всего: 7



Код

TTREUG=OBJECT(TPOINT)
    a,b: INTEGER;
    CONSTRUCTOR Init (initx, inity,radius: INTEGER) ;
    PROCEDURE Show (color: BYTE; radius:INTEGER) ; VIRTUAL;
....

CONSTRUCTOR TTREUG.Init (initx, inity,radius: INTEGER);
BEGIN
    TPOINT.Init(initx,inity);
END;

PROCEDURE TTREUG.Show(color:BYTE; radius:Integer);
BEGIN
    SetColor(Color);
    SetFillStyle(1,color);
    circle(x,y,radius);
    FloodFill(x+2,y+2,color);
END;

PROCEDURE TTREUG.Hide;
BEGIN
    SetColor (GetBkColor);
    SetFillStyle(1,GetBkColor);
    circle(x,y,radius);
    FloodFill(x+2,y+2,GetBkColor);
    SetColor(GetColor);
END;
....
pt.Show(col,rad); {rad = радиус, объявляется в VAR самой программы}
....

Всё правильно исправил? Просто с компа гостей вышел.

Цитата(volvo877 @  25.12.2009,  17:46 Найти цитируемый пост)
1) почему объект с названием TTreug занимается перемещением круга? Только мне кажется, что название больше подходит для треугольника?

Это лишь название взято из примера =) Просто лень было менять.


Это сообщение отредактировал(а) neic - 25.12.2009, 19:24
PM MAIL WWW ICQ Skype   Вверх
volvo877
Дата 25.12.2009, 20:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2073
Регистрация: 15.11.2004

Репутация: 34
Всего: 116



Цитата(neic @  25.12.2009,  18:22 Найти цитируемый пост)
Всё правильно исправил?

И чего ты добился? Менять - так уж вот так:

Код
type
TTREUG=OBJECT(TPOINT)
    a,b: INTEGER;
    r: integer;
    CONSTRUCTOR Init (initx, inity, radius: INTEGER) ;

CONSTRUCTOR TTREUG.Init (initx, inity, radius: INTEGER);
BEGIN
    TPOINT.Init(initx,inity);
    R := radius;
END;
PROCEDURE TTREUG.Show(color:BYTE);
BEGIN
    SetColor(Color);
    SetFillStyle(1,color);
    circle(x,y,R);
    FloodFill(x+2,y+2,color);
END;
Твой вариант компилироваться не будет: ты меняешь сигнатуру виртуального метода. Тебе этого делать никто не разрешит...
PM MAIL   Вверх
neic
Дата 25.12.2009, 21:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 839
Регистрация: 28.1.2007

Репутация: 5
Всего: 7



volvo877
спасибо, понял.

Ещё одни вопрос по заданию, можно ли как-то в паскале узнать его максимально разрешение.

Почему задаю такой вопрос? Просто на моём компе оно 640 на 480, на нетбуках 1024 на 768.
PM MAIL WWW ICQ Skype   Вверх
volvo877
Дата 25.12.2009, 21:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2073
Регистрация: 15.11.2004

Репутация: 34
Всего: 116



Цитата(neic @  25.12.2009,  20:19 Найти цитируемый пост)
Просто на моём компе оно 640 на 480
А если попробовать использовать не EGAVGA.BGI, а какой-нибудь другой драйвер, у тебя что, программа не запустится? Запустится, и 800*600 и 1024*768 из-под Турбо-Паскаля запускали.

Тебе надо после инициализации граф. режима определить максимальные значения по X и по Y? Для этого существует GetMaxX/GetMaxY:
Код
  pt.Show(col);
  Delay(10000);
  readkey;
  ax:=20;
  bx:=GetMaxX; { <--- Раз }
  ay:=20;
  by:=GetMaxY; { <--- Два }
, и работаешь хоть на 320*200, хоть на 1024*768
PM MAIL   Вверх
neic
Дата 26.12.2009, 01:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 839
Регистрация: 28.1.2007

Репутация: 5
Всего: 7



volvo877
ещё раз спасибо.
PM MAIL WWW ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0543 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.