1 / 50

罗培羽 — 教你用 VB 制作 RPG 游戏

W a l k i n g O n M a p. 罗培羽 — 教你用 VB 制作 RPG 游戏. 第二节 走在地图上. 罗培羽 作品. QQ:345697666 E_mail : tyxxxx@qq.com 博客: http://hi.baidu.com/mhqy. 上一节回顾. 通过上一节 创造梦想中的主角 的学习,我们学会了如何使我们的角色动起来. 这一节. 代码太乱怎么办 封装你的代码 把代码移到模块中. 封装代码. 新建模块 Do_Walk. 把 角色坐标的定义 移动到模块中

adeola
Télécharger la présentation

罗培羽 — 教你用 VB 制作 RPG 游戏

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. WalkingOnMap 罗培羽—教你用VB制作RPG游戏 第二节 走在地图上

  2. 罗培羽 作品 • QQ:345697666 • E_mail:tyxxxx@qq.com • 博客:http://hi.baidu.com/mhqy

  3. 上一节回顾 • 通过上一节 创造梦想中的主角 的学习,我们学会了如何使我们的角色动起来

  4. 这一节

  5. 代码太乱怎么办 封装你的代码 把代码移到模块中 封装代码

  6. 新建模块Do_Walk • 把角色坐标的定义移动到模块中 • 把Form_MouseDown事件放到过程SetPosition(x As Single, y As Single)中,并调用 • 再调试一下试试 参数类型不符? 因为我们定义数据时没有用Public,修改再调试

  7. 第一行的 main.Role.Picture = main.PictureClip1.GraphicCell(15) 没有任何作用,我们删去 要求对象? 把所有控件的调用语句全部加上窗体名试试 OK

  8. 把TIMER1里的代码放到DoWalk()中 • 同样也要修改控件名 • 还要在Timer1事件里调用

  9. 把FormLoad中的代码放到过程Load中 • 也要修改相关代码,调试试试

  10. 界面太乱怎么办 封装你的控件 把控件移到其他窗体中 封装资源

  11. 新建一个窗体Src • 把PictureClip1移到这个窗体中 • 再调试 要求对象? 把main.PictureClip1换成Src.PictureClip1试试

  12. Role的图片已经没有作用了,删了 • 背景图在上一节中也只是为了美观,删了 • 为了能容易看得清,我们设置背景颜色 在main中的Unload事件中加上Unload Src以在关闭窗体时把Src也卸载

  13. 定义我们的地图 • TYPE • …… • END TYPR 地图实例化

  14. 我们新建一个模块Do_Map来处理地图事件 定义自己的数据类型Dimmap '定义地图变量 Public Type Dimmap Bottom As String Top As String Through As String End Type 定义地图底层 顶层 不可通过区

  15. 地图实例化 '定义地图 Public map1 As Dimmap Public map2 As Dimmap

  16. 执行初始化定义 • 定义一个过程GoDimMap()

  17. Public Sub GoDimMap() '执行初始化定义 '地图1 map1.Bottom = AppDisk + "map/Map1_b.bmp" map1.Top = AppDisk + "map/Map1_Top.bmp" map1.Through = AppDisk + "map/Map1_Through.bmp" '地图2 map2.Bottom = AppDisk + "map/Map2_b.bmp" map2.Top = AppDisk + "map/Map2_Top.bmp" map2.Through = AppDisk + "map/Map2_Through.bmp" End Sub 我们把素材放到目录下 AppDisk代表程序的路径,我们要来定义它

  18. 取得程序位置 但这个函数取得的路径在后面是否带“\”上不统一,因此我们进行判断,若没有带“\”则加上“\” 在Do_Walk中 '定义路径 Public AppDisk As String 在 Load()中 '定义路径 AppDisk = Trim(App.Path) If Right(AppDisk, 1) <> "\" Then AppDisk = AppDisk & "\"

  19. 地图启动函数 • MapStart()

  20. Public Sub MapStart(mapx As Dimmap) ‘地图启动函数……End sub 添加3个与Role一样的Picturebox MapB 用于放置地图底层 MapT用于放置地图顶 MapTh用于放置可行域图层

  21. MapStart main.MapB.Picture = LoadPicture(mapx.Bottom) main.MapT.Picture = LoadPicture(mapx.Top) main.MapTh.Picture = LoadPicture(mapx.Through) 在Load中调用 '调用地图启动函数 MapStart (map1)

  22. 我们还要绘图 在Draw()中画主角上面加上(在其上面就是先画地图,再话主角。这样主角才能在地图上边) '画地图 GdiTransparentBlt main.hDC, 0, 0, main.MapB.Width, main.MapB.Height, main.MapB.hDC, 0, 0, main.MapB.Width, main.MapB.Height, RGB(255, 255, 255) '画图

  23. 地图跟随 • 要让地图移动我没让你要让地图的坐标(Xm,Ym)、角色相对屏幕坐标(Xs,Ys)、角色相对地图坐标(Xn,Yn)相互配合 • 分段函数 (Xm,Ym) 地图 屏幕 Xn Xs 角色

  24. 定义(在Do_Map)'定义地图位置变量Public Xm As SinglePublic Ym As Single 定义(在Do_Walk)Public Xs As Single, Ys As Single '角色相对屏幕坐标

  25. 写一个处理位置的过程MapMove() '横坐标 If Xn <= main.Width / 30 Then Xs = Xn Else If Xn >= main.MapB.Width - main.Width / 30 Then Xs = Xn + Xm Else Xs = main.Width / 30 Xm = Xs - Xn End If End If

  26. 解释下 If Xn <= main.Width / 30 Then Xs = Xn Xn 屏幕 地图 窗体宽度的(大小是分辨率的15倍)的一半 Xs 角色

  27. If Xn >= main.MapB.Width - main.Width / 30 Then Xs = Xn + Xm 屏幕 Xn Xs 角色 -Xm 地图

  28. 在中间时 角色在中间 Else Xs = main.Width / 30 Xm = Xs - Xn 地图 屏幕 Xn Xs 角色 -Xm

  29. 同理 '纵坐标 If Yn <= main.Height / 30 Then Ys = Yn Else If Yn >= main.MapB.Height - main.Height / 30 Then Ys = Yn + Ym Else Ys = main.Height / 30 Ym = Ys - Yn End If End if

  30. 调用 • 在DoWalk()后‘行走动画处理后加上 • Call MapMove • 在Draw()中‘画地图后的 0,0 改为Xm,Ym • 在Draw的调用中(Xn,Yn)换成(Xs,Ys)因为我们的显示是相对屏幕而言的

  31. 在SetPosition中把 目标位置转换为相对地图的位置 ‘坐标、移动速度计算 Xt= Yt= 换成 Xt = x - Xm - main.Role.Width / 2 '其中- Role.Width / 2是让鼠标指定的坐标处于角色中心 Yt = y - Ym - main.Role.Height / 2 '其中- Role.Height / 2是让鼠标指定的坐标处于角色中心 地图 屏幕 x 目标位置 -Xm 角色 Xt

  32. 成功 • 我们在LOAD中调用MAP2试试 但我们在走第一步时总感觉怪怪的,修改下

  33. 进入地图时的坐标 进入地图时的面向 MapStart(mapx As Dimmap, x As Single, y As Single, T As Integer) ‘地图启动函数 ……(下面把LOAD的大部分代码放入地图启动函数) Xn = x Yn = y main.Role.Picture = Src.PictureClip1.GraphicCell(T) Call MapMove Call Draw(Xs, Ys)

  34. 把LOAD中的Xn = 200Yn = 400main.Role.Picture = Src.PictureClip1.GraphicCell(0)Call Draw(Xs, Ys)删去,再将Call MapStart(map2)改为Call MapStart(map2,100,100,0)再修改下参数试试

  35. 地图遮挡

  36. 这个容易 在Draw中最后加上 '画地图顶层 GdiTransparentBlt main.hDC, Xm, Ym, main.MapB.Width, main.MapT.Height, main.MapT.hDC, 0, 0, main.MapB.Width, main.MapB.Height, RGB(255, 255, 255) '画图

  37. 可行区域判断

  38. 定义取色API Do_Walk中 '以下是进行不可行区域的处理,即取色 Public Declare Function GetPixel Lib "gdi32" (ByVal hDC As Long, ByVal x As Long, ByVal y As Long) As Long 这个API可以对指定的图片的指定位置进行取色,当是黑色时会返回零

  39. '到达目的地 If Sqr((Xt - Xn) ^ 2 + (Yt - Yn) ^ 2) <= 5 Then 换成 '到达目的地或者遇到障碍 If Sqr((Xt - Xn) ^ 2 + (Yt - Yn) ^ 2) <= 5 Or GetPixel(main.MapTh.hDC, Xn + main.Role.Width / 2, Yn + main.Role.Height / 1.5) = 0 Then (Xt,Yt) 角色 运行试试 我们要对这个点判断

  40. 遇到障碍, 主角永远走不了了? 写个StopWalking()把到达目的地或者遇到障碍除判断后只调用这个过程,把其后的代码转入StopWalking()中,当然这时的运行结果还是没改变

  41. 在StopWalking()中代码的前面加上 n = n - 2 * k Call DoWalk 我们让角色退一步 (为什么不退一步,在上一次调用DoWalk()中,已经进行了n=n+k,所以现在要-2k才能达到后退一步的效果)

  42. 添加背景音乐 添加 并Src中加上这个控件的一个对象,(为什么不在main中,你可以试试看效果如何) 随便添加个音乐试试 在 自定义 常规中我们设播放计数为999

  43. 在定义地图变量中加上一个变量 Music As String 添加music文件夹,并加上音乐文件 在地图定义中: '地图1 …… map1.Music = AppDisk + "music/map1.mp3" '地图2 …… map2.Music = AppDisk + "music/map2.mp3"

  44. 地图启动函数MapStart() 在第一句加上 Src.WindowsMediaPlayer1.URL = mapx.Music '音乐处理

  45. 修改窗体属性 .borderstyle=1 .caption = 游戏名 Eg:何夕谈笑间 .icon = 游戏图标 (建立icon文件夹) .mouseicon = 鼠标图标 (mousepointer = 99) 窗体布局-启动着位置-屏幕中心

  46. 我们还要让我们的伙伴NPC出现在地图上,并能与我们的主角进行交互,怎么办呢?我们还要让我们的伙伴NPC出现在地图上,并能与我们的主角进行交互,怎么办呢? • 下节课,我们将会制作NPC事件。

  47. 不要忘记了我们的目标

  48. 谢谢支持 来吧! 一起探索宇宙的奥妙

More Related