|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Проблемы со столкновением
Вот функция столкновения
Код:
Function CollisionpnlStena(var Pers:TImage; var brImage2:TPanel):Boolean; var val:boolean; begin With pers do begin if brImage2 <> nil then begin val:=((brImage2.Left >= Left) and (brImage2.Top >= Top) and (brImage2.Left <= Left+Width) and (brImage2.Top <= Top+Height)) or (( brImage2.Left+brImage2.Width >= Left) and (brImage2.Top+brImage2.Height >= Top) and ( brImage2.Left+brImage2.Width <= Left+Width) and (brImage2.Top+brImage2.Height <= Top+Height)) or ((brImage2.Left >= Left) and (brImage2.Top+brImage2.Height >= Top) and (brImage2.Left <= Left+Width) and (brImage2.Top+brImage2.Height <= Top+Height)) or ((brImage2.Left+brImage2.Width >= Left) and (brImage2.Top >= Top) and (brImage2.Left+brImage2.Width <= Left+Width) and (brImage2.Top <= Top+Height)); if PPLRUD = 1 then Pers.Left:=brImage2.Left+brImage2.Width else if PPLRUD = 2 then Pers.Left:=brImage2.Left-Pers.Width else if PPLRUD = 3 then Pers.Top:=brImage2.Top+brImage2.Height else if PPLRUD = 4 then Pers.Top:=brImage2.Top-Pers.Height; end; result:=val; end; end; PPLRUD Содержит в какую сторону движется персонаж или какие действия с ним происходят. Вот создания панелей в качестве стен Код:
setlength(Stens, 2); stens[0]:=TPanel.Create(ScrollBox1); stens[0].Parent:=ScrollBox1; stens[0].Left:=190; stens[0].Width:=26; stens[0].Top:=0; stens[0].Height:=241; stens[0].Name:='pnlstens_0'; stens[1]:=TPanel.Create(ScrollBox1); stens[1].Parent:=ScrollBox1; stens[1].Left:=405; stens[1].Width:=26; stens[1].Top:=0; stens[1].Height:=241; stens[1].Name:='pnlstens_1'; Код:
procedure TFormMain.ZEPEMEWEHNE_PERSONAGESTimer(Sender: TObject); var i:integer; begin ZEPEMEWEHNE_PERSONAGES.Enabled:=FALSE; if PPLRUD=1 then begin Personages.Left:=Personages.Left-1; end else if PPLRUD=2 then begin Personages.Left:=Personages.Left+1; end else if PPLRUD=3 then begin Personages.Top:=Personages.Top-1; end else if PPLRUD=4 then begin Personages.Top:=Personages.Top+1; end; if Length(stens) > 0 then for i:= 0 to length(stens)-1 do if CollisionpnlStena(Personages, stens[i]) then PPLRUD:=0; ZEPEMEWEHNE_PERSONAGES.Enabled:=True; end; |
#2
|
||||
|
||||
Похоже что CollisionpnlStena возвращает всегда истину поскольку в условиях сравнения наблюдаются вероятно повторяющиеся, накладывающиеся друг-на-друга параметры - где-то пары скобок не хватает, к сожалению без проверки точнее не видно
Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
#3
|
||||
|
||||
Есть более простой способ вычислить столкновение прямоугольников:
Код:
Var R: TRect; ... if IntersectRect(R, Image1.BoundsRect, Image2.BoundsRect) then ShowMessage('Collision') Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#4
|
|||
|
|||
для имаджей это столкновение работает для панелей нет
|
#5
|
||||
|
||||
Это еще почему? Прямоугольник что в него ни запихай, форму от этого не изменит.
Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#6
|
|||
|
|||
Цитата:
|
#7
|
|||
|
|||
Ну и как на счет проблемы.
Код:
Var R: TRect; ... if IntersectRect(R, Image1.BoundsRect, Image2.BoundsRect) then ShowMessage('Collision') |
#8
|
|||
|
|||
может кто поможет сделать функцию столкновения чтобы нормально работало.
|
#9
|
||||
|
||||
Чтоб проверить нужен исходник, без него как понять что должно происходить, без оного всё вышеприведённое лишь кусок какого-то кода, не больше
Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
#10
|
||||
|
||||
Меняйте алгоритм движения.
Увеличение скорости движение уменьшает время его движения до конечной точки, но не дает способности мгновенно скакать в пространстве. Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#11
|
|||
|
|||
Цитата:
Код:
unit UnGMain; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls, ExtCtrls, UnConsole; type TFormMain = class(TForm) PageControl1: TPageControl; TabSheet1: TTabSheet; Button1: TButton; ZEPEMEWEHNE_PERSONAGES: TTimer; TabSheet2: TTabSheet; Panel1: TPanel; CKPSTNE: TTimer; Button2: TButton; ScrollBox1: TScrollBox; Image1: TImage; Label1: TLabel; ProgressBar1: TProgressBar; Label2: TLabel; Label3: TLabel; Button3: TButton; TabSheet3: TTabSheet; procedure Button1Click(Sender: TObject); procedure ZEPEMEWEHNE_PERSONAGESTimer(Sender: TObject); procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); procedure FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); procedure FormCreate(Sender: TObject); procedure CKPSTNETimer(Sender: TObject); procedure Button2Click(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); private { Private declarations } public { Public declarations } end; procedure ZEPEOTPNCOBKA; var FormMain: TFormMain; //Определение какая цель //0 - дойти до цели и ... //1 - TypeQELI:array of Integer; //Координаты до куда нужно дйойти XQELI,YQELI:Array of Integer; //определения что делать нужно для выполнения цели 0 //0 - и перейти на следущий мир //1 - и перейти на следующий уровень //2 - и открыть дверь TypeQELI0TYPE:array of Integer; //Анимация открытия двери AnimOX, ANIMOY:Array of integer; //Ид двери //ИД УРОВНЯ IDLEVELS:Integer; //определения что делать нужно для выполнения цели 1 //Персонаж Personages:TImage; //Враги AICOMP:Array of TImage; //Стены Stens, Dveri:array of TPanel; //На какой мы цели IDQELI:Integer; //Переменная для движение персонажа {0 - стоит 1 - Влево 2 - Вправо 3 - Вверх 4 - Вниз } PPLRUD:Integer; //Переменная для скрытия и появления панели игрока CKPSTNEINT:Integer; //Жизнь персонажа livePersonages:Integer; TransparentSprites:Boolean; implementation {$R *.dfm} procedure ZEPEOTPNCOBKA; BEGIN if TransparentSprites then Personages.Transparent:=true else Personages.Transparent:=false; END; function IsCrossImages(var Pers:TImage; var brImage2:TImage):boolean; var val:boolean; begin with Pers do begin if brImage2 <> nil then begin val:=((brImage2.Left >= Left) and (brImage2.Top >= Top) and (brImage2.Left <= Left+Width) and (brImage2.Top <= Top+Height)) or (( brImage2.Left+brImage2.Width >= Left) and (brImage2.Top+brImage2.Height >= Top) and ( brImage2.Left+brImage2.Width <= Left+Width) and (brImage2.Top+brImage2.Height <= Top+Height)) or ((brImage2.Left >= Left) and (brImage2.Top+brImage2.Height >= Top) and (brImage2.Left <= Left+Width) and (brImage2.Top+brImage2.Height <= Top+Height)) or ((brImage2.Left+brImage2.Width >= Left) and (brImage2.Top >= Top) and (brImage2.Left+brImage2.Width <= Left+Width) and (brImage2.Top <= Top+Height)); if PPLRUD = 1 then Pers.Left:=brImage2.Left+brImage2.Width else if PPLRUD = 2 then Pers.Left:=brImage2.Left-Pers.Width else if PPLRUD = 3 then Pers.Top:=brImage2.Top+brImage2.Height else if PPLRUD = 4 then Pers.Top:=brImage2.Top-Pers.Height; end; result:=val; end; end; Function CollisionpnlStena(var Pers:TImage; var brImage2:TPanel):Boolean; var val:boolean; begin With pers do begin if brImage2 <> nil then begin val:=((brImage2.Left >= Left) and (brImage2.Top >= Top) and (brImage2.Left <= Left+Width) and (brImage2.Top <= Top+Height)) or (( brImage2.Left+brImage2.Width >= Left) and (brImage2.Top+brImage2.Height >= Top) and ( brImage2.Left+brImage2.Width <= Left+Width) and (brImage2.Top+brImage2.Height <= Top+Height)) or ((brImage2.Left >= Left) and (brImage2.Top+brImage2.Height >= Top) and (brImage2.Left <= Left+Width) and (brImage2.Top+brImage2.Height <= Top+Height)) or ((brImage2.Left+brImage2.Width >= Left) and (brImage2.Top >= Top) and (brImage2.Left+brImage2.Width <= Left+Width) and (brImage2.Top <= Top+Height)); if PPLRUD = 1 then Pers.Left:=brImage2.Left+brImage2.Width else if PPLRUD = 2 then Pers.Left:=brImage2.Left-Pers.Width else if PPLRUD = 3 then Pers.Top:=brImage2.Top+brImage2.Height else if PPLRUD = 4 then Pers.Top:=brImage2.Top-Pers.Height; end; result:=val; end; end; procedure TFormMain.Button1Click(Sender: TObject); begin SetLength(TypeQELI, 3); SetLength(XQELI,3); SetLength(YQELI,3); SetLength(TypeQELI0TYPE,3); SetLength(AICOMP,1); setLength(AnimOX, 2); setLength(AnimOY, 2); setlength(Stens, 2); setlength(Dveri, 2); TypeQELI[0]:=0; TypeQELI[1]:=0; TypeQELI[2]:=0; XQELI[0]:=0; YQELI[0]:=0; XQELI[1]:=0; YQELI[1]:=0; XQELI[2]:=0; YQELI[2]:=0; TypeQELI0TYPE[0]:=2; TypeQELI0TYPE[1]:=2; TypeQELI0TYPE[2]:=1; IDLEVELS:=0; FORMMain.BorderStyle:=bsNone; FORMMain.WindowState:=wsMaximized; PageControl1.Visible:=False; Personages:=TImage.Create(ScrollBox1); Personages.Parent:=ScrollBox1; Personages.Left:=4; Personages.Top:=8; Personages.Picture.LoadFromFile('картинки\Алина.bmp'); Personages.Width:=256; Personages.Height:=256; ZEPEOTPNCOBKA; stens[0]:=TPanel.Create(ScrollBox1); stens[0].Parent:=ScrollBox1; stens[0].Left:=190; stens[0].Width:=26; stens[0].Top:=0; stens[0].Height:=241; stens[0].Name:='pnlstens_0'; stens[1]:=TPanel.Create(ScrollBox1); stens[1].Parent:=ScrollBox1; stens[1].Left:=405; stens[1].Width:=26; stens[1].Top:=0; stens[1].Height:=241; stens[1].Name:='pnlstens_1'; Dveri[0]:=TPanel.Create(ScrollBox1); Dveri[0].Parent:=ScrollBox1; Dveri[0].Left:=190; Dveri[0].Width:=121; Dveri[0].Top:=241; Dveri[0].Height:=26; Dveri[0].Name:='pnlDveri_0'; Dveri[1]:=TPanel.Create(ScrollBox1); Dveri[1].Parent:=ScrollBox1; Dveri[1].Left:=311; Dveri[1].Width:=121; Dveri[1].Top:=241; Dveri[1].Height:=26; Dveri[1].Name:='pnlDveri_1'; livePersonages:=1000; progressbar1.Max:=livePersonages; ScrollBox1.Color:=ClRed; end; procedure TFormMain.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin If (Key = 37)or(Key = 65) then PPLRUD:=1 else if (Key = 39)or(Key = 68) then PPLRUD:=2 else if (Key = 38)or(Key = 87) then PPLRUD:=3 else if (Key = 40)or(Key = 83) then PPLRUD:=4 else if key = 192 then consoleForm.ShowModal else if key = 69 then CKPSTNEINT := 2; end; procedure TFormMain.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); begin PPLRUD:=0; end; procedure TFormMain.ZEPEMEWEHNE_PERSONAGESTimer(Sender: TObject); var i:integer; begin ZEPEMEWEHNE_PERSONAGES.Enabled:=FALSE; if PPLRUD=1 then begin Personages.Left:=Personages.Left-1; end else if PPLRUD=2 then begin Personages.Left:=Personages.Left+1; end else if PPLRUD=3 then begin Personages.Top:=Personages.Top-1; end else if PPLRUD=4 then begin Personages.Top:=Personages.Top+1; end; if Length(stens) > 0 then for i:= 0 to length(stens)-1 do if CollisionpnlStena(Personages, stens[i]) then PPLRUD:=0; ZEPEMEWEHNE_PERSONAGES.Enabled:=True; end; procedure TFormMain.FormCreate(Sender: TObject); begin DoubleBuffered:= true; CKPSTNEINT:=1; end; procedure TFormMain.CKPSTNETimer(Sender: TObject); begin if CKPSTNEINT = 1 then begin Button2.Enabled:=False; ScrollBox1.Align:=AlNone; PageControl1.Align:=AlNone; Panel1.Align:=AlNone; if Panel1.Top >= -panel1.Height then begin panel1.Top := panel1.Top -3; If PageControl1.Top > 0 then begin PageControl1.Top:=PageControl1.Top-3; PageControl1.Height:=PageControl1.Height+3; ScrollBox1.Top:=ScrollBox1.Top-3; ScrollBox1.Height:=ScrollBox1.Height+3; end; end else begin CKPSTNEINT:=0; PageControl1.Align:=AlLeft; ScrollBox1.Align:=AlClient; end; end else if CKPSTNEINT = 2 then begin ScrollBox1.Align:=AlNone; PageControl1.Align:=AlNone; if Panel1.Top < 0 then begin panel1.Top := panel1.Top +3; if Panel1.Top >= -panel1.Height then begin PageControl1.Top:=PageControl1.Top+3; PageControl1.Height:=PageControl1.Height-3; ScrollBox1.Top:=ScrollBox1.Top+3; ScrollBox1.Height:=ScrollBox1.Height-3; end; end else begin CKPSTNEINT:=0; PageControl1.Align:=AlLeft; ScrollBox1.Align:=AlClient; Panel1.Align:=AlTop; Button2.Enabled:=true; end; end; end; procedure TFormMain.Button2Click(Sender: TObject); begin CKPSTNEINT:=1; end; procedure TFormMain.FormClose(Sender: TObject; var Action: TCloseAction); begin aPPLICATION.Terminate; end; end. |
#12
|
|||
|
|||
почему та функция
Код:
function CollisionpnlStenaRect(var Pers:TImage; var brImage2:TPanel):Boolean; var val:boolean; R:TRect; begin val:=IntersectRect(R, Pers.BoundsRect, brImage2.BoundsRect); if PPLRUD = 1 then Pers.Left:=brImage2.Left+brImage2.Width else if PPLRUD = 2 then Pers.Left:=brImage2.Left-Pers.Width else if PPLRUD = 3 then Pers.Top:=brImage2.Top+brImage2.Height else if PPLRUD = 4 then Pers.Top:=brImage2.Top-Pers.Height; result:=val; end; Код:
procedure TFormMain.Button1Click(Sender: TObject); begin SetLength(TypeQELI, 3); SetLength(XQELI,3); SetLength(YQELI,3); SetLength(TypeQELI0TYPE,3); SetLength(AICOMP,1); setLength(AnimOX, 2); setLength(AnimOY, 2); setlength(Stens, 2); setlength(Dveri, 2); TypeQELI[0]:=0; TypeQELI[1]:=0; TypeQELI[2]:=0; XQELI[0]:=0; YQELI[0]:=0; XQELI[1]:=0; YQELI[1]:=0; XQELI[2]:=0; YQELI[2]:=0; TypeQELI0TYPE[0]:=2; TypeQELI0TYPE[1]:=2; TypeQELI0TYPE[2]:=1; IDLEVELS:=0; FORMMain.BorderStyle:=bsNone; FORMMain.WindowState:=wsMaximized; PageControl1.Visible:=False; Personages:=TImage.Create(ScrollBox1); Personages.Parent:=ScrollBox1; Personages.Left:=4; Personages.Top:=8; Personages.Picture.LoadFromFile('картинки\Алина.bmp'); Personages.Width:=256; Personages.Height:=256; ZEPEOTPNCOBKA; stens[0]:=TPanel.Create(ScrollBox1); stens[0].Parent:=ScrollBox1; stens[0].Left:=190; stens[0].Width:=26; stens[0].Top:=0; stens[0].Height:=241; stens[0].Name:='pnlstens_0'; stens[1]:=TPanel.Create(ScrollBox1); stens[1].Parent:=ScrollBox1; stens[1].Left:=405; stens[1].Width:=26; stens[1].Top:=0; stens[1].Height:=241; stens[1].Name:='pnlstens_1'; Dveri[0]:=TPanel.Create(ScrollBox1); Dveri[0].Parent:=ScrollBox1; Dveri[0].Left:=190; Dveri[0].Width:=121; Dveri[0].Top:=241; Dveri[0].Height:=26; Dveri[0].Name:='pnlDveri_0'; Dveri[1]:=TPanel.Create(ScrollBox1); Dveri[1].Parent:=ScrollBox1; Dveri[1].Left:=311; Dveri[1].Width:=121; Dveri[1].Top:=241; Dveri[1].Height:=26; Dveri[1].Name:='pnlDveri_1'; livePersonages:=1000; progressbar1.Max:=livePersonages; ScrollBox1.Color:=ClRed; end; Код:
procedure TFormMain.ZEPEMEWEHNE_PERSONAGESTimer(Sender: TObject); var i:integer; begin ZEPEMEWEHNE_PERSONAGES.Enabled:=FALSE; if PPLRUD=1 then begin Personages.Left:=Personages.Left-1; end else if PPLRUD=2 then begin Personages.Left:=Personages.Left+1; end else if PPLRUD=3 then begin Personages.Top:=Personages.Top-1; end else if PPLRUD=4 then begin Personages.Top:=Personages.Top+1; end; if Length(stens) > 0 then for i:= 0 to length(stens)-1 do if CollisionpnlStenaRect(Personages, stens[i]) then PPLRUD:=0; ZEPEMEWEHNE_PERSONAGES.Enabled:=True; end; Последний раз редактировалось Alexandr_17_10, 22.06.2014 в 15:56. |