На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
В этом разделе можно создавать темы, которые относятся к поколению 32-битных компиляторов.
Здесь решаются вопросы портирования кода из старого доброго Турбо Паскаля в FPC, TMT, VP, GPC компиляторы, а также особенностей программирования на них для Windows/Linux и других ОС.
Указывайте тип компилятора, его версию, а также платформу (Windows/Linux/..) компиляции, другими словами, Target.
Модераторы: volvo877
  
> Как изменить код? , FPC WG
    Добрый вечер, никак не могу сообразить, как преобразовать цикл, чтобы зведолёт Spaceship начал конечное движение во время работы планет системы? еще он по непонятной мне причине начал мигать,помогите,пожалуйста

    Вложил файл, подсветка на таких объёмах сильно тормозит...
    Прикреплённый файлПрикреплённый файлspaceship.7z (3,19 Кбайт, скачиваний: 188)
    Сообщение отредактировано: volvo877 -
      Цитата geshtat @
      еще он по непонятной мне причине начал мигать

      Возможно мигание вызвано тем, что у тебя включается режим UpdateOn, когда у тебя все элементы изображение выводятся непосредственно на экран, а не в буфер, который потом целиком выводится на экран.
      Сообщение отредактировано: Polinom2686 -
        я тоже так думал, пока не отключил и не проверил, а с циклом-то как быть?должен быть еще вложенный,но какого типа - не могу сообразить
          Ты код-то хоть компилировал? А то ты точку с запятой пропускаешь в самых очевидных местах. :)
            у меня тонна битмапов и все работает,кроме того что мигает и я не понимаю, как внутри непрерывного цикла сделать прерывистый
              Залей куда-нибудь весь проект, я хочу это скомпилировать.
                http://file.qip.ru/file/Jip2WTIz/Space.html
                  Не работает программа:
                  ExpandedWrap disabled
                    ■ Free Pascal IDE Version 1.0.12 [2011/04/23]
                    ■ Compiler Version 2.4.4
                    ■ GDB Version GDB 7.2
                    ■ Using configuration files from: F:\Programs\Pascal\
                    Running "f:\programs\pascal\space2\space.exe "
                    No heap dump by heaptrc unit
                    Exitcode = 201
                    Runtime error 201 at $00415D34
                      $00415D34  PUTIMAGE,  line 2064 of F:/FPC/2.4.4/wingraph/wingraph.pas
                      $00403455  INIT_YELLOWSUN,  line 344 of f:/programs/pascal/space2/space.pas
                      $004066C8  main,  line 782 of f:/programs/pascal/space2/space.pas
                      $0040E311
                  , ибо:

                  Цитата
                  ExpandedWrap disabled
                    Procedure Init_YellowSun;
                    var
                       yp  : pointer;
                       ysz : longint;
                       yf  : file;
                    begin
                       ysz:=imagesize(1,1,yx,yy);
                       getmem(yp,ysz);
                       assign(yf,'Ysun.bmp');reset(yf,1);
                       Blockread(yf,yp^,ysz);
                       Close(yf);
                       Putimage(1210,650,yp^,copyput);
                       Freemem(yp);
                       Getanim(1210,650,1210+yx-1,650+yy-1,black,ya);
                       Putimage(1210,650,yp^,xorput); // Угу, прямо сейчас, после FreeMem(yp)
                       delay(500)
                    end;
                  , как же ты говоришь, что запускал её?

                  P.S. В Init_Callisto, Init_Io (и далее по списку) - та же проблема... Исправляй...

                  Добавлено
                  P.P.S. И потом: что это у тебя, все Iterate_... движущихся объектов сделаны как положено, за одну итерацию - смещение на 1 единицу, а Iterate_Spaceship - сразу на 700, Это, получается, все остальные должны ждать, пока он пролетит по экрану? Делай, как и везде: сдвиг на несколько пикселей (сразу, а не по одному) за итерацию, и включай Iterate_Spaceship в основной цикл. Кстати, выделенную память (GetMem-ом) надо освобождать, а то я устал смотреть на сотни строк вида:
                  ExpandedWrap disabled
                    Call trace for block $065B00B8 size 79414
                      $004067A5  main,  line 775 of F:/Programs/Pascal/Space2/Space.pas
                      $0040E421
                    Call trace for block $06556DE8 size 79414
                      $004067A5  main,  line 775 of F:/Programs/Pascal/Space2/Space.pas
                      $0040E421
                  при завершении работы программы...

                  Добавлено
                  Не, еще не всё :) Зачем ты внутри Iterate_Io и Iterate_Callisto выполняешь Updategraph(UpdateNow); ? "Убрать, к чертовой матери" (С) и вставить один-единственный Updategraph в конце основного цикла, перед Delay. Чем меньше обновлений - тем меньше мерцаний... Зачем обновлять весь экран при изменении позиции одного спутника? А потом опять обновлять при изменении позиции второго? Измени сразу всё, что должно измениться, и потом обновляй экран...
                  Сообщение отредактировано: volvo877 -
                    Ну у меня серьёзно всё работает) а с апдэйтом это да, я уж думал поставить в основной цикл да забыл, спасибо огромное)
                      Цитата geshtat @
                      Ну у меня серьёзно всё работает)
                      В Release что-ли компилируешь? Так переключись на Debug, узнаешь много интересного :)
                        Я тебе еще не надоел? Тогда вот тебе еще вопрос по твоей программе: почему ты не сделаешь так
                        ExpandedWrap disabled
                          procedure Init_AnyStar(px, py : Integer; Len : Integer;
                                    fn : String; var pt : array of pointer);
                          var
                             f : file;
                             i : Integer;
                             size : LongInt;
                          begin
                             for i := 0 to Len - 1 do
                             begin
                                size := imagesize(1, 1, px, py);
                                getmem(pt[i], size);
                                assign(f, fn + IntToStr(i + 1) + '.bmp');
                                reset(f, 1);
                                blockread(f, pt[i]^, size);
                                close(f);
                             end;
                          end;
                        , после чего инициализация любой звезды делается в одну строку. Любой. Скажем,

                        ExpandedWrap disabled
                          procedure Init_Star;
                          begin
                             Init_AnyStar(sx, sy, 5, 'star', sp);
                          end;

                        вместо
                        Цитата
                        ExpandedWrap disabled
                          procedure Init_Star;
                          var
                             sf1,sf2,sf3,sf4,sf5:file;
                             ss:array[1..5]of integer;
                          begin
                             ss[1]:=imagesize(1,1,sx,sy);
                             ss[2]:=imagesize(1,1,sx,sy);
                             ss[3]:=imagesize(1,1,sx,sy);
                             ss[4]:=imagesize(1,1,sx,sy);
                             ss[5]:=imagesize(1,1,sx,sy);
                             getmem(sp[1],ss[1]);
                             getmem(sp[2],ss[2]);
                             getmem(sp[3],ss[3]);
                             getmem(sp[4],ss[4]);
                             getmem(sp[5],ss[5]);
                             assign(sf1,'star1.bmp'); reset(sf1,1);
                             assign(sf2,'star2.bmp'); reset(sf2,1);
                             assign(sf3,'star3.bmp'); reset(sf3,1);
                             assign(sf4,'star4.bmp'); reset(sf4,1);
                             assign(sf5,'star5.bmp'); reset(sf5,1);
                             blockread(sf1,sp[1]^,ss[1]);
                             blockread(sf2,sp[2]^,ss[2]);
                             blockread(sf3,sp[3]^,ss[3]);
                             blockread(sf4,sp[4]^,ss[4]);
                             blockread(sf5,sp[5]^,ss[5]);
                          end;
                        , про твою ужасную Init_BlueSun я вообще молчу, она вместо 340 строк умещается... опять-таки в одну:
                        ExpandedWrap disabled
                          procedure Init_BlueSun;
                          begin
                             Init_AnyStar(bx, by, 81, 'bsun', bp);
                          end;
                        Сказать, насколько уменьшится программа в результате? :)
                          круто)только вот я никак не могу понять, какой формулой задать движение корабля для перемещения на несколько пикселей, а не от 1го до 700го и с небольшой скоростью
                            Ну, измени вот так:

                            ExpandedWrap disabled
                              function Iterate_Spaceship(x : integer) : integer;
                              var y:integer;
                              begin
                                 y:=round(x/2);
                                 Putanim(x,y,sha,bkgput);
                                 inc(x); // Тут можно увеличить не на 1, а на, скажем, 5 пикселей
                                 delay(20);
                                 Putanim(x,y,sha,transput);
                                 Iterate_Spaceship:=x;
                              end;
                            , и запускай этот Iterate_Spaceship в цикле.
                              Мужик спасибо большое)иногда думаешь, как же самому мозгов не фатило
                              0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                              0 пользователей:


                              Рейтинг@Mail.ru
                              [ Script execution time: 0,0402 ]   [ 18 queries used ]   [ Generated: 24.04.24, 16:53 GMT ]