Форум: "Игры";
Текущий архив: 2003.11.24;
Скачать: [xml.tar.bz2];
ВнизКак наложить 3 изображения одно на другое? Найти похожие ветки
← →
greenrul (2003-05-18 00:04) [0]Есть
a:TImageSprite
, который создается динамически. Есть картинки, "1","2","3" - как в этот спрайт загнать эти 3 картинки наложив одну на другую? Пробую:
a:=TImageSprite.Create(SpriteEngine.engine); {обратите внимание - спрайт создается в runtime - может у меня из-за этого баги?}
for i:=1 to 3 do
begin
( IntToStr(i)Есть
a:TImageSprite
, который создается динамически. Есть картинки, "1","2","3" - как в этот спрайт загнать эти 3 картинки наложив одну на другую? Пробую:
a:=TImageSprite.Create(SpriteEngine.engine); {обратите внимание - спрайт создается в runtime - может у меня из-за этого баги?}
for i:=1 to 3 do
begin
a.image:=Images.items.find(IntToStr(i));
a.x:=10;
a.y:=10;
a.z:=10;
a.width:=a.image.width;
a.height:=a.image.height;
a.image.transparent:=true;
a.image.transparentcolor:=clRed;
a.visible:=true
end;
Отображается ТОЛЬКО последний слой... Заранее прошу не предлагать метод склеивания картинок черезTCanvas
, так как убедительно считаю его тормозным для кучи тайлов.
← →
Проходил мимо... (2003-05-18 00:48) [1]А почему должны отображаться другие...
В а копируется последнее изображение и никаких слоев тут нет, так что прийдется поработать ручками и сделать какое нибудь подобие blender"а, напримет изображения загружать в TBitmap и проводить "сложнейшие операции" по смешиванию картинок, другого пути видимо нет.
← →
greenrul (2003-05-18 15:05) [2]Пример неработающей процедуры:
function CombineImages(a1,a2:string):TPicture;
var b1,b2,b3:TBitmap;
( a1)Пример неработающей процедуры:
function CombineImages(a1,a2:string):TPicture;
var b1,b2,b3:TBitmap;
b:TPicture;
begin
b1:=TBitmap.Create;
b2:=TBitmap.Create;
b3:=TBitmap.Create;
b:=TPicture.Create;
b1:=MainForm.images.Items.Find(a1).Picture.bitmap;
b1.Width:=MainForm.images.Items.Find(a1).Picture.width;
b1.Height:=MainForm.images.Items.Find(a1).Picture.height;
b2:=MainForm.images.Items.Find(a2).Picture.bitmap;
b2.Width:=MainForm.images.Items.Find(a2).Picture.width;
b2.Height:=MainForm.images.Items.Find(a2).Picture.height;
b2.Transparent:=True;
b3.Width:=b2.Width;
b3.Height:=b2.Height;
b3.Canvas.Draw(0,0,b1);
b3.Canvas.Draw(0,0,b2);
b.Assign(b3);
CombineImages:=b;
b1.free;
b2.free;
b3.free;
b.free;
end;
Вызываю -
Tiles[xx,yy]:=TImageSprite.Create(MainForm.DXSpriteEngine1.Engine);
Tiles[xx,yy].Clear;
Tiles[xx,yy].Image.Picture:=CombineImages("606","607"); {Здесь вылетает error}
Tiles[xx,yy].z:=...
Tiles[xx,yy].Width:=...
Tiles[xx,yy].Height:=...
Tiles[xx,yy].x:=...
Tiles[xx,yy].y:=...
Tiles[xx,yy].Image.Transparent:=true;
Tiles[xx,yy].Image.TransparentColor:=clRed;
Tiles[xx,yy].Visible:=true;
Tiles[xx,yy].PixelCheck:=false;
Где я ошибся?
← →
Agent[007] (2003-05-18 21:32) [3]мне кажется, что надо 3 переменных: a, b, c; и тогда они наложаться... :)))
← →
greenrul (2003-05-18 21:36) [4]Но выходные данные должны быть - TImage - у меня работал пример:
b1:=TBitmap.Create;
b2:=TBitmap.Create;
b3:=TBitmap.Create;
b1.LoadFromFile("c:\1.bmp");
b2.LoadFromFile("c:\2.bmp");
b2.Transparent:=True;
b3.Width:=b1.Width; b3.Height:=b1.Height;
b3.Canvas.Draw(0,0,b1);
b3.Canvas.Draw(0,0,b2);
Pict.Assign(b3);
b1.free;
b2.free;
b3.free;
← →
cyborg (2003-05-18 21:57) [5]Как всё запущено...
Задания для размышления:
1. Ты уверен, чтоMainForm.images.Items.Find(a1).Picture.bitmap;
всегда будет находить твой а1?
Если не находит, то что произойдёт?
2.CombineImages:=b; b.free;
Какое значение имеет Result и что получается в итоге?
И вопрос интересующий меня :):
Зачем ты копируешь три картинки в одну?
← →
greenrul (2003-05-18 21:58) [6]Прошу прощения, немного наглючил, но все равно НЕ РАБОТАЕТ:
вызов :
Tiles[xx,yy].Image.Picture.Assign(CombineImages("606","607"));
сама процедура:
function CombineImages(a1,a2:string):TBitmap;
var ( a1)Прошу прощения, немного наглючил, но все равно НЕ РАБОТАЕТ:
вызов :
Tiles[xx,yy].Image.Picture.Assign(CombineImages("606","607"));
сама процедура:
function CombineImages(a1,a2:string):TBitmap;
var b1,b2,b3:TBitmap;
begin
b1:=TBitmap.Create;
b2:=TBitmap.Create;
b3:=TBitmap.Create;
b1:=MainForm.images.Items.Find(a1).Picture.bitmap;
b1.Width:=MainForm.images.Items.Find(a1).Picture.width;
b1.Height:=MainForm.images.Items.Find(a1).Picture.height;
b2:=MainForm.images.Items.Find(a2).Picture.bitmap;
b2.Width:=MainForm.images.Items.Find(a2).Picture.width;
b2.Height:=MainForm.images.Items.Find(a2).Picture.height;
b2.Transparent:=True;
b3.Width:=b2.Width;
b3.Height:=b2.Height;
b3.Canvas.Draw(0,0,b1);
b3.Canvas.Draw(0,0,b2);
CombineImages:=b3;
b1.free;
b2.free;
b3.free;
end;
← →
greenrul (2003-05-18 22:01) [7]1. Уверен.
2. Access violation at 00000038 accessing 00000038
не очень понимаю как узнать result, если такая фигня творится.
3. Не три, а две - у меня несколько слоев для тайловой карты, хочу совместить в один
← →
greenrul (2003-05-18 22:29) [8]Удивительно - делаю b3.savetofile - сохраняется нормально...
очень странно - ведь передаю TBitmap, получаю Picture.Bitmap:=Result...
← →
cyborg (2003-05-18 22:52) [9]
CombineImages:=b3;
и естьResult:=b3;
;
1. А я бы на твоём месте небыл бы так уверен, хотя тебе виднее.
2. опять же делаешьCombineImages:=b3; b3.free;
Если не догадался, ответ на мой вопрос такой, ты назначаешь результату функции картинку б3, затем ты эту картинку освобождаешь, но функция указывает на адрес этой картинки, которой уже нет, поэтому и ацесвиолатион.
Страницы: 1 вся ветка
Форум: "Игры";
Текущий архив: 2003.11.24;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.009 c