设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 4437|回复: 4
打印 上一主题 下一主题

[技术分享] [PPG-Q堂式炸弹人【教程】]给需要制作PPG游戏的人的帖子!

[复制链接]
梦石
0
星屑
681
在线时间
791 小时
注册时间
2011-10-20
帖子
2394

开拓者

跳转到指定楼层
1
发表于 2012-4-30 08:52:12 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
本帖最后由 end55rpg 于 2012-5-6 19:56 编辑

####################################################
原贴地址:http://rpg.blue/forum.php?mod=po ... =1878426&page=1
欢迎发表PPG类型游戏教程帖,下面就是一个,如果您的教学很好,那可以置顶哦!
发布者:END55RPG.
(如果你有好的想法,可以回复,一起讨论)
####################################################
让我们来学着做一个炸弹人游戏吧!


4月4号                                                               
首先,不要考虑效率问题。
然后来确定制作的列表吧




1.PP爆炸可以用动画的形式
(不足处:动画会建立至少15个sprite,影响移动时候的流畅。)
2.泡泡事件的制作内容
(需要涉及爆炸范围的碰撞检查:如事件,图块通行)
3.敌人的设置




目前就这些吧,开工!
遵循一个规律:先把简单的做好再慢慢完善:
泡泡爆炸时候威力我们先设为一个定值吧,就取2吧,也就是说泡泡爆炸的范围如下:
       ○
       ○
○○ X ○○
       ○

       ○
  1. $power = 2 #威力设置为2
复制代码
现在制作泡泡了吧
1.先设置好图像(随便)
2.当按下C(空格)就会放炮所以如下:

3.如图设置好后,必须要把事件移动到主角位置上并显示图像
所以我们可以在按下空格后切换事件页:
在第一个事件页中我们必须把泡泡传送过去:

其实红框中的部分可以替代为:
  1. x = $game_player.x                 #代入角色X坐标
  2. y = $game_player.y                 #代入角色Y坐标
  3. id = @event_id                         #获取本事件ID
  4. event = $game_map.events[id]#用ID获取本事件
  5. event.moveto(x,y)                   #移动到指定位置
复制代码
4.继续在第2张事件页里做,要勾一些选项如下图:

5.看完图了吧,然后进入3事件页,我们真正的制作就开始了!!

看完图片了吧?
下面讲解一下方块中的脚本:

  1. #自己的坐标
  2. ox = $game_map.events[@event_id].x
  3. oy = $game_map.events[@event_id].y
  4. #遍历地图所有事件
  5. for event in $game_map.events.values
  6. #获取事件XY
  7. x = event.x
  8. y = event.y
  9. if (x - ox).abs <= 2 and (y - oy).abs <= 2
  10. event.erase
  11. end
  12. end
复制代码
for event in $game_map.events.values这一句的意思是循环查询地图上的事件,
用来判断事件是否被炸。
(如果地图上事件越多查询就会越久,优化方案以后说明)
if (x - ox).abs <= 2 and (y - oy).abs <= 2
event.erase
end
这一句可能较难理解吧。
翻译过来是:
如果查询事件的X坐标 减去 自己的X坐标 的绝对值 小于等于 2(威力为2) 并且 查询事件的Y坐标 减去 自己的Y坐标 的绝对值 小于等于 2
       那么此事件将被炸掉(消除)
完毕

好了,基本如此,如果想制作炸掉名字为带有“ENEMY”的事件需要慢慢完善。
这只是炸掉事件的简单部分,更复杂的元件通行阻碍泡泡需要完全颠覆上面的内容,而且动画也要随之变化。。。。
(说明:用4个动画来显示泡泡爆炸实在不是一种高效的办法,会发现FPS骤降)
这只是一个泡泡,如果要有许多泡泡还需要制作哦
= =废话少说!
5。制作爆炸后的页面并返回循环泡泡的一生!





