Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 27.11.2010, 19:32   #1
wint1000
Пользователь
 
Регистрация: 06.04.2010
Сообщений: 10
По умолчанию Шарики движутся рывками

Написал код в Делфи10:
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls;

type
  TForm1 = class(TForm)
    Shape1: TShape;
    Timer1: TTimer;
    Shape2: TShape;
    Timer2: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure FormMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure Timer2Timer(Sender: TObject);
private
    { Private declarations }
public
  procedure krug();
  procedure mois();
  procedure krug2();
    { Public declarations }
end;

var
  Form1: TForm1;
  PosX,PosY,VelX,VelY:single;
  Pos2X,Pos2Y,Vel2X,Vel2Y:single;
  LastMouseX,LastMouseY:integer;
  MouseVelX,MouseVelY:integer;
  mousebutton:boolean;

implementation

{$R *.dfm}


procedure TForm1.FormCreate(Sender: TObject);
begin
 PosX:=3;
 PosY:=7;
 VelX:=2;
 VelY:=2;
 Pos2X:=2;
 Pos2Y:=6;
 Vel2X:=4;
 Vel2Y:=4;
end;

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
mousebutton:=true;
VelX:=0;
VelY:=0;
end;

procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
mousebutton:=false;
VelX:=MouseVelX;
VelY:=MouseVelY;
end;

procedure TForm1.krug;
begin
 PosX:=PosX + VelX;
 PosY:=PosY + VelY;

 if PosX>ClientWidth-Shape1.Width then
 begin
  VelX:=-VelX;
 end
 else if PosX<0 then
     begin
       PosX:=0;
       VelX:=-VelX;
     end;

 if PosY>ClientHeight-Shape1.Width then
 begin
  VelY:=-VelY;
 end
 else if PosY<0 then
     begin
       PosY:=0;
       VelY:=-VelY;
     end;


 Shape1.Left:=Round(PosX);
 Shape1.Top:=Round(PosY);

end;

procedure TForm1.krug2;
begin
 Pos2X:=Pos2X+Vel2X;
 Pos2Y:=Pos2Y+Vel2Y;

 if Pos2X>ClientWidth-Shape2.Width then
 begin
   Vel2X:=-Vel2X;
 end
 else if Pos2X<0 then
      begin
        Pos2X:=0;
        Vel2X:=-Vel2X;
      end;
 if Pos2Y>ClientHeight-Shape2.Width then
 begin
   Vel2Y:=-Vel2Y;
 end
 else if Pos2Y<0 then
      begin
        Pos2Y:=0;
        Vel2Y:=-Vel2Y;
      end;

 Shape2.Left:=Round(Pos2X);
 Shape2.Top:=Round(Pos2Y);

end;

procedure TForm1.mois;
var
 mouseX,mouseY:integer;
begin
  mouseX:=Mouse.CursorPos.X-Form1.ClientOrigin.X;
  mouseY:=Mouse.CursorPos.Y-Form1.ClientOrigin.Y;

  MouseVelX:=mouseX-LastMouseX;
  MouseVelY:=mouseY-LastMouseY;

  LastMouseX:=mouseX;
  LastMouseY:=mouseY;



  if mousebutton=true then
  begin
    PosX:=MouseX-Shape1.Width/2;
    PosY:=MouseY-Shape1.Width/2;
  end;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
 krug;
 mois;
end;

procedure TForm1.Timer2Timer(Sender: TObject);
begin
krug2;
end;

end.
Но шарики движутся рывками. Изменял параметры по всякому. Может кто скинет плавный исходник. Можно хоть для одного или несколько объектов. Заранее спасибо.

