查看: 6155|回复: 16

[RMVA发布] 【VA】主角切换的脚本代码(同一地图)

[复制链接]
梦石
0
星屑
50
在线时间
56 小时
注册时间
2012-10-1
回帖
29
发表于 2012-10-11 22:17:43 | 显示全部楼层 |阅读模式

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

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

×
VA中主角对象只有一个全局变量$game_player,但是我们可以自己写一个管理player的模块来达到创建多个主角并自由切换的效果。代码如下:
首先我们封装一个Hash数据结构,使之看起来更直观一些:
[pre lang="ruby" line="1"]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[/pre]

然后创建一个可以存储Game_Player各域的类,Usr_Player:
[pre lang="ruby" line="1"]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[/pre]

然后写一个模块PlayerManager,他来统一管理所有的主角。cur_key是指当前活动主角的键值。
[pre lang="ruby" line="1"]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[/pre]

思路是将全局变量$game_player当作活动主角的变量。而所有主角存在一个hash表中。如果要切换到某个主角直接从hash表中提取game_player类赋值给$game_player。

试验,首先随便在代码中的哪一块调用PlayerManager.init(),然后我们在地图当中创建3个地图事件,如下图:
QQ截图20121011220620.png

事件1,有保存初始角色到1(其实这个可以随便写到代码哪个地方自动就存了);创建角色到2。这两个选项。
QQ截图20121011220810.png

事件2,切换到角色2
[pre lang="ruby" line="1"]PlayerManager.switch_player(2);[/pre]

事件3,切换到角色1
[pre lang="ruby" line="1"]PlayerManager.switch_player(1);[/pre]

当选创建角色2时,在地图中出现了新角色在指定位置。
QQ截图20121011221221.png

然后切换角色2时,可以控制刚创建的新角色。
QQ截图20121011221406.png

然后切换1时,又切换回来了。就不截图了,不晓得这次这个截图有点奇怪啊。
这么样就实现了多个主角切换。当然,要在sprites_map中添加一些简单的代码,并将一些game_player的某些变量设置成attr_accessor。

评分

参与人数 2星屑 +804 收起 理由
feizhaodan + 800 奖赏条例
alann + 4 精品文章

查看全部评分

梦石
0
星屑
50
在线时间
56 小时
注册时间
2012-10-1
回帖
29
 楼主| 发表于 2012-10-11 22:19:53 | 显示全部楼层
大家可以试验一下,分析一下代码。没怎么写注释,好像可能功能不全仅供参考哈。
回复

使用道具 举报

梦石
0
星屑
50
在线时间
56 小时
注册时间
2012-10-1
回帖
29
 楼主| 发表于 2012-10-11 22:35:05 | 显示全部楼层
啊,是不是又发错区了啊。。。
回复

使用道具 举报

梦石
0
星屑
50
在线时间
56 小时
注册时间
2012-10-1
回帖
29
 楼主| 发表于 2012-10-11 23:31:51 | 显示全部楼层
额,完全没人看的样子啊。。。,算了睡觉了,明天还要上班,唉。。

点评

注意不要连贴。警告一次,下次再看见就要扣分了。  发表于 2012-10-12 17:17
回复

使用道具 举报

梦石
0
星屑
858
在线时间
929 小时
注册时间
2006-6-26
回帖
1377
发表于 2012-10-11 23:39:53 | 显示全部楼层
没发错区,只是这东西对大家似乎用处不大。
我是不是可以签名了?
回复

使用道具 举报

梦石
0
星屑
50
在线时间
56 小时
注册时间
2012-10-1
回帖
29
 楼主| 发表于 2012-10-12 10:01:12 | 显示全部楼层
1243852 发表于 2012-10-11 23:39
没发错区,只是这东西对大家似乎用处不大。

这个,就不是很清楚了,但是多角色的系统应该还是在特定的环境下有用的吧。这个脚本的确代码比较少,但是提供了一些思路吧,也可以用它扩展哇。

点评

你都说特定环境下吧。。。所以,,  发表于 2012-10-12 13:21
回复

使用道具 举报

头像被屏蔽
梦石
0
星屑
653
在线时间
3774 小时
注册时间
2011-2-26
回帖
1577

开拓者

发表于 2012-10-12 11:51:18 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复

使用道具 举报

梦石
0
星屑
50
在线时间
56 小时
注册时间
2012-10-1
回帖
29
 楼主| 发表于 2012-10-12 12:37:20 | 显示全部楼层
晴兰 发表于 2012-10-12 11:51
楼主可以试试扩展一下,做一个GlobalResourceManager,确实不一定会换玩家对象,但可能换其他的对象,相同 ...

其实可以加一些切换的效果,其实我只是用player来试验一下这种实现的可行性。至于hashtab那种东西,只是因为如果直接用{},代码变得很奇怪很不直观而已。因为每一种global resource,VA没有怎么支持同时存在的情况,所以要既写出多个资源同时存在,又与现在的模式兼容还是不那么容易啊。

点评

如果非要用get这样的名字而不是符号,也可以: $a = {}; $a.send :alias_method, :get, :[]  发表于 2012-10-12 12:45
事实上{}就是Hash.new,Ruby的符号是相当多的~也不见得不直观,使用者的习惯而已。另外可以试试a['1']['2']['3']...这种hash  发表于 2012-10-12 12:40
回复

使用道具 举报

梦石
0
星屑
50
在线时间
1061 小时
注册时间
2012-9-10
回帖
286
发表于 2012-10-12 14:20:56 | 显示全部楼层
很多大型rpg都有类似这功能吧?1队人马到分歧点分成2队各由某个人物带头....甚至主角被抓走要换另个主角进行游戏...
请教楼主,这一定要在同一张地图吗?不管是想做男女主角切换的游戏(2张不同的地图),某主角进行一半换另个主角进行游戏...都好像很难在同张地图...|||
指定位置可以指定某张地图id的x,y位置吗?那换回来原先主角的位置可以改吗?
试过之后..为啥出现Game_Interpreter的脚本有问题= =?(这文章给高手看的吗...@@")
资料库更新...累死人的一堆文字...
我不是做avg,卻要有avg的叙述....-   3 -
回复

使用道具 举报

梦石
0
星屑
424
在线时间
371 小时
注册时间
2010-8-23
回帖
381
发表于 2012-10-12 15:09:57 | 显示全部楼层
赞!求XP版

点评

主要是我没用过xp啊,好久用一用  发表于 2012-10-12 22:25
头像…………………………  发表于 2012-10-12 17:51
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部