一、鼠标控制角色行走(每一步固定距离)
1.首先,要理解角色移动的原理。
2.现在来定义所需变量,在main窗体模块中最顶端输入以下代码。
‘角色坐标的定义 Dim Xn As Single, Yn As Single ‘角色下一步目标 Dim X0 As Single, Y0 As Single ‘角色起点坐标 Dim Xt As Single, Yt As Single ‘角色终点坐标 Dim n As Double ‘位移比例 Dim s As Double ‘ 总位移 Dim k As Double ‘每次增加的位移比例
3.在main窗体中绘制一个timer时间控件,将其Enabled(启动)设为false,Interval(间隔)设为30(这个可以自定义,是用来调整角色移动速度的)。
4.在main窗体模块中Form_MouseDown下,删去Call Draw(X, Y),加入以下代码。
Timer1.Enabled = False ‘用于重新计算 ‘坐标、移动速度计算 Xt = X Yt = Y X0 = Xn Y0 = Yn n = 0 ‘对n进行初始化 s = Sqr((Xt - X0) ^ 2 + (Yt - Y0) ^ 2) ‘两点间距离公式 k = 10 / s ‘k越大速度越快 Timer1.Enabled = True
5.继续在main窗体模块中输入代码(关于timer的周期事件)。
‘定义私有的子过程,意译为每间隔一段时间,自动触发事件 Private Sub Timer1_Timer() Xn = n * (Xt - X0) + X0 ‘Y轴移动 Yn = n * (Yt - Y0) + Y0 ‘X轴移动 n = n + k ‘当n=1时,角色移动完成 ‘调用子过程Draw Call Draw(Xn, Yn) End Sub
6.在main窗体模块中的timer1_timer下,Call Draw(Xn, Yn)后插入代码判断停止,代码如下。
‘到达目的地 If Sqr((Xt - Xn) ^ 2 + (Yt - Yn) ^ 2) <= 5 Then ‘角色与鼠标点击位置距离小于5像素 Timer1.Enabled = False End If
二、角色在移动中的不同朝向和角色初始化
1.运用线性规划的方法,来判断角色的朝向,如下图。
2.在main窗体模块中Form_MouseDown下,在k = 10 / s和Timer1.Enabled = True之间插入代码,代码如下。
(通过之前的线性规划的方法,Y<X 且 Y<-X就等于 Yt-Y0<Xt-X0 且 Yt-Y0<-Xt-X0,就能判断角色面向朝上)
‘面向判断 If Yt - Y0 >= Xt - X0 And Yt - Y0 >= -(Xt - X0) Then ‘ "下" Role.Picture = PictureClip1.GraphicCell(0) ‘数组中第0位为角色朝上 Else If Yt - Y0 <= Xt - X0 And Yt - Y0 <= -(Xt - X0) Then ‘ "上" Role.Picture = PictureClip1.GraphicCell(12) ‘数组中第12位为角色朝下 Else If Yt - Y0 >= Xt - X0 And Yt - Y0 <= -(Xt - X0) Then ‘ "左" Role.Picture = PictureClip1.GraphicCell(4) ‘数组中第4位为角色朝左 Else If Yt - Y0 <= Xt - X0 And Yt - Y0 >= -(Xt - X0) Then ‘ "右" Role.Picture = PictureClip1.GraphicCell(8) ‘数组中第8位为角色朝上 End If End If End If End If
3.在main窗体模块中,输入以下代码,从而实现在程序开始时,就绘制角色。
‘定义私有的子过程,意译为当窗体加装时,触发事件 Private Sub Form_Load() Role.Picture = PictureClip1.GraphicCell(0) ‘角色面朝下 Call Draw(main.Width / 30, main.Height / 30) ‘绘制角色,使其出现在屏幕中央 Xn = main.Width / 30 Yn = main.Height / 30 ‘和上一句一起,使角色在屏幕开始移动 End Sub
4.在main窗体模块中Timer1_Timer下,修改Call Draw(Xn , Yn)为Call Draw(Xn - 15, Yn - 35),使角色与鼠标对齐。
‘调用子过程Draw Call Draw(Xn - 15, Yn - 35) ‘角色的腿部相较于鼠标对齐
三、行走动画
1.在main窗体模块中的顶部位置,输入代码如下。
Dim Rpic As Integer, Ri As Integer ‘用于行走动画判断
2.在main窗体模块中Form_MouseDown下,每一句形如If Yt - Y0 >= Xt - X0 And Yt - Y0 >= -(Xt - X0) Then后插入一句Rpic = 0,具体如下。
‘面向判断 If Yt - Y0 >= Xt - X0 And Yt - Y0 >= -(Xt - X0) Then ‘ "下" Role.Picture = PictureClip1.GraphicCell(0) Rpic = 0 Else If Yt - Y0 <= Xt - X0 And Yt - Y0 <= -(Xt - X0) Then ‘ "上" Role.Picture = PictureClip1.GraphicCell(12) Rpic = 12 Else If Yt - Y0 >= Xt - X0 And Yt - Y0 <= -(Xt - X0) Then ‘ "左" Role.Picture = PictureClip1.GraphicCell(4) Rpic = 4 Else If Yt - Y0 <= Xt - X0 And Yt - Y0 >= -(Xt - X0) Then ‘ "右" Role.Picture = PictureClip1.GraphicCell(8) Rpic = 8 End If End If End If End If
3.在main窗体模块中Timer1_Timer下,在n = n + k和Call Draw(Xn - 15, Yn - 35)之间,插入以下代码。
‘角色行走动画Role.Picture = PictureClip1.GraphicCell(Rpic + Int(Ri / 4)) ‘使其值为0、1、2、3,来达到图片循环的效果 Ri = Ri + 1 If Ri = 16 Then Ri = 0 ‘控制图片的速度,每走四步换一张图
4.在main窗体模块中Timer1_Timer下,在If Sqr((Xt - Xn) ^ 2 + (Yt - Yn) ^ 2) <= 5 Then和Timer1.Enabled = False之间,插入以下代码
Role.Picture = PictureClip1.GraphicCell(Rpic) ‘让角色停止行走是都处于站立状态