____
Нарушение правил - код не оформлен.
Оформляйте код специальными тегами ([СODE]..[/CODE]) - это кнопочка с решёточкой (#)
На первый раз сам оформлю. Но попрошу впредь быть внимательнее!
Модератор.

Последний раз редактировалось Serge_Bliznykov; 27.11.2010 в 19:40.
wint1000 вне форума
Старый 28.11.2010, 00:23   #2
Прик
Форумчанин
 
Регистрация: 08.09.2010
Сообщений: 880
По умолчанию

Цитата:
Движутся рывками
У штатных дельфийских таймеров дискретность не менее 25-50 мсек (выставляй интервал хоть на 1 мсек). Плюс время на прорисовку с помощью тяжелой дельфийской графической обертки над GDI винды.
Тут хоть застрелись, а рывки будут.
Не предназначена Дельфи для качественной графики, хоть тресни.

Автор один из 1 000 000 программеров, которые искали ответ на вопрос "плавный исходник".
Искать в закромах родины. Там полно чего. И обращение непосредственно к графической подсистеме винды, и самоличное построение гр. объектов, и библиотеки для быстрой графики и... , впрочем, много чего.
Было бы желание. А Shape'ы в помойку.
Прик вне форума
Старый 28.11.2010, 00:53   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

абсолютно не понял логику работы..
но попробуйте
1) таймеры поставить поменьше (ну, например, поставьте туда 20)

2) приросты сдвига объектов сделать маленькие, например:
Код:
procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  mousebutton:=false;
  VelX:=2; {MouseVelX;}
  VelY:=2; {MouseVelY;}
end;
Serge_Bliznykov вне форума
Старый 28.11.2010, 01:01   #4
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Вот вам программулька, там ничего постороннего не используется, возьмите оттуда методу для движения:
ManySprites.rar
mihali4 вне форума
Старый 28.11.2010, 01:28   #5
wint1000
Пользователь
 
Регистрация: 06.04.2010
Сообщений: 10
По умолчанию

Совершенно не согласен с Serge Bliznykov, т.к. не 20 ставил, а вообще-1. А что понимать под приростом? Какова скорость необходима-такую и надо, там ни какого прироста нет, скорость у нас типа понятие как таковое. Координата, что начальльная забита в форме(на шар) через таймер получаем следующую координату(она здесь же прорисовывается). Что самое интересное,что скорость мыши мы уже вычисляем(у нас ведь рука не запрограммированна). Чем то соглашусь, что Делфи компонентный подход не заточен под быструю графику, но путь решения в Делфи должен быть, щас посмотрю ссылку.
wint1000 вне форума
Старый 28.11.2010, 01:40   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

вот пример exe-шника - это Ваш же код с теми изменениями, о которых я говорил в #3
YourShapeDemo.rar
проверьте, как оно движется...
Serge_Bliznykov вне форума
Старый 28.11.2010, 01:57   #7
wint1000
Пользователь
 
Регистрация: 06.04.2010
Сообщений: 10
По умолчанию

Посмотрел. Никаких изменений. Как дёргались так и сейчас. Кстати занятные зверюшки и форма от mihali4 тоже дёрганная немного. Здесь видно надо подход изменить всё-же. Я уже читал на форумах, что Делфи не очень заточен под игры, знаете отдаёт чем то старинным. Вспоминается спектрум и и т.д. Но конечно в оконных приложениях ему нет равных. Так, что считаю, что эту тему никто не убьёт. Разве что API? Кто картинку на делфи покажет. С плюсами так известное дело, он более низкоуровневый.
wint1000 вне форума
Старый 28.11.2010, 02:00   #8
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Есть специализированные библиотеки для работы с графикой...
Пошукайте в разделе "Мультимедиа в Дельфи".
mihali4 вне форума
Старый 28.11.2010, 02:19   #9
wint1000
Пользователь
 
Регистрация: 06.04.2010
Сообщений: 10
По умолчанию

О! Спасибочки. А то меня этот тупой подход замаял. Что там происходит это может и интересно (поведение процессора с компонентами или ещё что. Но я на 80% склоняюсь, что из-за такой вещи
Shape1.Left:=Round(PosX) как бы округление. Если убрать - процессор не запарывается, а вводит в обычную тормознутость(все пробывали вычислять числа, в С++ уже последовательность в 300-400 видна задержка на глаз)что говорить о Делфи. А округление приводит к рывкам.

Последний раз редактировалось wint1000; 28.11.2010 в 02:34.
wint1000 вне форума
Старый 28.11.2010, 22:21   #10
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

ТС перенес тему во фриланс.
mihali4 вне форума
Закрытая тема


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Шарики sk1p Общие вопросы C/C++ 1 06.04.2010 01:11
С++ Лабораторная работа: игра "Шарики" bondik Фриланс 1 23.12.2009 23:53