World Of Goo Cursor

Тема в разделе "Delphi - Multimedia, Графика, Игры", создана пользователем Dock1100, 7 июл 2010.

  1. Dock1100

    Dock1100 :-]

    Регистрация:
    9 ноя 2009
    Сообщения:
    678
    Симпатии:
    0
    Ну сабж вот курсор из очень известной, а может быть и не очень известной, игры World Of Goo, но
    Одна проблема, отрисовка происходит на канве(под компонентамы его не видно), а хочется что бы это был курсор.

    Код (Delphi):
    unit Unit1;

    interface

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

    type
    TForm1 = class(TForm)
    Timer1: TTimer;
    procedure Timer1Timer(Sender: TObject);
    procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
    procedure FormCreate(Sender: TObject);
    private
    { Private declarations }
    public
    { Public declarations }
    end;

    const trail=10;      //кол-во "костей"
    diametr=18;     //диаметр
    scale=0.5;       //diametr*scale = радиус последнего шарика
    outline=3;       //ширина обводки
    outlinecolor=clwhite; //цвет обведеи
    linecolor=clblack;  //цвет заливки

    var
    Form1: TForm1;
    index:integer=0;     //номер последней "кисти"
    list:TStringList;   //список "костей"
    ismove:boolean=false;//переменная (двигаем мішь или нет)
    hag:real;           //Шагодной кости

    implementation

    {$R *.dfm}

    procedure TForm1.FormCreate(Sender: TObject);
    begin
    list:=TStringList.create;
    ismove:=true;
    hag:=(diametr-diametr*scale)/trail;  //получаем шаг
    form1.Cursor:=crnone; //скрываем курсор
    timer1.Interval:=1;
    timer1.Enabled:=true;
    end;

    procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
    Y: Integer);
    begin
    ismove:=true;
    inc(index);
    list.Add(inttostr(x)+'@'+inttostr(y)); //добавляем координаті

    if index>trail then
    begin
    index:=trail;
    list.Delete(0);
    end;
    end;

    procedure TForm1.Timer1Timer(Sender: TObject);
    var i,x,y,rad,x2,y2:integer;
    begin
    canvas.FillRect(form1.ClientRect);  //очистка канвы
    if index<=0 then exit;

    if (not ismove)and(index>1) then //уменшаем номер последней кисти на один
    begin
    index:=index-1;
    list.Delete(0); //и удаляем первую
    if index<=0 then index:=0;

    end;

    if index=1 then         //рисуем если одна кисть
    begin

    x:=strtoint(copy(list[0],1,pos('@',list[0])-1));
    y:=strtoint(copy(list[0],pos('@',list[0])+1,length(list[0])-pos('@',list[0])));
    rad:=round(diametr);
    canvas.Pen.Width:=rad+outline*2;
    canvas.Pen.Color:=outlinecolor;
    canvas.moveto(x,y);
    canvas.LineTo(x,y);
    canvas.Pen.Width:=rad;
    canvas.Pen.Color:=linecolor;
    canvas.moveto(x,y);
    canvas.LineTo(x,y);
    end
    else  //если >1 то
    begin
    for i:=1 to index-1 do //рисуем обводку
    begin
    x:=strtoint(copy(list[i],1,pos('@',list[i])-1));
    y:=strtoint(copy(list[i],pos('@',list[i])+1,length(list[i])-pos('@',list[i])));
    rad:=round(diametr-(index-i)*hag);
    x2:=strtoint(copy(list[i-1],1,pos('@',list[i-1])-1));
    y2:=strtoint(copy(list[i-1],pos('@',list[i-1])+1,length(list[i-1])-pos('@',list[i-1])));
    canvas.Pen.Width:=rad+outline*2;
    canvas.Pen.Color:=outlinecolor;
    canvas.moveto(x2,y2);
    canvas.LineTo(x,y);
    end;
    for i:=1 to index-1 do  //рисуем заливку
    begin
    x:=strtoint(copy(list[i],1,pos('@',list[i])-1));
    y:=strtoint(copy(list[i],pos('@',list[i])+1,length(list[i])-pos('@',list[i])));
    rad:=round(diametr-(index-i)*hag);
    x2:=strtoint(copy(list[i-1],1,pos('@',list[i-1])-1));
    y2:=strtoint(copy(list[i-1],pos('@',list[i-1])+1,length(list[i-1])-pos('@',list[i-1])));
    canvas.Pen.Width:=rad;
    canvas.Pen.Color:=linecolor;
    canvas.moveto(x2,y2);
    canvas.LineTo(x,y);
    end;
    end;
    ismove:=false;
    end;

    end.
    ЗЫ за код не ругайте, у кого есть вариант по лучше пусть выкладывает.
    ЗЫ ЗЫ не забудьте на форму кинуть таймер с именем TIMER1 задать ему собітие on Timer, и форме собітия onCreate OnMouseMove
    ЗЫ ЗЫ ЗЫ Могу долго не отвечать
     
  2. vital

    vital Больной Компом Детектед

    Регистрация:
    29 янв 2006
    Сообщения:
    2.468
    Симпатии:
    27
    Ну так ты его не руками на канве рисуй, а на самом деле сделай курсор. В чем проблема?
     
  3. Dock1100

    Dock1100 :-]

    Регистрация:
    9 ноя 2009
    Сообщения:
    678
    Симпатии:
    0
    Обычной прогой для курсоров его не склепаеш (за "курсором" тянется хвост).
     
  4. vital

    vital Больной Компом Детектед

    Регистрация:
    29 янв 2006
    Сообщения:
    2.468
    Симпатии:
    27
    Почему? Всякие шейфы и прочие анимации можно делать просто в курсоре..
    Посмотри че-нить типа Microangelo или ArtCursors.
     
Загрузка...
Похожие Темы - World Goo Cursor
  1. Jenya555
    Ответов:
    1
    Просмотров:
    1.398
  2. Aknur
    Ответов:
    0
    Просмотров:
    1.338
  3. Vadik(R)
    Ответов:
    3
    Просмотров:
    4.302
  4. Ryko
    Ответов:
    0
    Просмотров:
    166
  5. rownong
    Ответов:
    1
    Просмотров:
    196

Поделиться этой страницей