今天的功课就这样了!!
以后持续更新最终完全成为一个炸弹人范例!
如果对这种游戏做法感兴趣可以下载去年我发布的QQ堂作为参考:
http://www.66rpg.com/articles/2679

‘‘──end55rpg于2012-4-4 15:28补充以下内容


4月8号                                                  
今天添加教程咯:添加了手稿= =

看不到下载范例吧= =!!!!!
4月9号                                                  
今天发布最后完整版的PP事件内容,还有爆炸时候的完整脚本哦:
那几个月制作脚本不知挖空了多少心思,前几个月,为了效率不知改了多少次:
下面有图有脚本:




脚本如下:
  1. #4。0更新的东西:
  2. #准备把CHECK_EVENT2建立一个HASH查询!
  3. #全方面把BUG取缔,革命性的转折。
  4. #-------------------------------如果要出ver5
  5. #那么把4个方向的每块坐标运算改成范围只运算4次,并且还有……
  6. #找出放15泡FPS降低的根源。。。。。
  7. module QQT
  8. def self.pp_data(event_id)
  9. #===============================NEW这玩意儿比的是全局更新,故可以是全局变量
  10. $phash = {}
  11. for event in $game_map.events.values
  12. if $phash[[event.x,event.y]]
  13. $phash[[event.x,event.y]] += [event]
  14. else
  15. $phash[[event.x,event.y]] = [event]
  16. end
  17. end
  18. #===============================
  19. #begin-------------
  20. id = $game_map.events[event_id]
  21. x,y = id.x,id.y
  22. po = $pp_power.to_i
  23. event = $game_map.check_all_event(x, y,"敌人") rescue []
  24. map_id = $game_map.map_id
  25. damage = $game_party.actors[0].base_atk
  26. suipian = []
  27. person = "主角"
  28. #Center Bing Bong
  29. event.each{|e|
  30. e.damage_hp(po*100)
  31. }
  32. event = $game_map.check_event2(x, y,"普通")
  33. if $game_player.x == x and $game_player.y == y
  34. $game_player.damage_hp_player2(damage)
  35. end
  36. if $game_player2.x == x and $game_player2.y == y
  37. $game_player2.damage_hp_player2(damage)
  38. end
  39. if event != nil
  40. event.each{|a|
  41. $game_self_switches[[map_id,a.id,"A"]]=true
  42. a.refresh
  43. }
  44. end
  45. #Four Diraction
  46. #UP
  47. for yi in 1..po
  48. event = $game_map.check_all_event(x, y-yi,"敌人") rescue []
  49. if $game_map.tag_down(x, y-yi) == 1
  50. $suipian.push Sprite_Suipian.new($v,x,y-yi)
  51. suipian.push [x,y-yi]
  52. yi -= 1
  53. break
  54. elsif $game_map.through?(x,y-yi,2) == false
  55. yi -= 1
  56. break
  57. end
  58. event.each{|e|e.damage_hp(damage)}
  59. if $game_player.x == x and $game_player.y == y-yi
  60. $game_player.damage_hp_player2(damage)
  61. end
  62. if $game_player2.x == x and $game_player2.y == y-yi
  63. $game_player2.damage_hp_player2(damage)
  64. end
  65. event = $game_map.check_event2(x, y-yi,"普通")
  66. if event != []
  67. event.each{|a|
  68. $game_self_switches[[map_id,a.id,"A"]]=true
  69. a.refresh}
  70. break
  71. end
  72. if $game_map.tag_down(x, y-yi) == 6 # 炸掉元件道具
  73. edit(map_id,x,y-yi,1,0)
  74. end
  75. end
  76. up=yi
  77. #DOWN::3处修改加减号:y-yi
  78. for yi in 1..po
  79. event = $game_map.check_all_event(x, y+yi,"敌人") rescue []
  80. if $game_map.tag_down(x, y+yi) == 1
  81. $suipian.push Sprite_Suipian.new($v,x,y+yi)
  82. suipian.push [x,y+yi]
  83. yi -= 1
  84. break
  85. elsif $game_map.through?(x,y+yi,2) == false
  86. yi -= 1
  87. break
  88. end
  89. event.each{|e|e.damage_hp(damage)}
  90. if $game_player.x == x and $game_player.y == y+yi
  91. $game_player.damage_hp_player2(damage)
  92. end
  93. if $game_player2.x == x and $game_player2.y == y+yi
  94. $game_player2.damage_hp_player2(damage)
  95. end
  96. event = $game_map.check_event2(x, y+yi,"普通")
  97. if event != []
  98. event.each{|a|
  99. $game_self_switches[[map_id,a.id,"A"]]=true
  100. a.refresh}
  101. break
  102. end
  103. if $game_map.tag_down(x, y+yi) == 6
  104. edit(map_id,x,y+yi,1,0)
  105. end
  106. end
  107. down=yi
  108. #LEFT
  109. for xi in 1..po
  110. event = $game_map.check_all_event(x-xi, y,"敌人") rescue []
  111. if $game_map.tag_down(x-xi, y) == 1
  112. #p"这里是可炸地,待会爆炸,并跳出FOR循环结束左泡浆!"
  113. $suipian.push Sprite_Suipian.new($v,x-xi,y)
  114. suipian.push [x-xi,y]
  115. xi -= 1
  116. break
  117. elsif $game_map.through?(x-xi,y,2) == false
  118. xi -= 1
  119. break
  120. end
  121. event.each{|e|e.damage_hp(damage)}
  122. if $game_player.x == x-xi and $game_player.y == y
  123. $game_player.damage_hp_player2(damage)
  124. end
  125. if $game_player2.x == x-xi and $game_player2.y == y
  126. $game_player2.damage_hp_player2(damage)
  127. end
  128. event = $game_map.check_event2(x-xi, y,"普通")
  129. if event != []
  130. event.each{|a|
  131. $game_self_switches[[map_id,a.id,"A"]]=true
  132. a.refresh}
  133. break
  134. end
  135. if $game_map.tag_down(x-xi, y) == 6
  136. edit(map_id,x-xi,y,1,0)
  137. end
  138. end
  139. left=xi
  140. ###==RIGHT===========
  141. for xi in 1..po
  142. event = $game_map.check_all_event(x+xi, y,"敌人") rescue []
  143. if $game_map.tag_down(x+xi, y) == 1
  144. $suipian.push Sprite_Suipian.new($v,x+xi,y)
  145. suipian.push [x+xi,y]
  146. xi -= 1
  147. break
  148. elsif $game_map.through?(x+xi,y,2) == false
  149. xi -= 1
  150. break
  151. end
  152. event.each{|e|e.damage_hp(damage)}
  153. if $game_player.x == x+xi and $game_player.y == y
  154. $game_player.damage_hp_player2(damage)
  155. end
  156. if $game_player2.x == x+xi and $game_player2.y == y
  157. $game_player2.damage_hp_player2(damage)
  158. end
  159. event = $game_map.check_event2(x+xi, y,"普通")
  160. if event != []
  161. event.each{|a|
  162. $game_self_switches[[map_id,a.id,"A"]]=true
  163. a.refresh}
  164. break
  165. end
  166. if $game_map.tag_down(x+xi, y) == 6
  167. edit(map_id,x+xi,y,1,0)
  168. end
  169. end
  170. edit(map_id,x,y,1,0)
  171. right=xi
  172. return [up, down, left, right] , suipian
  173. $game_map.events[event_id].animation_id = up-1+130
  174. $game_map.events[event_id].animation_id = down-1+137 unless down-1+137 == 136
  175. $game_map.events[event_id].animation_id = left-1+144 unless left-1+144 == 143
  176. $game_map.events[event_id].animation_id = right-1+151 unless left-1+151 == 150
  177. end
  178. end
  179. #=====================================================
  180. class Game_Map
  181. #--------------------------------------------------------------------------
  182. # ● 获取指定位置的事件 ID
  183. # x : X 坐标
  184. # y : Y 坐标
  185. #--------------------------------------------------------------------------
  186. def check_event(x, y)
  187. for event in $game_map.events.values
  188. if event.x == x and event.y == y
  189. next if event.character_name == ""
  190. return ev_id
  191. end
  192. end
  193. end
  194. end
  195. #New
  196. class Game_Map
  197. #--------------------------------------------------------------------------
  198. # ● 获取指定位置的事件 ID
  199. # x : X 坐标
  200. # y : Y 坐标
  201. #--------------------------------------------------------------------------
  202. def check_event2(x, y,name)#name = 普通
  203. for event in $game_map.events.values
  204. if event.x == x and event.y == y
  205. if event.character_name.index(name) or
  206. (name == '敌人' and event.name.index('en='))
  207. return event.id
  208. end
  209. end
  210. end
  211. return 0
  212. end
  213. end
  214. #New
  215. class Game_Map
  216. #--------------------------------------------------------------------------
  217. # ● 获取指定位置的事件 ID
  218. # x : X 坐标
  219. # y : Y 坐标
  220. #--------------------------------------------------------------------------
  221. def check_all_event(x, y,name)#name = 敌人
  222. a = $phash[[x,y]].to_a
  223. c = []
  224. a.each{|b|c.push b if b.character_name.index(name) or (b.name.index('en=') and b.hp > 0)}
  225. return c
  226. end
  227. def check_event2(x, y,name)#name = 普通
  228. a = $phash[[x,y]].to_a
  229. c = []
  230. a.each{|b|c.push b if b.character_name.index(name)}
  231. return c
  232. end
  233. end
  234. #========================
  235. ↑找怪脚本↓爆炸动画
  236. #=====================
  237. class Sprite_PPJS < Sprite
  238. #--------------------------------------------------------------------------
  239. # ● 初始化对像
  240. # viewport : 显示端口
  241. #--------------------------------------------------------------------------
  242. def initialize(viewport, cha, power, dir)
  243. super(viewport)
  244. @cha, @power, @dir = cha, power, dir
  245. @count = 0
  246. self.bitmap = RPG::Cache.picture("PPJS3")
  247. # 将活动块设置为可见
  248. self.visible = true
  249. # 设置活动块的坐标
  250. case @dir
  251. when 2
  252. self.angle = -90
  253. @x2 = 32
  254. @y2 = 32
  255. when 4
  256. self.angle = -180
  257. @y2 = 32
  258. when 6
  259. self.angle = -0
  260. @power += 1
  261. when 8
  262. self.angle = 90
  263. end
  264. self.x = @cha.screen_x - 16 + @x2.to_i
  265. self.y = @cha.screen_y - 32 + @y2.to_i
  266. self.z = @cha.screen_z(32)
  267. self.opacity = 225
  268. self.src_rect.set(([url=mailto:10-@power)*32]10-@power)*32[/url], 0, @power*32, 32)
  269. self.zoom_x, self.zoom_y = 0.95,0.95
  270. update
  271. end
  272. #--------------------------------------------------------------------------
  273. # ● 释放
  274. #--------------------------------------------------------------------------
  275. def dispose
  276. if self.bitmap != nil
  277. self.bitmap.dispose
  278. end
  279. super
  280. end
  281. #--------------------------------------------------------------------------
  282. # ● 释放
  283. #--------------------------------------------------------------------------
  284. def dispose2
  285. if self.bitmap != nil
  286. self.visible = false
  287. end
  288. #super
  289. end
  290. #--------------------------------------------------------------------------
  291. # ● 更新画面
  292. #--------------------------------------------------------------------------
  293. def update
  294. @count += 1
  295. self.x = @cha.screen_x - 16 + @x2.to_i
  296. self.y = @cha.screen_y - 32 + @y2.to_i
  297. 渐变x()
  298. return false if @count == 15
  299. super
  300. end
  301. def 渐变x()
  302. self.zoom_x += 0.005
  303. end
  304. end
