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

Вниз

TBitmaps   Найти похожие ветки 

 
Nobody_1988   (2006-05-09 01:06) [0]

Люди как проверить столкновения двух Transparament(тру) TBitmap"ов. Ато тупо через TRect прямоугольниками... неточно смотрится... Можно как-нибудь поточечно...  
Тока не надо предлагать всякие DelphiX сы....


 
grouzd[E]v ©   (2006-05-09 01:31) [1]

Попробовать проверить по пикселам? То есть что-то вроде
function Collide(bitmap1, bitmap2 : tbitmap) : boolean;
result := false;
for x := 0 to bitmap1.width do
 for y := 0 to bitmap1.height do
   if (bitmap1.pixels[x, y] <> clBlack) and
      (bitmap2.pixels[x, y] <> clBlack) then
        begin
          result := true;
          exit;
        end;
end;

только перед этим лучше все же проверить на столкновение по сферам а то тормозно будет. А еще можно посмотреть _исходники_ delphix

---
... we are walking on a thin line and you better avoid the risk ...


 
antonn ©   (2006-05-09 06:36) [2]

grouzd[E]v ©   (09.05.06 1:31) [1]
тормозно будет

ну дык canvas.pixels[]...
замени на scanline:)


 
MeF Dei Corvi ©   (2006-05-09 09:31) [3]


> замени на scanline:)

и перепиши код под asm :)


 
grisme ©   (2006-05-09 10:28) [4]

Попробуй хранить несколько точек, описывающих как бы более точный каркас столкновений, чем Рект. Математически пересечение 2х отрезков легко определить. Так что дерзай. Не пойму, нафик КАЖДУЮ точку проверять? :) Удачи


 
antonn ©   (2006-05-09 11:32) [5]

о-па...
function CollisionDvaBitmapa(BT,BTT:Tbitmap; x1,y1,x2,y2:integer):boolean;
const Pixels = MaxInt div SizeOf(TRGBTriple);
type
 PRGBArray = ^TRGBArray;
 TRGBArray = array[0..Pixels-1] of TRGBTriple;
var i,ii,ix,iy:integer; _Re:Trect;
   RowOut,Rowm: PRGBArray; _r,_b,_g:integer;
   B:Tbitmap;
 function maxx(x1,x2:integer):integer;
 begin
 if x1>x2 then result:=x1 else result:=x2;
 end;
 function minn(x1,x2:integer):integer;
 begin
 if x1<x2 then result:=x1 else result:=x2;
 end;
begin
result:=false;
B:=Tbitmap.Create;
try
 B.PixelFormat:=pf24bit;
 _Re.Left:=minn(x1,x2);
 _Re.top:=minn(y1,y2);
 _Re.Right:=maxx(maxx(x1,x2)+bt.Width,maxx(x1,x2)+btt.Width);
 _Re.Bottom:=maxx(maxx(y1,y2)+bt.Height,maxx(y1,y2)+btt.Height);
 B.Width:=_Re.Right-_Re.Left;
 B.Height:=_re.Bottom-_Re.Top;
 for i:=0 to bt.Height-1 do begin
 RowOut:=bt.ScanLine[i];
 Rowm:=  B.ScanLine[i+y1-_Re.top];
   for ii:=0 to bt.Width-1 do
    if not((RowOut[ii].rgbtBlue=0)and(RowOut[ii].rgbtGreen=0)and(RowOut[ii].rgbtRed=255 )) then begin
     Rowm[ii+x1-_Re.Left].rgbtBlue:=Rowm[ii+x1-_Re.Left].rgbtBlue-100;
   end;
  end;
 for i:=0 to btt.Height-1 do begin
 RowOut:=btt.ScanLine[i];
 Rowm:=  B.ScanLine[i+y2-_Re.top];
   for ii:=0 to btt.Width-1 do begin
    if not((RowOut[ii].rgbtBlue=0)and(RowOut[ii].rgbtGreen=0)and(RowOut[ii].rgbtRed=255 )) then
     Rowm[ii+x2-_Re.Left].rgbtBlue:=Rowm[ii+x2-_Re.Left].rgbtBlue-100;
   end;
  end;
 for i:=0 to b.Height-1 do begin
 RowOut:=b.ScanLine[i];
   for ii:=0 to b.Width-1 do begin
    if ((RowOut[ii].rgbtBlue<100)) then
     result:=true;
   end;
  end;
finally
b.Free;
end;
end;


правда страшно? :)
рекомендую, прежде чем ей воспользоваться, сначала проверить пересечение TRect"ов битмапов.


 
antonn ©   (2006-05-09 11:42) [6]

да, забыл инструкцию оставить:)
BT,BTT:Tbitmap; - два битмапа 24х битные
x1,y1 - координаты первого битмапа в пространстве
x2,y2 - координаты второго битмапа в пространстве
"прозрачный" цвет обоих должен быть clred (или переделать строки сравнения в функции).


 
Nobody_1988   (2006-05-09 21:12) [7]

Вообщем ситуация такая:

Грузится из "Tipa_Asteroid.bmp" 1 Transparament TBitmap произвольного размера от 40x40 до 80x80. Второй "Tipa_Space_Ship.bmp"размера 40x40. Астероиды летят сверху вниз... на Типа_Косм. корабль... :). Как лучше тогда проверить столкновения??? (А if все это будет еще и с анимацией)
Может у кого-нибудь имеется ссылка на исходничек с подобной гамой? Написанных без доп библиотек...

