Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 2004.05.23;
Скачать: [xml.tar.bz2];

Вниз

помогите избавиться от мерцание в 2D игре   Найти похожие ветки 

 
LLIpaM   (2004-01-05 00:44) [0]

Привет всем.
Не хочу покозаться невежлевым - вопрос наверно банальный.
Решил начать с создания Арканоида. До этого нечего не делал.
Научился загружать bitmap из .bmp (кстати не подскажете ли как из jpg или gif это сделать? а то бмпешки большие очень). Научился использовать маски и выводить чистый битмап на канвас формы.

.....
   Fon:=Tbitmap.Create;
   Fon.Loadfromfile("C:\Program Files\Borland\Delphi6\Projects\games\arkanoid\fon.bmp);
   Ball:=Tbitmap.Create;
   Ball.LoadFromFile("C:\Program Files\Borland\Delphi6\Projects\games\arkanoid\ball.bmp");
   Ballm:=Tbitmap.Create;
   Ballm.LoadFromFile("C:\Program Files\Borland\Delphi6\Projects\games\arkanoid\ballm.bmp");
   Bufer:=Tbitmap.Create;
   Bufer.Width:=800;
   Bufer.Height:=600;

......

             BitBlt(Bufer.Canvas.Handle,0,0,800,600,Fon.Canvas.Handle,0,0,SrcCopy);                                    

             BitBlt(Bufer.Canvas.Handle,Ball_x,Ball_y,16,16,Ballm.Canvas.Handle,0,0,SrcPaint);
             BitBlt(Bufer.Canvas.Handle,Ball_x,Ball_y,16,16,Ball.Canvas.Handle,0,0,SrcAnd);
             BitBlt(Form1.Canvas.Handle,0,0,800,600,Bufer.Canvas.Handle,0,0,SrcCopy);

Вроде так. Пример не дословно из кода. На таймер поставил менять Ball_x и Ball_y, но шарик дергается. Вроде движется, но глаза устают на него смотреть. Явно видно что то не то..
Я рисовалку поставил на таймер (0.001 сек), а на другой таймер (тоже 0.001 сек) поставил изменять Ball_x:=Ball_x+1; Ball_y:=Ball_y-3;

Принимаются любые советы, в том числе и ссылки на материал по теме.


 
ZAROLF ©   (2004-01-05 07:25) [1]

procedure TForm1.FormCreate(Sender: TObject);
begin
Image1.Parent.DoubleBuffered := True; //решение проблемы
//где Image1 - это фон
end;


 
LLIpaM   (2004-01-05 13:38) [2]

Ты имел ввиду мою переменную bufer заменить на image, или Form1.Canvas.Handle заменить на Image1.Canvas.Handle? Попробывал на форму имаж поставить и на клик мышки прописал:
   BitBlt(Bufer.Canvas.Handle,Ball_x,Ball_y,16,16,Ballm.Canvas.Handle,0,0,SrcPaint);
   BitBlt(Bufer.Canvas.Handle,Ball_x,Ball_y,16,16,Ball.Canvas.Handle,0,0,SrcAnd);
   BitBlt(Image1.Canvas.Handle,0,0,800,600,Bufer.Canvas.Handle,0,0,SrcCopy);
   Ball_x:=Ball_x+5;
Первый клик выводит изображение на имаж, а дальше неперемещается. Может че не так понял?
Объясни поподробней или где про работу с имаджем прочесть скажи плз.


 
Artificial Intellegence ©   (2004-01-05 15:21) [3]

Дело в том,что что при перерисовке формы стирается предыдущее изображение,чтобы этого избежать нужно:
1 В Protected прописать протип
  procedure WMPaint(var Msg: TWMPaint); message WM_PAINT;
2 Потом после Implementation и директив:
  procedure Tform1.WMPaint(var Msg: TWMPaint);
    var
    ps : TPaintStruct;
  begin
     BeginPaint (Handle, ps);
     // ..
     Здесь все что было в OnPaint;
     // ..
     Endpaint (handle,ps);
  end;
3 В таймере пишем:
    InvalidateRect(form1.Handle,nil,false);


 
Mihey ©   (2004-01-05 16:00) [4]

2 LLIpaM:

По поводу сообщения номер 1 - просто в OnCreate формы поставь форме DoubleBuffered := True;

Как один из приёмов (не использовать с сообщением номер 3):

В private формы пишем:
procedure WMEraseBkgnd(var m: TWMEraseBkgnd); message WM_ERASEBKGND;
В раздел implementation пишем:
procedure TТвояФорма.WMEraseBkgnd(var m : TWMEraseBkgnd);
begin
 m.Result := LRESULT(False);
end;

Вообще, если есть время разбираться, то попробуй что-нить другое, например, Graphic32, стандратный код переделать - как два пальца об...ть.


 
Zeqfreed ©   (2004-01-05 19:00) [5]

Как-то вы все заумно объясняете.
Можно завести 2 буфера.
Сначала все выводить на первый, а в самом конце копировать первый на второй!

P.S. ИМХО(!!!), так удобней.


 
Mihey ©   (2004-01-05 20:43) [6]

2 Zeqfreed:

Разницы вообще никакой. Это вам не DirectX.


 
Ландграф Павел ©   (2004-01-05 21:02) [7]

Грузить в память все равно придется bitmap, так что загружай любой формат, хоть jpg, конверть его в bmp (в памяти), ну и грузи на здоровье... примеров такого конвертирования в и-нете полно!


 
Mihey ©   (2004-01-05 23:26) [8]

И перемещение в один таймер слей.


 
LLIpaM   (2004-01-06 11:35) [9]

Спасибо всем за советы. Попробую.
Напишу что вышло.


 
LLIpaM   (2004-01-10 00:19) [10]

To Artificial Intellegence
    Честно говоря не разобрался что такое Protected. Поэтому не получилось попробывать твой вариант
To Mihey
     Попробывал сделать как ты посоветовал, но резутата не было. Все осталось по прежнему. Не

каких изменений.
To All
     Хотел бы дать скочать исходники, чтоб вы сами посмотрели что к чему. Но к сожалению нет

странички у меня. Может у кого есть, я бы прислал то что у меня получилось.

И еще пара вопросов возникло:
1. Курсор мышки убегает за экран постоянно. Как можно этого избежать?
2. Когда раскрываю окно на весь экран ерунда получается, что в принципе вполне логично. Ведь я

создаю форму 800х600 а экран у меня 1024х768. Неужели надо всю графику создавать во всех

возможных разрешениях?
3.Нашел на форуме такое сообщение:

<Чтобы двигался по всей плоскости введи 2 скорости SpeedX, SpeedY, они будут проекциями скорости

<шарика на оси X и Y
<тогда у тебя за каждый проход движка координаты шарика будут :
<KoordinataX := KoordinataX + SpeedX;
<KoordinataY := KoordinataY + SpeedY;
<
<Если ты хочешь задать какой-то начальный угол полёта шарика, то
<
<SpeedX := cos(Angle*Pi/180)*BaseSpeed;
<SpeedY := sin(Angle*Pi/180)*BaseSpeed;
<
<Где Angle - этот угол в градусах, BaseSpeed - начальная скорость полёта
<
<Чтобы отскакивал под углом нужно для столкновений сверху и снизу
<менять скорость по Y (SpeedY := -SpeedY), для столкновений слева и справа соответственно менять

<скорость по X (SpeedX := -SpeedX).


Тоже арконоид обсуждали. Заинтересовался. Но осуществить не получилось. Координаты нормально вычисляются, а нарисовать битмап на этих координатах не получаеться. Дело в том что в результате получались не целые числа, а дробные. И вот эти дробные числа как координаты не прохляли. Может посоветуете что нить, а то у меня в игре шарик отлетает в разных направлениях, но линейная скорось разная получается.


 
ZAROLF ©   (2004-01-10 08:32) [11]

DelphiGFX - там исходники от пин-понга и арканойда есть, всё ясно
и понятно.



Страницы: 1 вся ветка

Форум: "Игры";
Текущий архив: 2004.05.23;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.039 c
1-1083964926
MAXHO-2
2004-05-08 01:22
2004.05.23
Как перехватить закрытие главного окна?


3-1083141967
GIL
2004-04-28 12:46
2004.05.23
Обозначение пустоты в поле в SQL-запросе


7-1081412432
Stas
2004-04-08 12:20
2004.05.23
Изменения подписи чужой программы


3-1083179959
sasa
2004-04-28 23:19
2004.05.23
Тормоза IBSERVER под Win2KServer


1-1084353607
andrey__
2004-05-12 13:20
2004.05.23
TServiceApplication - как завершить приложение





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский