Project1
标题: 【VA】主角切换的脚本代码(同一地图) [打印本页]
作者: qbjxiaolei 时间: 2012-10-11 22:17
标题: 【VA】主角切换的脚本代码(同一地图)
VA中主角对象只有一个全局变量$game_player,但是我们可以自己写一个管理player的模块来达到创建多个主角并自由切换的效果。代码如下:
首先我们封装一个Hash数据结构,使之看起来更直观一些:
class Hash_data
attr_accessor :hashtab;
def initialize()
@hashtab={};
end
def gettab()
return @hashtab;
end
def get(key)
return @hashtab[key];
end
def del(key)
@hashtab[key]=nil;
end
def insert(key,value)
tmp=@hashtab[key];
if(tmp!=nil)
return false;
else
@hashtab[key]=value;
return true;
end
end
def must_insert(key,value)
@hashtab[key]=value;
end
def size()
return @hashtab.size();
end
end
class Hash_data
attr_accessor :hashtab;
def initialize()
@hashtab={};
end
def gettab()
return @hashtab;
end
def get(key)
return @hashtab[key];
end
def del(key)
@hashtab[key]=nil;
end
def insert(key,value)
tmp=@hashtab[key];
if(tmp!=nil)
return false;
else
@hashtab[key]=value;
return true;
end
end
def must_insert(key,value)
@hashtab[key]=value;
end
def size()
return @hashtab.size();
end
end
然后创建一个可以存储Game_Player各域的类,Usr_Player:
class Usr_Player
attr_accessor :player; #game_player
attr_accessor :key; #hash表键值
attr_accessor :char; #主角所对应的精灵
def initialize(key)
@player=nil;
@char=nil;
@key=key;
end
def set_player(pl)
@player=pl;
end
def get_player()
return @player;
end
end
class Usr_Player
attr_accessor :player; #game_player
attr_accessor :key; #hash表键值
attr_accessor :char; #主角所对应的精灵
def initialize(key)
@player=nil;
@char=nil;
@key=key;
end
def set_player(pl)
@player=pl;
end
def get_player()
return @player;
end
end
然后写一个模块PlayerManager,他来统一管理所有的主角。cur_key是指当前活动主角的键值。
module PlayerManager
@players=nil;
@cur_key=nil;
def self.init()
@players=Hash_data.new();
end
#param[5]=[x,y,filename,index,key]
#x,y=建立的主角初始位置,filename=行走图,index=行走图的哪个块,key=hash键值
def self.create_player(param)
if(@players.get(param[4])!=nil)
return false;
end
player=Game_Player.new();
player.real_x=player.x=param[0];
player.real_y=player.y=param[1];
player.set_graphic(param[2],param[3]);
usr_player=Usr_Player.new(param[4]);
usr_player.set_player(player);
usr_player.char=SceneManager.scene.spriteset.add_usr_sprite(usr_player.player);
@players.insert(param[4],usr_player);
end
#从当前角色切换到指定key的角色
def self.switch_player(key)
if(@cur_key==nil)
return -1;
end
tmp1=@players.get(@cur_key);
tmp2=@players.get(key);
if(tmp1==nil)
return -2;
end
if(tmp2==nil)
return -3;
end
$game_player=tmp2.get_player();
cur_key=key;
$game_player.moveto($game_player.x, $game_player.y);
$game_player.make_encounter_count();
return 0;
end
#只在保存地图自带主角的函数,保存到hash当中的key中。
def self.save_curplayer(key)
usr_player=@players.get(key);
if(usr_player!=nil)
return false;
end
usr_player=Usr_Player.new(key);
usr_player.set_player($game_player);
usr_player.char=SceneManager.scene.spriteset.read_cur_sp();
@players.insert(key,usr_player);
@cur_key=key;
return true;
end
def self.del_player(key)
if(key==@cur_key)
return false;
end
@players.del(key);
return true;
end
end
module PlayerManager
@players=nil;
@cur_key=nil;
def self.init()
@players=Hash_data.new();
end
#param[5]=[x,y,filename,index,key]
#x,y=建立的主角初始位置,filename=行走图,index=行走图的哪个块,key=hash键值
def self.create_player(param)
if(@players.get(param[4])!=nil)
return false;
end
player=Game_Player.new();
player.real_x=player.x=param[0];
player.real_y=player.y=param[1];
player.set_graphic(param[2],param[3]);
usr_player=Usr_Player.new(param[4]);
usr_player.set_player(player);
usr_player.char=SceneManager.scene.spriteset.add_usr_sprite(usr_player.player);
@players.insert(param[4],usr_player);
end
#从当前角色切换到指定key的角色
def self.switch_player(key)
if(@cur_key==nil)
return -1;
end
tmp1=@players.get(@cur_key);
tmp2=@players.get(key);
if(tmp1==nil)
return -2;
end
if(tmp2==nil)
return -3;
end
$game_player=tmp2.get_player();
cur_key=key;
$game_player.moveto($game_player.x, $game_player.y);
$game_player.make_encounter_count();
return 0;
end
#只在保存地图自带主角的函数,保存到hash当中的key中。
def self.save_curplayer(key)
usr_player=@players.get(key);
if(usr_player!=nil)
return false;
end
usr_player=Usr_Player.new(key);
usr_player.set_player($game_player);
usr_player.char=SceneManager.scene.spriteset.read_cur_sp();
@players.insert(key,usr_player);
@cur_key=key;
return true;
end
def self.del_player(key)
if(key==@cur_key)
return false;
end
@players.del(key);
return true;
end
end
思路是将全局变量$game_player当作活动主角的变量。而所有主角存在一个hash表中。如果要切换到某个主角直接从hash表中提取game_player类赋值给$game_player。
试验,首先随便在代码中的哪一块调用PlayerManager.init(),然后我们在地图当中创建3个地图事件,如下图:
事件1,有保存初始角色到1(其实这个可以随便写到代码哪个地方自动就存了);创建角色到2。这两个选项。
事件2,切换到角色2
PlayerManager.switch_player(2);
PlayerManager.switch_player(2);
事件3,切换到角色1
PlayerManager.switch_player(1);
PlayerManager.switch_player(1);
当选创建角色2时,在地图中出现了新角色在指定位置。
然后切换角色2时,可以控制刚创建的新角色。
然后切换1时,又切换回来了。就不截图了,不晓得这次这个截图有点奇怪啊。
这么样就实现了多个主角切换。当然,要在sprites_map中添加一些简单的代码,并将一些game_player的某些变量设置成attr_accessor。
作者: qbjxiaolei 时间: 2012-10-11 22:19
大家可以试验一下,分析一下代码。没怎么写注释,好像可能功能不全仅供参考哈。
作者: qbjxiaolei 时间: 2012-10-11 22:35
啊,是不是又发错区了啊。。。
作者: qbjxiaolei 时间: 2012-10-11 23:31
额,完全没人看的样子啊。。。,算了睡觉了,明天还要上班,唉。。
作者: 1243852 时间: 2012-10-11 23:39
没发错区,只是这东西对大家似乎用处不大。
作者: qbjxiaolei 时间: 2012-10-12 10:01
1243852 发表于 2012-10-11 23:39
没发错区,只是这东西对大家似乎用处不大。
这个,就不是很清楚了,但是多角色的系统应该还是在特定的环境下有用的吧。这个脚本的确代码比较少,但是提供了一些思路吧,也可以用它扩展哇。
作者: 晴兰 时间: 2012-10-12 11:51
提示: 作者被禁止或删除 内容自动屏蔽
作者: qbjxiaolei 时间: 2012-10-12 12:37
晴兰 发表于 2012-10-12 11:51
楼主可以试试扩展一下,做一个GlobalResourceManager,确实不一定会换玩家对象,但可能换其他的对象,相同 ...
其实可以加一些切换的效果,其实我只是用player来试验一下这种实现的可行性。至于hashtab那种东西,只是因为如果直接用{},代码变得很奇怪很不直观而已。因为每一种global resource,VA没有怎么支持同时存在的情况,所以要既写出多个资源同时存在,又与现在的模式兼容还是不那么容易啊。
作者: so_aries 时间: 2012-10-12 14:20
很多大型rpg都有类似这功能吧?1队人马到分歧点分成2队各由某个人物带头....甚至主角被抓走要换另个主角进行游戏...
请教楼主,这一定要在同一张地图吗?不管是想做男女主角切换的游戏(2张不同的地图),某主角进行一半换另个主角进行游戏...都好像很难在同张地图...|||
指定位置可以指定某张地图id的x,y位置吗?那换回来原先主角的位置可以改吗?
试过之后..为啥出现Game_Interpreter的脚本有问题= =?(这文章给高手看的吗...@@")
作者: 勇敢的馒头 时间: 2012-10-12 15:09
赞!求XP版
作者: 菜鸟飞呀飞 时间: 2012-10-12 16:37
提示: 作者被禁止或删除 内容自动屏蔽
作者: feizhaodan 时间: 2012-10-12 17:25
又是C!又见C的身影(大雾
好吧其实如果要在原创区发的话最好还是来一个整个脚本整合的。
一个关于RGSS的提醒
将角色移动到特定坐标可以直接用这个语句是在Game_CharacterBase类内定义,因此Game_Player(玩家)和Game_Event(事件)皆可使用。
若是想要屏蔽Game_Player类moveto方法新定义的移动画面位置的话,可以在Game_CharacterBase进行一次alias。
好C++的代码啊(你够
作者: qbjxiaolei 时间: 2012-10-12 17:39
so_aries 发表于 2012-10-12 14:20
很多大型rpg都有类似这功能吧?1队人马到分歧点分成2队各由某个人物带头....甚至主角被抓走要换另个主角进行 ...
这个代码除了贴上去的一部份,还有些其他代码的修改,这个主要给个思路,整个功能还没完善,我在看能不能写一个和地图一起的切换。刚才在开会回复晚了哈。。
作者: qbjxiaolei 时间: 2012-10-13 11:44
so_aries 发表于 2012-10-12 14:20
很多大型rpg都有类似这功能吧?1队人马到分歧点分成2队各由某个人物带头....甚至主角被抓走要换另个主角进行 ...
昨天看了下,同时切换也写出来了,呵呵。
作者: 1243852 时间: 2012-10-31 13:05
我知道这东西 的用处了,,如果稍微更改一下,用处肯定很大。。 如果两个角色之间,可以互相交易:“金钱、物品,队友。”那就很有用了。换句话说,当你新建一个角色,你的金钱、物品、队友,统统会变成0
作者: chd114 时间: 2013-8-22 18:08
不会用····能给个范例让我明白第一段脚本加在哪里吗···
作者: skandhas 时间: 2013-9-4 10:03
判断一对象是否为 nil 时,可以这么写:
或直接
欢迎光临 Project1 (https://rpg.blue/) |
Powered by Discuz! X3.1 |