фэнкс то олл...


 
grouzd[E]v ©   (2006-05-09 21:19) [8]

Nobody_1988, айда конкурс писать (или ты уже?) http://code.darthman.com/
Я по сферам проверяю

---
... we are walking on a thin line and you better avoid the risk ...


 
Nobody_1988   (2006-05-09 22:49) [9]

Я ещё пока не... всё таки первая гама... и то не факт что будет.... :)


 
Nobody_1988   (2006-05-09 23:24) [10]

Еще кое-чо придумал -

Загрузить изображение в массив точек, вывести только нужные через Pixels[].
Можно легко, точно проверить на столкновение. Двигать только придется каждую точку...
Интересно это сильно глучно будет?


 
grouzd[E]v ©   (2006-05-10 00:10) [11]

Nobody_1988, я тоже туда первую отправил. с треском, кстати, провалилась =)
А что значит "вывести только нужные"? Да и зачем битмап - по сути массив точек, переписывать в другой массив? Не сильно понимаю

---
... we are walking on a thin line and you better avoid the risk ...


 
antonn ©   (2006-05-10 06:47) [12]

Nobody_1988   (09.05.06 21:12) [7]
о-о-о, наш человек, работает с ГДИ:))
вопщем, могу так посоветовать (так делал в предыдущих работах, так делаю и на космосим:))
создается класс, который заведует столкновением астероидов и их отрисовкой.
в классе создаются 2 TList, один хранит указатели на картинки(битмапы), второй указатели на "объекты".
сами "объекты" - это есть астероиды:
type
pAster = ^TAster;
TAster = record
 x,y:double; //коодринаты текущие
 r:double;  //радиус
 w,h: //габариты
 num:integer; //номер картинки
 _F:double; //сила, с которой он долбит по кораблям
end;

pASterB = ^TAsterB;
TAsterB = record
 B:Tbitmap; //картинка, просто картинка:)
end;


таким образом работать будешь с указателем (очень быстрый доступ до нужного объекта) на структуру(гораздо быстрее получится, чем постоянно брать св-ва у TBitmap). К тому же, некоторые астероиды одинаковые "на лицо" - для них можно испольховать одну и ту же картинку, причем в процессе коллизий к самой картинке можно и не притрагиваться:)

так вот, добавляешь картинку (один раз):
procedure TClass.addpic(BT:Tbitmap);
var P:pASterB;
begin
new(P);
p.b:=Tbitmap.create;
p.b.assign(bt);
FlistB.add(p);
end;


добавляешь астероиды:
procedure TClass.addAst(x,y,w,h,f:double; num:integer);
var P:pAster;
begin
new(P);
p.x:=x; p.y:=y; p.w:=w; p.h:=h; p._f:=f; p.num:=num;
p.r:=(p.w+p.h)/2; //ну, примерно так:)
Flist.add(p);
end;


движение астероидов:
procedure TClass.move;
var P:pAster;
begin
for i:=0 to Flist.count-1 do begin
 p:=pAster(Flist.items[i]);
 p.y:=p.y-1.2; //кстати, в структуре астероида можно и скорость индивидуальную прикрутить...
end;
end;


рисуешь астероиды:
procedure TClass.DrawAstt(BT:TBitmap);
var P:pAster; i:integer; PB:pASterB;
begin
for i:=0 to Flist.count-1 do begin
 p:=pAster(Flist.items[i]);
 pb:=pASterB(FlistB.items[p.num]);
BT.canvas.copyrect(rect(trunc(p.x),trunc(p.y),trunc(p.x+p.w),trunc(p.y+p.h)),pb.b.canvas,rect(0,0,trunc(p.w),trunc(p.h)));
end;
end;


коллизии:
procedure TClass.Collision;
var i:integer; P:pAster;
 function GetTrace(x1,y1,x2,y2:double):double;
  begin
   result:=trunc(sqrt(sqr(x1-x2)+sqr(y1-y2)));
  end;
begin
for i:=0 to Flist.count-1 do begin
p:=pAster(Flist.items[i]);
if GetTrace(p.x,p.y,Кораблик.x,Кораблик.y)<=(p.r+Кораблик.радиус) then
Кораблик.бронька:=Кораблик.бронька-p._f; //бабах...
end;
end;


Nobody_1988   (09.05.06 23:24) [10]
вывести только нужные через Pixels[].

ни в коем случае. забудь вообще про canvas.pixels[] и canvas.draw(), они будут тормозить сильнее, нежели canvas.copyrect() и scanline().



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

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

Наверх





Память: 0.49 MB
Время: 0.038 c
2-1174254147
Norfolk
2007-03-19 00:42
2007.04.08
Кнопка в TStringGrid или TDrawGrid


15-1173700587
Prohodil Mimo
2007-03-12 14:56
2007.04.08
TComboBox с двумя колонками.


2-1173768132
DimonS
2007-03-13 09:42
2007.04.08
Like в Access


2-1174239288
MIV
2007-03-18 20:34
2007.04.08
DBGrid


15-1173770951
Java
2007-03-13 10:29
2007.04.08
Проблема с SimpleDateFormat(Java)





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