Форум: "Игры";
Текущий архив: 2004.06.27;
Скачать: [xml.tar.bz2];
ВнизПеремещение Image Найти похожие ветки
← →
AlexXn (2004-03-04 18:05) [0]Есть Image, фон. Есть другой Image - "прицел". При перемещении "прицела" все моргает. Как изавится от етого. Может можно сделать как-нить по другому.
← →
TButton © (2004-03-04 18:14) [1]да.
bg: TBitMap; // фон
cr: TBitMap; // прицел
onCreate;
...
bg:=TBitMap.Create;
bg.LoadFromFile("superpuperfon.bmp");
cr:=TBitMap.Create;
cr.LoadFromFile("vsexybiuodinostanus.bmp");
...
end;
onPaint;
...
BitBlt(Image1.Canvas.Handle,0,0,bg.Height,bg.Width,bg.Canvas.Handle,0,0,SRCCOPY);
BitBlt(Image1.Canvas.Handle,0,0,cr.Height,cr.Width,cr.Canvas.Handle,0,0,SRCCOPY);
...
end;
← →
TButton © (2004-03-04 18:21) [2]Работа над ошибками
1. перепутал Height и Width
2. cr, конечно, нужно блитать не в 0, 0, а в cx, cy (позицию курсора), а если еще точнее то в cx+(cr.Width div 2), cy+(cr.Height div 2)
← →
Mihey © (2004-03-04 18:49) [3]2 TButton:
Рад, что ты не схватил молоток и не разбил монитор :).
2 AlexXn:
Надо делать по-другому. Все элементы игры, как фон, чувачки, которые бегают, прицел - всё нужно делать не на TImage. Ну представь себе, если в Doom монстрики были бы компонентами?
Нужно работать с изображениями в памяти. Заводишь переменные типа TBitmap, создаёшь объекты, загружаешь в них свои изображения фона, прицела и в общем того, что надо и работаешь. Вот посмотри тут:
http://delphigfx.mastak.ru/2d/001/2d_1.htm
← →
TButton © (2004-03-04 18:58) [4]2Mihey ©
>Рад, что ты не схватил молоток и не разбил монитор :).
а почему я должен был это сделать)))?
← →
TButton © (2004-03-04 19:06) [5]lol
BitBlt(Image1.Canvas.Handle,20,20,cr.Height,cr.Width,cr.Canvas.Handle,0,0,SRCCOPY);
выводит битмап в позиции 20:20
BitBlt(Image1.Canvas.Handle,cur.x,cur.y,cr.Height,cr.Width,cr.Canvas.Handle,0,0,SRCCOPY);
(cur: TPoint меняется в onMouseMove), выводит битмапу в позиции 0:0
иттересно...
← →
AlexXn (2004-03-04 19:49) [6]Да, но тем не менее мерцание прицела остается
← →
TButton © (2004-03-04 19:58) [7]в смысле? у меня при 1024х768, прицел не блитается а draw"ается, 10-12 кадров стабильно и никакого мерцания.
← →
AlexXn (2004-03-04 20:06) [8]А у меня мерцает.
procedure TForm1.FormCreate(Sender: TObject);
begin
FBackground := TBitmap.Create;
FBackground.LoadFromFile("D:\Projects\Temp\GunShot\waterfall3.bmp");
FZoom := TBitmap.Create;
FZoom.LoadFromFile("D:\Projects\Temp\GunShot\zoom.bmp");
FCurrLeft := 100;
FCurrTop := 100;
PaintMe;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
FBackground.Free;
FZoom.Free;
end;
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
begin
case Key of
VK_LEFT: FCurrLeft := FCurrLeft - 1;
VK_RIGHT: FCurrLeft := FCurrLeft + 1;
VK_UP: FCurrTop := FCurrTop - 1;
VK_DOWN: FCurrTop := FCurrTop + 1;
end;
PaintMe;
end;
end;
procedure TForm1.PaintMe;
begin
BitBlt(Form1.Canvas.Handle, 0, 0, Form1.Width, Form1.Height, FBackground.Canvas.Handle,
0, 0, SRCCOPY);
BitBlt(Form1.Canvas.Handle, FCurrLeft, FCurrTop, 100, 100, FZoom.Canvas.Handle,
0, 0, SRCCOPY);
end;
← →
TButton © (2004-03-04 20:24) [9]мерцает) значит криво выводишь. счас разберемся.
← →
Mihey © (2004-03-04 20:34) [10]>а почему я должен был это сделать)))?
Потому что был задан тупой вопрос :(
← →
TButton © (2004-03-04 20:36) [11]вот ведь интересно, попробовал блитать не на форму а на имадж, дергаться перестало... в принципе вообще рисовать перестало))
← →
Mihey © (2004-03-04 20:56) [12]2 TButton:
Я тоге рисовал как-то на форму и дёргалось. Но чё то я потом сделал и не дёргается.
← →
TButton © (2004-03-04 21:01) [13]:)
← →
AlexXn (2004-03-04 21:28) [14]И че надо сделать то???
Может сказать крэкс-пэкс-фэкс :-)))
← →
Mihey © (2004-03-04 21:39) [15]2 AlexXn:
Вообще, я не хотел про этот способ говорить, потому что он тебе понравится, но в общем уже всё равно. Попробуй поставить в OnCreate формы DoubleBuffered := True и в принципе мерцать у тебя не будет.
И вот ещё хотел спросить, ты рисуешь картинку в OnPaint формы???
← →
Soft © (2004-03-04 22:22) [16]Я использовал такой способ(по-моему самый эффективный), правда не в игре, а в имитаторе сети.
1) Создаешь объект TBitmap в памяти, инициализируешь, налагаешь фон...
2) В данный битмап рисуешь всю сцену, с помощью методов Canvas или прямым выводом, что особо для тебя не важно.
3) Уже сформированный Битмап выводишь на любую компонету(Tform,Image...) методом Draw эту битмапку
4) Очищаешь или уничтожаешь Битмап.
5) Идем на следующий кадр.
Вот примерно такой способ, пока проблем не было. Если скорость особо не важна, то идеально.
← →
TButton © (2004-03-04 22:37) [17]>И вот ещё хотел спросить, ты рисуешь картинку в OnPaint формы???
я рисовал в онпайнт, всеравно мерцает.
← →
AlexXn (2004-03-05 10:07) [18]И с DoubleBuffered мерцает...
Нет, на OnPaint я не рисую.
Попробую феню, что описал Soft[16]
← →
Mihey © (2004-03-05 21:46) [19]>Нет, на OnPaint я не рисую.
Ну вот и проблемы. Да и вообще, ни у кого не мерцает, а у тебя мерцает Нельзя же так.
← →
lyeh © (2004-03-06 02:01) [20]2 AlexXn
А на десктопе рисовать не пробовал? :)
А если серьезно, то действуй, как описал Soft[16] - я сам всегда так делаю, когда скорость не критична. А DoubleBuffered, по моему, лажа - как-то тоже пробовал, но ничего не менялось.
← →
TButton © (2004-03-06 17:43) [21]>А на десктопе рисовать не пробовал? :)
пробовал) не моргает)
← →
lyeh © (2004-03-07 01:54) [22]2 AlexXn
> И че надо сделать то???
> Может сказать крэкс-пэкс-фэкс
procedure CraxPaxFax;
begin
FormatDrive("C");
ShowMessage("А теперь моргает?");
end;
2 TButton
> пробовал) не моргает)
Я же пошутил :)
← →
KADAN © (2004-03-08 10:26) [23]хм... интересный вопрос. у меня тоже замерцало, причем страшно. чуть подправил и не мерцает:
procedure TForm1.FormCreate(Sender: TObject);
begin
bg:=TBitmap.Create;
cr:=TBitmap.Create;
bg.LoadFromFile("fon.bmp");
cr.LoadFromFile("cur.bmp");
buf:=TBitmap.Create;
crh:=cr.Height;
crw:=cr.Width;
buf.Width:=crw;
buf.Height:=crh;
buf.Canvas.CopyRect(Rect(0,0,crw,crh),bg.Canvas,rect(FCurrLeft,FCurrTop,FCurrLeft+crw,FCurrTop+crh));
BitBlt(bg.Canvas.Handle, FCurrLeft, FCurrTop, crw, crh, cr.Canvas.Handle, 0, 0, SRCCOPY);
end;
procedure TForm1.FormPaint(Sender: TObject);
begin
BitBlt(Form1.Canvas.Handle, 0, 0, Form1.Width, Form1.Height, bg.Canvas.Handle, 0, 0, SRCCOPY);
end;
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
begin
BitBlt(bg.Canvas.Handle, FCurrLeft, FCurrTop, 100, 100, buf.Canvas.Handle,0, 0, SRCCOPY);
case Key of
VK_LEFT: FCurrLeft := FCurrLeft - 1;
VK_RIGHT: FCurrLeft := FCurrLeft + 1;
VK_UP: FCurrTop := FCurrTop - 1;
VK_DOWN: FCurrTop := FCurrTop + 1;
end;
buf.Canvas.CopyRect(Rect(0,0,crw,crh),bg.Canvas,rect(FCurrLeft,FCurrTop,FCurrLeft+crw,FCurrTop+crh));
BitBlt(bg.Canvas.Handle, FCurrLeft, FCurrTop, crw, crh, cr.Canvas.Handle, 0, 0, SRCCOPY);
Paint;
end;
end;
← →
lyeh © (2004-03-09 00:27) [24]Посмотрите ветку "фонарь" - там аналогичная проблема, и я выложил свой код
← →
AlexXn (2004-03-09 18:12) [25]Спасибо всем
>KADAN
Все заработало!!! Огромное спасибо
Страницы: 1 вся ветка
Форум: "Игры";
Текущий архив: 2004.06.27;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.033 c