Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.236.86.184] |
|
Сообщ.
#1
,
|
|
|
До сих пор ищу подходящий вариант работы с пикселями и при тестировании кода на html5 обнаружила, что когда объект выходит за верхний угол то getImageData выдает результат rbg квадрата.
Чтобы вывести это я использовала строку. Цитата document.getElementById("debug").value=ctx.getImageData(0, 0, 1, 1).data; Пример ниже. Как тоже самое сделать на delphi7, чтобы сравнивалось по пикселям и когда объект уходил за границу, а точнее за верхний левый угол то выводилось RGB объекта например в компоненте Label1? Вот код перетаскивания объекта мышкой. unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, AppEvnts; type TForm1 = class(TForm) Button1: TButton; Timer1: TTimer; ListBox1: TListBox; Label1: TLabel; Label2: TLabel; ApplicationEvents1: TApplicationEvents; Label3: TLabel; procedure Timer1Timer(Sender: TObject); procedure FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); procedure ListBox1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); procedure ApplicationEvents1Message(var Msg: tagMSG; var Handled: Boolean); private { Private declarations } public { Public declarations } end; var Form1: TForm; rightb, leftb, upb, downb : Boolean; Map_X, Map_Y : integer; OldX, OldY : integer; dragok:Integer; StartX:Integer; StartY:Integer; implementation {$R *.dfm} procedure TForm1.Timer1Timer(Sender: TObject); begin if rightb = true then begin Map_X := Map_X + 2; end; if leftb = true then begin Map_X := Map_X - 2; end; if upb = true then begin Map_Y := Map_Y - 2; end; if downb = true then begin Map_Y := Map_Y + 2; end; OldX := 0; OldY := 0; Form1.Canvas.Brush.Color:=clWhite; Form1.Canvas.FillRect(Form1.ClientRect); Canvas.Rectangle(100, 100, 150, 150); Canvas.Rectangle(200, 200, 250, 250); Canvas.Brush.Color:=clRed; Canvas.Rectangle(OldX+50+Map_X, OldX+50+Map_Y, OldY+100+Map_X, OldY+100+Map_Y); end; procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); begin case Key of vk_RIGHT: rightb := false; vk_LEFT: leftb := false; vk_UP: upb := false; vk_DOWN: downb := false; end; end; procedure TForm1.ListBox1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin case key of vk_RIGHT: rightb := true; vk_LEFT: leftb := true; vk_UP: upb := true; vk_DOWN: downb := true; end; end; procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG; var Handled: Boolean); var dx,dy:Integer; P : TPoint; begin if Msg.message = WM_LBUTTONDOWN then begin P:=Form1.ScreenToClient(Mouse.CursorPos); if (OldX+50+Map_X < P.X) and (OldX+100+Map_X > P.X) and (OldY+50+Map_Y < P.Y) and (OldY+100+Map_Y > P.Y) then begin dragok:=1; StartX:=P.X; StartY:=P.Y; end; end; if Msg.message = WM_LBUTTONUP then begin dragok:=2; end; if Msg.message = WM_MOUSEMOVE then begin P:=Form1.ScreenToClient(Mouse.CursorPos); dx:=P.X-startX; dy:=P.Y-startY; if dragok=1 then begin Map_X:=Map_X+dx; Map_Y:=Map_Y+dy; end; startX:=P.X; startY:=P.Y; end; end; end. P.S. Код на HTML5. Цитата var canvas=document.getElementById("canvas"); console.log(canvas); var ctx=canvas.getContext("2d"); var BB=canvas.getBoundingClientRect(); var offsetX=BB.left; var offsetY=BB.top; var WIDTH = canvas.width; var HEIGHT = canvas.height; var dragok = false; var startX; var startY; var shapes=[]; shapes.push({x:10,y:100,width:30,height:30,fill:"#444444",isDragging:false}); shapes.push({x:80,y:100,width:30,height:30,fill:"#ff550d",isDragging:false}); shapes.push({x:150,y:100,r:10,fill:"#800080",isDragging:false}); shapes.push({x:200,y:100,r:10,fill:"#0c64e8",isDragging:false}); canvas.onmousedown = myDown; canvas.onmouseup = myUp; canvas.onmousemove = myMove; draw(); function rect® { ctx.fillStyle=r.fill; ctx.fillRect(r.x,r.y,r.width,r.height); } function circle© { ctx.fillStyle=c.fill; ctx.beginPath(); ctx.arc(c.x,c.y,c.r,0,Math.PI*2); ctx.closePath(); ctx.fill(); } function clear() { ctx.clearRect(0, 0, WIDTH, HEIGHT); } function draw() { clear(); for(var i=0;i<shapes.length;i++){ if(shapes[i].width){ rect(shapes[i]); }else{ circle(shapes[i]); }; } document.getElementById("debug").value=ctx.getImageData(0, 0, 1, 1).data; } function myDown(e){ e.preventDefault(); e.stopPropagation(); var mx=parseInt(e.clientX-offsetX); var my=parseInt(e.clientY-offsetY); dragok=false; for(var i=0;i<shapes.length;i++){ var s=shapes[i]; if(s.width){ if(mx>s.x && mx<s.x+s.width && my>s.y && my<s.y+s.height){ dragok=true; s.isDragging=true; } }else{ var dx=s.x-mx; var dy=s.y-my; if(dx*dx+dy*dy<s.r*s.r){ dragok=true; s.isDragging=true; } } } startX=mx; startY=my; } function myUp(e){ e.preventDefault(); e.stopPropagation(); dragok = false; for(var i=0;i<shapes.length;i++){ shapes[i].isDragging=false; } } function myMove(e){ if (dragok){ e.preventDefault(); e.stopPropagation(); var mx=parseInt(e.clientX-offsetX); var my=parseInt(e.clientY-offsetY); var dx=mx-startX; var dy=my-startY; for(var i=0;i<shapes.length;i++){ var s=shapes[i]; if(s.isDragging){ s.x+=dx; s.y+=dy; } } draw(); startX=mx; startY=my; } } |
Сообщ.
#2
,
|
|
|
Можно вот так
procedure TForm1.Timer1Timer(Sender: TObject); var aColor: TColor; begin if rightb = true then begin Map_X := Map_X + 2; end; if leftb = true then begin Map_X := Map_X - 2; end; if upb = true then begin Map_Y := Map_Y - 2; end; if downb = true then begin Map_Y := Map_Y + 2; end; OldX := 0; OldY := 0; Form1.Canvas.Brush.Color:=clWhite; Form1.Canvas.FillRect(Form1.ClientRect); Canvas.Rectangle(100, 100, 150, 150); Canvas.Rectangle(200, 200, 250, 250); Canvas.Brush.Color:=clRed; Canvas.Rectangle(OldX+50+Map_X, OldX+50+Map_Y, OldY+100+Map_X, OldY+100+Map_Y); if (OldX+50+Map_X < 0) and (0 <= OldY+100+Map_X) and (OldX+50+Map_Y < 0) and (0 <= OldY+100+Map_Y) then begin aColor := Form1.Canvas.Pixels[0, 0]; Caption := Format('%d.%d.%d', [LoByte(LoWord(aColor)), HiByte(LoWord(aColor)), LoByte(HiWord(aColor))]); end else Caption := 'Form1'; end; |
Сообщ.
#3
,
|
|
|
Спасибо за помощь. Пригодиться при создании столкновения объектов.
|