赞 | 0 |
VIP | 12 |
好人卡 | 42 |
积分 | 7 |
经验 | 44348 |
最后登录 | 2024-4-1 |
在线时间 | 791 小时 |
- 梦石
- 0
- 星屑
- 690
- 在线时间
- 791 小时
- 注册时间
- 2011-10-20
- 帖子
- 2394
|
加入我们,或者,欢迎回来。
您需要 登录 才可以下载或查看,没有帐号?注册会员
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.先设置好图像(随便)
2.当按下C(空格)就会放炮所以如下:
3.如图设置好后,必须要把事件移动到主角位置上并显示图像
所以我们可以在按下空格后切换事件页:
在第一个事件页中我们必须把泡泡传送过去:
其实红框中的部分可以替代为:- x = $game_player.x #代入角色X坐标
- y = $game_player.y #代入角色Y坐标
- id = @event_id #获取本事件ID
- event = $game_map.events[id]#用ID获取本事件
- event.moveto(x,y) #移动到指定位置
复制代码 4.继续在第2张事件页里做,要勾一些选项如下图:
5.看完图了吧,然后进入3事件页,我们真正的制作就开始了!!
看完图片了吧?
下面讲解一下方块中的脚本:
- #自己的坐标
- ox = $game_map.events[@event_id].x
- oy = $game_map.events[@event_id].y
- #遍历地图所有事件
- for event in $game_map.events.values
- #获取事件XY
- x = event.x
- y = event.y
- if (x - ox).abs <= 2 and (y - oy).abs <= 2
- event.erase
- end
- 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事件内容,还有爆炸时候的完整脚本哦:
那几个月制作脚本不知挖空了多少心思,前几个月,为了效率不知改了多少次:
下面有图有脚本:
脚本如下:- #4。0更新的东西:
- #准备把CHECK_EVENT2建立一个HASH查询!
- #全方面把BUG取缔,革命性的转折。
- #-------------------------------如果要出ver5
- #那么把4个方向的每块坐标运算改成范围只运算4次,并且还有……
- #找出放15泡FPS降低的根源。。。。。
- module QQT
- def self.pp_data(event_id)
- #===============================NEW这玩意儿比的是全局更新,故可以是全局变量
- $phash = {}
- for event in $game_map.events.values
- if $phash[[event.x,event.y]]
- $phash[[event.x,event.y]] += [event]
- else
- $phash[[event.x,event.y]] = [event]
- end
- end
- #===============================
- #begin-------------
- id = $game_map.events[event_id]
- x,y = id.x,id.y
- po = $pp_power.to_i
- event = $game_map.check_all_event(x, y,"敌人") rescue []
- map_id = $game_map.map_id
- damage = $game_party.actors[0].base_atk
- suipian = []
- person = "主角"
- #Center Bing Bong
- event.each{|e|
- e.damage_hp(po*100)
- }
- event = $game_map.check_event2(x, y,"普通")
- if $game_player.x == x and $game_player.y == y
- $game_player.damage_hp_player2(damage)
- end
- if $game_player2.x == x and $game_player2.y == y
- $game_player2.damage_hp_player2(damage)
- end
- if event != nil
- event.each{|a|
- $game_self_switches[[map_id,a.id,"A"]]=true
- a.refresh
- }
- end
- #Four Diraction
- #UP
- for yi in 1..po
- event = $game_map.check_all_event(x, y-yi,"敌人") rescue []
- if $game_map.tag_down(x, y-yi) == 1
- $suipian.push Sprite_Suipian.new($v,x,y-yi)
- suipian.push [x,y-yi]
- yi -= 1
- break
- elsif $game_map.through?(x,y-yi,2) == false
- yi -= 1
- break
- end
- event.each{|e|e.damage_hp(damage)}
- if $game_player.x == x and $game_player.y == y-yi
- $game_player.damage_hp_player2(damage)
- end
- if $game_player2.x == x and $game_player2.y == y-yi
- $game_player2.damage_hp_player2(damage)
- end
- event = $game_map.check_event2(x, y-yi,"普通")
- if event != []
- event.each{|a|
- $game_self_switches[[map_id,a.id,"A"]]=true
- a.refresh}
- break
- end
- if $game_map.tag_down(x, y-yi) == 6 # 炸掉元件道具
- edit(map_id,x,y-yi,1,0)
- end
- end
- up=yi
- #DOWN::3处修改加减号:y-yi
- for yi in 1..po
- event = $game_map.check_all_event(x, y+yi,"敌人") rescue []
- if $game_map.tag_down(x, y+yi) == 1
- $suipian.push Sprite_Suipian.new($v,x,y+yi)
- suipian.push [x,y+yi]
- yi -= 1
- break
- elsif $game_map.through?(x,y+yi,2) == false
- yi -= 1
- break
- end
- event.each{|e|e.damage_hp(damage)}
- if $game_player.x == x and $game_player.y == y+yi
- $game_player.damage_hp_player2(damage)
- end
- if $game_player2.x == x and $game_player2.y == y+yi
- $game_player2.damage_hp_player2(damage)
- end
- event = $game_map.check_event2(x, y+yi,"普通")
- if event != []
- event.each{|a|
- $game_self_switches[[map_id,a.id,"A"]]=true
- a.refresh}
- break
- end
- if $game_map.tag_down(x, y+yi) == 6
- edit(map_id,x,y+yi,1,0)
- end
- end
- down=yi
- #LEFT
- for xi in 1..po
- event = $game_map.check_all_event(x-xi, y,"敌人") rescue []
- if $game_map.tag_down(x-xi, y) == 1
- #p"这里是可炸地,待会爆炸,并跳出FOR循环结束左泡浆!"
- $suipian.push Sprite_Suipian.new($v,x-xi,y)
- suipian.push [x-xi,y]
- xi -= 1
- break
- elsif $game_map.through?(x-xi,y,2) == false
- xi -= 1
- break
- end
- event.each{|e|e.damage_hp(damage)}
- if $game_player.x == x-xi and $game_player.y == y
- $game_player.damage_hp_player2(damage)
- end
- if $game_player2.x == x-xi and $game_player2.y == y
- $game_player2.damage_hp_player2(damage)
- end
- event = $game_map.check_event2(x-xi, y,"普通")
- if event != []
- event.each{|a|
- $game_self_switches[[map_id,a.id,"A"]]=true
- a.refresh}
- break
- end
- if $game_map.tag_down(x-xi, y) == 6
- edit(map_id,x-xi,y,1,0)
- end
- end
- left=xi
- ###==RIGHT===========
- for xi in 1..po
- event = $game_map.check_all_event(x+xi, y,"敌人") rescue []
- if $game_map.tag_down(x+xi, y) == 1
- $suipian.push Sprite_Suipian.new($v,x+xi,y)
- suipian.push [x+xi,y]
- xi -= 1
- break
- elsif $game_map.through?(x+xi,y,2) == false
- xi -= 1
- break
- end
- event.each{|e|e.damage_hp(damage)}
- if $game_player.x == x+xi and $game_player.y == y
- $game_player.damage_hp_player2(damage)
- end
- if $game_player2.x == x+xi and $game_player2.y == y
- $game_player2.damage_hp_player2(damage)
- end
- event = $game_map.check_event2(x+xi, y,"普通")
- if event != []
- event.each{|a|
- $game_self_switches[[map_id,a.id,"A"]]=true
- a.refresh}
- break
- end
- if $game_map.tag_down(x+xi, y) == 6
- edit(map_id,x+xi,y,1,0)
- end
- end
- edit(map_id,x,y,1,0)
- right=xi
- return [up, down, left, right] , suipian
- $game_map.events[event_id].animation_id = up-1+130
- $game_map.events[event_id].animation_id = down-1+137 unless down-1+137 == 136
- $game_map.events[event_id].animation_id = left-1+144 unless left-1+144 == 143
- $game_map.events[event_id].animation_id = right-1+151 unless left-1+151 == 150
- end
- end
- #=====================================================
- class Game_Map
- #--------------------------------------------------------------------------
- # ● 获取指定位置的事件 ID
- # x : X 坐标
- # y : Y 坐标
- #--------------------------------------------------------------------------
- def check_event(x, y)
- for event in $game_map.events.values
- if event.x == x and event.y == y
- next if event.character_name == ""
- return ev_id
- end
- end
- end
- end
- #New
- class Game_Map
- #--------------------------------------------------------------------------
- # ● 获取指定位置的事件 ID
- # x : X 坐标
- # y : Y 坐标
- #--------------------------------------------------------------------------
- def check_event2(x, y,name)#name = 普通
- for event in $game_map.events.values
- if event.x == x and event.y == y
- if event.character_name.index(name) or
- (name == '敌人' and event.name.index('en='))
- return event.id
- end
- end
- end
- return 0
- end
- end
- #New
- class Game_Map
- #--------------------------------------------------------------------------
- # ● 获取指定位置的事件 ID
- # x : X 坐标
- # y : Y 坐标
- #--------------------------------------------------------------------------
- def check_all_event(x, y,name)#name = 敌人
- a = $phash[[x,y]].to_a
- c = []
- a.each{|b|c.push b if b.character_name.index(name) or (b.name.index('en=') and b.hp > 0)}
- return c
- end
- def check_event2(x, y,name)#name = 普通
- a = $phash[[x,y]].to_a
- c = []
- a.each{|b|c.push b if b.character_name.index(name)}
- return c
- end
- end
- #========================
- ↑找怪脚本↓爆炸动画
- #=====================
- class Sprite_PPJS < Sprite
- #--------------------------------------------------------------------------
- # ● 初始化对像
- # viewport : 显示端口
- #--------------------------------------------------------------------------
- def initialize(viewport, cha, power, dir)
- super(viewport)
- @cha, @power, @dir = cha, power, dir
- @count = 0
- self.bitmap = RPG::Cache.picture("PPJS3")
- # 将活动块设置为可见
- self.visible = true
- # 设置活动块的坐标
- case @dir
- when 2
- self.angle = -90
- @x2 = 32
- @y2 = 32
- when 4
- self.angle = -180
- @y2 = 32
- when 6
- self.angle = -0
- @power += 1
- when 8
- self.angle = 90
- end
- self.x = @cha.screen_x - 16 + @x2.to_i
- self.y = @cha.screen_y - 32 + @y2.to_i
- self.z = @cha.screen_z(32)
- self.opacity = 225
- self.src_rect.set(([url=mailto:10-@power)*32]10-@power)*32[/url], 0, @power*32, 32)
- self.zoom_x, self.zoom_y = 0.95,0.95
- update
- end
- #--------------------------------------------------------------------------
- # ● 释放
- #--------------------------------------------------------------------------
- def dispose
- if self.bitmap != nil
- self.bitmap.dispose
- end
- super
- end
- #--------------------------------------------------------------------------
- # ● 释放
- #--------------------------------------------------------------------------
- def dispose2
- if self.bitmap != nil
- self.visible = false
- end
- #super
- end
- #--------------------------------------------------------------------------
- # ● 更新画面
- #--------------------------------------------------------------------------
- def update
- @count += 1
- self.x = @cha.screen_x - 16 + @x2.to_i
- self.y = @cha.screen_y - 32 + @y2.to_i
- 渐变x()
- return false if @count == 15
- super
- end
- def 渐变x()
- self.zoom_x += 0.005
- end
- end
复制代码 因为那个动画效率太低,所以替换为自制类显示动画,图像也尽量改进加速!
泡泡动画图:请放在PICTURE包包里:(通过旋转,截取形成4方向爆炸和威力可改)
还是把范例拿出来吧:
(自己玩自己游戏玩疯了)
这个区人怎么这么少啊!
哇哈哈我的图没有崩!
请提问吧!
’’
4月13号
今天已经没有任务了哦,现在就动手制作吧,对了
有什么疑难请回复!!!
|
评分
-
查看全部评分
|