Форум: "Игры";
Текущий архив: 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.036 c