如何控制图像的移动速度而不至于让我们觉得图像的移动不稳(有点跳动)(加急!!)(200分)

  • 主题发起人 主题发起人 whiterock
  • 开始时间 开始时间
W

whiterock

Unregistered / Unconfirmed
GUEST, unregistred user!
我最近写了一个小程序目的为了实现图像的移动(上下移动)算法是在时钟中加入如下语句:
image1.top:=image1.top+i(其中 i 是变量可以由我们自己改变目的是为了改变图像的移动
速度)可是,当速度足够快时总感觉图像是在跳动,不稳定(时钟的频率设为20。)不知道
各位大虾有没有好办法来解决这个问题。本人愿倾请其所有给200分!我曾试着改变时钟的
频率但是无能为力!还请高手赐教如何实现图像移动速度足够大海不会感觉图像有都抖动的
不舒服感觉!如果是我的算法有误请指正并恳请赐予阁下的好算法!多谢!
 
在Form的OnCreate事件中,加入:
Image1.Parent.DoubleBuffered := True;
当然,你可以直接写它的Parent的DoubleBuffered为True,如
Panel1.DoubleBuffered:=True、Form1.DoubleBuffered := True之类。。
 
我试过双缓冲了不能达到理想的效果!字体过大和速度过快尤为明显的哆嗦!请各位大虾帮忙解决!
 
把Image放在Panel里面一起移动,这样效果会好很多。
 
都不行,还有没有更好的方法呀!难道就没有人会吗?!期待高人!
 
开来帮帮我!
 
给你发一个剽窃程序,还不错。
var{定义变量}
Form1:TForm1;
x,tt,l,h:integer;
pic:Trect;
map:Tbitmap;{具体动画演示代码}
procedureTForm1.Timer1Timer(Sender:TObject);
begin
x:=x-1;
tt:=tt-1;
if x<-160 then
x:=image1.height+20;
tt:=x+80;
image1.Canvas.font.size:=18;
image1.Canvas.font.color:=$1200ffff;
image1.Canvas.TextOut(10,x,’OK字幕移动演示’);
image1.Canvas.font.size:=12;
image1.Canvas.font.color:=$120000ff;
image1.Canvas.TextOut(20,x+50,’字体变色效果演示’);
l:=image1.Canvas.textwidth(’字体变色效果演示’);
h:=image1.Canvas.textheight(’字体变色效果演示’);
image1.Canvas.pen.color:=clGreen;
image1.Canvas.moveto(20,h+x+50-2);
image1.Canvas.lineto(20+l,h+x+50-2);
pic.topleft.x:=30;
pic.topleft.y:=tt;
pic.bottomright.x:=pic.topleft.x+100;
pic.bottomright.y:=pic.topleft.y+80;
image1.canvas.stretchdraw(pic,map);
image1.Canvas.pen.color:=clGreen;
image1.Canvas.moveto(0,pic.topleft.y+80);
image1.Canvas.lineto(pic.topleft.x+100,pic.topleft.y+80);
end;

{以下设置动画初值}
procedureTForm1.FormCreate(Sender:TObject);
begin
timer1.enabled:=true;
timer1.Interval:=10;
x:=image1.height+20;
tt:=x+80;
form1.repaint;
image1.Canvas.brush.color:=clGreen;
pic:=Rect(0,0,image1.width,image1.height);
image1.Canvas.FillRect(pic);
pic:=Rect(-1,-1,1,1);
map:=Tbitmap.create;
map.loadfromfile(’d:windows256color.bmp’);
image1.canvas.stretchdraw(pic,map);
end;
 
我也过同样的情况 如果是字体大的话用双缓冲都不管用!
whiterock 你好! 如果解决了的话通知我一声! 我也想知道是怎么回事
 
按说是上面的方法是可以的,实在不行就用控件吧。
 
[blue]必须用directX.若用双缓冲可以在一定程度上解决问题.但是根本原因在于:图形显示和刷新是不同步的.
用基本的图形处理方法(即WinAPI的绘图函数)根本不行.只有directX或openGL之类图形接口
可以保证动态图形显示质量.因为不管你用怎样的频率去更新image(20ms也好,200ms也好),
directx都会把它写进屏幕缓冲,然后根据显示器的刷新频率来刷新.[/blue]
 
也可用OpenGl
 
procedure WMERASEBKGND(var Msg:TMessage);message WM_ERASEBKGND;
begin
inherited;
Msg.Result:=0(1?);
end;
 
你可以考虑使用双缓冲来实现无闪烁的动画,
其基本思想是以足够快的速度将一系列精致的画面显示出来。
产生流畅的效果。看一下代码:
procedure TAnimThread.DrawAnimPic;
begin
BitBlt(AnimWindow.Canvas.Handle,0,0,AnimWindow.Width,32,b.Canvas.Handle,0,0,SRCCOPY);
end;

procedure TAnimThread.Execute;
var
x,i: Integer;
dir,run: Boolean;
begin
b := TBitMap.Create;
b.Width := AnimWindow.Width;
b.Height := 32;
b.Canvas.Pen.Color := clBtnFace;
b.Canvas.Brush.Color := clBtnFace;
b.Canvas.Rectangle(0,0,AnimWindow.Width,32);
run := True;
dir := False;
x := 0;
while run do
for i := 0 to AnimWindow.ImageList1.Count-1 do
begin
b.Canvas.Rectangle(0,0,AnimWindow.Width,32);
AnimWindow.ImageList1.Draw(b.Canvas,x,0,i);
Synchronize(DrawAnimPic);
Sleep(AnimWindow.SpinEdit1.Value);
if (x = 0) or (x = 300) then dir := not dir;
if dir then Inc(x) else Dec(x);
end;
b.Free;
end;

procedure TAnimWindow.FormActivate(Sender: TObject);
begin
AnimThread := TAnimThread.Create(False);
end;

end.
 
我也在找这个问题的答案,
只是知道是计算机模拟运动时缺失了部分运动细节所以看上去画面是跳动的,
有几个研究这个问题的网站,大家可以研究一下,如果有什么发现,请告诉我
分享一下
http://www.codingnow.com/2000/frame.htm?http://www.codingnow.com/2000/gamedev/tips/palpitat.htm
 
用设置窗口原点的方法,移动窗口原点而达到移动图片的效果。

我记得好象是最不哆嗦的。
 

Similar threads

D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部