---------------窗体编程:平滑移动---------------
相信大家有时会编一些小游戏。但是你会发现,让角色直上直下的移动非常容易,但是按一定角度移动就比较困难了。
今天来教大家一个方法,让大家可以让一个点或图片在窗体中平滑移动。
首先,我们需要把原理搞清楚:
- 计算出每次需要向上或者下移动多少,以及每次需要向左或者右移动多少;
- 重复循环计算出新坐标,并执行相应的操作。
第一步:计算每次要移动多远
计算每次要移动多远,这是公式:
x轴上每次要移动的距离=(方向/90)除以1的余数
y轴上每次要移动的距离=-((1-(方向/90))除以1的余数)
括号里面的算式要算成小数!
很简单,对吧?
这是代码(适用于Java,C#,C,C++):
double toward=<方向>;
double movex=(toward/90.0)%1;//x轴上每次要移动的距离
double movey=-((1-(toward/90.0))%1); //y轴上每次要移动的距离
另一个代码版本(适用于Python):
toward=<方向>
movex=(toward/90.0)%1 #x轴上每次要移动的距离
movey=-((1-(toward/90.0))%1) #y轴上每次要移动的距离
不过,这还不是做精确的,还有两个bug:
如果方向是90的倍数(或者为0),两个算式算出来的结果就会都是是0,就会出现角色完全不动的现象;
如果方向大于180或小于0,这个算式将会失效。
所以,我们还需要对代码做一些修改:
这个版本适用于Java,C#,C,C++。
double toward=<方向>;
if(toward<0){
toward=360+toward;
} //将负数角度转换为等价的正数角度
double movex=(toward/90.0)%1;//x轴上每次要移动的距离
double movey=-((1-(toward/90.0))%1); //y轴上每次要移动的距离
if(toward>180){
double ntw=toward-180;
movex=-((ntw/90.0)%1);
movey=(1-(ntw90.0))%1;
} //角度大于180度的时候的特殊处理
if(toward==0||toward==360){
movex=0.0;
movey=-1.0;
}
if(toward==90){
movex=1.0;
movey=0.0;
}
if(toward==180){
movex=0.0;
movey=1.0;
}
if(toward==270){
movex=-1.0;
movey=0.0;
} //处理角度为0或者角度是90的倍数时的特殊情况
这个版本适用于python。
toward=<方向>;
if(toward<0.0){
toward=360.0+toward;
} #将负数角度转换为等价的正数角度
movex=(toward/90.0)%1;#x轴上每次要移动的距离
movey=-((1-(toward/90.0))%1); #y轴上每次要移动的距离
if(toward>180.0){
ntw=toward-180.0;
movex=-((ntw/90.0)%1);
movey=(1-(ntw90.0))%1;
} #角度大于180度的时候的特殊处理
if(toward==0 or toward==360){
movex=0.0;
movey=-1.0;
}
if(toward==90){
movex=1.0;
movey=0.0;
}
if(toward==180){
movex=0.0;
movey=1.0;
}
if(toward==270){
movex=-1.0;
movey=0.0;
} #处理角度为0或者角度是90的倍数时的特殊情况
第二步:循环移动坐标点以及做你要做的操作
假设我们要做的操作是循环移动一张图片。
这部分就很简单了,下面的代码是接着上面的代码的(这个代码只适用于Java):
Graphics g=<你的Graphics>;
Image image=<你的图像>;
double x=0.0;
double y=0.0;
while(<你的循环条件>){
x=x+movex;
y=y+movey;
g.drawImage(image,(int)x,(int)y,null);
}
完整代码
这段代码只适用于Java。
double toward=<方向>;
if(toward<0){
toward=360+toward;
}
double movex=(toward/90.0)%1;
double movey=-((1-(toward/90.0))%1);
if(toward>180){
double ntw=toward-180;
movex=-((ntw/90.0)%1);
movey=(1-(ntw90.0))%1;
}
if(toward==0||toward==360){
movex=0.0;
movey=-1.0;
}
if(toward==90){
movex=1.0;
movey=0.0;
}
if(toward==180){
movex=0.0;
movey=1.0;
}
if(toward==270){
movex=-1.0;
movey=0.0;
}
Graphics g=<你的Graphics>;
Image image=<你的图像>;
double x=0.0;
double y=0.0;
while(<你的循环条件>){
x=x+movex;
y=y+movey;
g.drawImage(image,(int)x,(int)y,null);
}