Project1
标题:
[PPG-Q堂式炸弹人【教程】]给需要制作PPG游戏的人的帖子!
[打印本页]
作者:
end55rpg
时间:
2012-4-30 08:52
标题:
[PPG-Q堂式炸弹人【教程】]给需要制作PPG游戏的人的帖子!
本帖最后由 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 ○○
○
○
$power = 2 #威力设置为2
复制代码
现在制作泡泡了吧
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号
今天已经没有任务了哦,现在就动手制作吧,对了
有什么疑难请回复!!!
作者:
灵魂の补给
时间:
2012-5-1 12:42
好枯燥的教程,给分!
作者:
c248611
时间:
2012-10-2 15:06
lz我看不懂,求简单一点的教程。谢谢了。
作者:
c248611
时间:
2012-10-2 15:12
本帖最后由 c248611 于 2012-10-4 16:39 编辑
3.如图设置好后,必须要把事件移动到主角位置上并显示图像
所以我们可以在按下空格后切换事件页:
在第一个事件页中我们必须把泡泡传送过去:
搜狗截图_2012-10-04_16-37-21.jpg
(70.5 KB, 下载次数: 13)
下载附件
保存到相册
2012-10-4 16:38 上传
设置事件位置:本事件,变量[0006][0007]
如何在事件中调出?变量[0006][0007]
作者:
c248611
时间:
2013-2-18 21:15
这图挂掉了。
欢迎光临 Project1 (https://rpg.blue/)
Powered by Discuz! X3.1