复制代码
因为那个动画效率太低,所以替换为自制类显示动画,图像也尽量改进加速!
泡泡动画图:请放在PICTURE包包里:(通过旋转,截取形成4方向爆炸和威力可改)

还是把范例拿出来吧:
(自己玩自己游戏玩疯了)
这个区人怎么这么少啊!
哇哈哈我的图没有崩!
请提问吧!
’’
4月13号                                                  
今天已经没有任务了哦,现在就动手制作吧,对了
有什么疑难请回复!!!



点评

你好久都没上线哦。  发表于 2013-3-11 12:10
请问你还在么?  发表于 2013-2-23 12:47

评分

参与人数 1星屑 +60 收起 理由
灵魂の补给 + 60 认可答案

查看全部评分

欢迎点此进入我的egames.wink.ws,有RMQQ堂等

[url=http://rpg.blue/thread-317273-1-1.html]短篇八-赶选

http://yun.baidu.com/share/link?shareid=2158225779&uk=169642147&third=0


历险ARPG赢回你的疆域新的战斗模式?…………点击这里:[宋乱贼狂 for QQ堂]
http://rpg.blue/group-368-1.html
programing ....?
[url=http://rpg.blue/thrd-234658-1-1.html]
梦石
0
星屑
50
在线时间
154 小时
注册时间
2011-7-9
帖子
423
2
发表于 2012-5-1 12:42:44 | 只看该作者
好枯燥的教程,给分!
New Game:  【QQ堂4.6单机版】(9月新版!【点此】)个人提供快速网盘http://ad.jlweb.tk/upload/ --- 密码:abcdefg
激零工作室孵化中.....网游make中。。招收游戏监督一名,上线时间:5~12 小时 招收脚本员,美工数位。。
本人Q:330639889 验证:zs    ----广:愿意帮我宣传签名的,站内PM
下面的东西是什么?!请进:http://tieba.baidu.com/p/1453289014【2012最新炸弹型ARPG游戏,历时2年间断坚持制作!】
[img=646,262]http://ftp.66rpg.com/WEB_PLUS/attachment/forum/201203/28/1655578kbk8bqkfazk2
回复 支持 反对

使用道具 举报

梦石
0
星屑
144
在线时间
628 小时
注册时间
2012-6-9
帖子
1321
3
发表于 2012-10-2 15:06:05 | 只看该作者
lz我看不懂,求简单一点的教程。谢谢了。

点评

LZ,还没有回复这条呢???  发表于 2012-10-4 16:40
回复 支持 反对

使用道具 举报

梦石
0
星屑
144
在线时间
628 小时
注册时间
2012-6-9
帖子
1321
4
发表于 2012-10-2 15:12:00 | 只看该作者
本帖最后由 c248611 于 2012-10-4 16:39 编辑




3.如图设置好后,必须要把事件移动到主角位置上并显示图像
所以我们可以在按下空格后切换事件页:
在第一个事件页中我们必须把泡泡传送过去:



设置事件位置:本事件,变量[0006][0007]

如何在事件中调出?变量[0006][0007]

点评

我补充好了  发表于 2012-10-4 16:39
???什么在哪一行?  发表于 2012-10-4 14:11
回复 支持 反对

使用道具 举报

梦石
0
星屑
144
在线时间
628 小时
注册时间
2012-6-9
帖子
1321
5
发表于 2013-2-18 21:15:01 | 只看该作者
这图挂掉了。

点评

。。。。  发表于 2013-3-10 11:40
回复 支持 反对

使用道具 举报

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-5-2 07:53

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表