首页 > 代码库 > 子数涵数·VB——角色行走

子数涵数·VB——角色行走

一、鼠标控制角色行走(每一步固定距离)

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 / sTimer1.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 + kCall 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 ThenTimer1.Enabled = False之间,插入以下代码

Role.Picture = PictureClip1.GraphicCell(Rpic) 让角色停止行走是都处于站立状态

 

子数涵数·VB——角色行走