Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 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
1-1086928329
Softal
2004-06-11 08:32
2004.06.27
ListBox


1-1086858471
Rewalon
2004-06-10 13:07
2004.06.27
Как просмотреть многостраничный *.tiff


14-1086717288
Ske4er
2004-06-08 21:54
2004.06.27
TIniFile


14-1086833482
Думкин
2004-06-10 06:11
2004.06.27
С днем рождения! 10 июня


3-1085941851
Viktor
2004-05-30 22:30
2004.06.27
Перекодировка таблиц





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский