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

Project1

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

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

[复制链接]

Lv1.梦旅人

梦石
0
星屑
50
在线时间
56 小时
注册时间
2012-10-1
帖子
36
跳转到指定楼层
1
发表于 2012-10-11 22:17:43 | 只看该作者 |只看大图 回帖奖励 |正序浏览 |阅读模式

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

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

x
VA中主角对象只有一个全局变量$game_player,但是我们可以自己写一个管理player的模块来达到创建多个主角并自由切换的效果。代码如下:
首先我们封装一个Hash数据结构,使之看起来更直观一些:
RUBY 代码复制
  1. class Hash_data
  2.   attr_accessor :hashtab;
  3.  
  4.   def initialize()
  5.     @hashtab={};
  6.   end
  7.  
  8.   def gettab()
  9.     return @hashtab;
  10.   end
  11.  
  12.   def get(key)
  13.     return @hashtab[key];
  14.   end
  15.  
  16.   def del(key)
  17.     @hashtab[key]=nil;
  18.   end
  19.  
  20.   def insert(key,value)
  21.     tmp=@hashtab[key];
  22.     if(tmp!=nil)
  23.       return false;
  24.     else
  25.       @hashtab[key]=value;
  26.       return true;
  27.     end
  28.   end
  29.  
  30.   def must_insert(key,value)
  31.     @hashtab[key]=value;
  32.   end
  33.  
  34.   def size()
  35.     return @hashtab.size();
  36.   end
  37. end


然后创建一个可以存储Game_Player各域的类,Usr_Player:
RUBY 代码复制
  1. class Usr_Player
  2.   attr_accessor :player; #game_player
  3.   attr_accessor :key;    #hash表键值
  4.   attr_accessor :char;   #主角所对应的精灵
  5.  
  6.   def initialize(key)
  7.     @player=nil;
  8.     @char=nil;
  9.     @key=key;
  10.   end
  11.  
  12.   def set_player(pl)
  13.     @player=pl;
  14.   end
  15.  
  16.   def get_player()
  17.     return @player;
  18.   end
  19.  
  20. end


然后写一个模块PlayerManager,他来统一管理所有的主角。cur_key是指当前活动主角的键值。
RUBY 代码复制
  1. module PlayerManager
  2.   @players=nil;
  3.   @cur_key=nil;
  4.  
  5.   def self.init()
  6.     @players=Hash_data.new();
  7.   end
  8.  
  9.   #param[5]=[x,y,filename,index,key]
  10.   #x,y=建立的主角初始位置,filename=行走图,index=行走图的哪个块,key=hash键值
  11.   def self.create_player(param)
  12.     if(@players.get(param[4])!=nil)
  13.       return false;
  14.     end
  15.     player=Game_Player.new();
  16.     player.real_x=player.x=param[0];
  17.     player.real_y=player.y=param[1];
  18.     player.set_graphic(param[2],param[3]);
  19.     usr_player=Usr_Player.new(param[4]);
  20.     usr_player.set_player(player);
  21.     usr_player.char=SceneManager.scene.spriteset.add_usr_sprite(usr_player.player);
  22.     @players.insert(param[4],usr_player);
  23.   end
  24.  
  25.   #从当前角色切换到指定key的角色
  26.   def self.switch_player(key)
  27.     if(@cur_key==nil)
  28.       return -1;
  29.     end
  30.     tmp1=@players.get(@cur_key);
  31.     tmp2=@players.get(key);
  32.     if(tmp1==nil)
  33.       return -2;
  34.     end
  35.     if(tmp2==nil)
  36.       return -3;
  37.     end
  38.     $game_player=tmp2.get_player();
  39.     cur_key=key;
  40.     $game_player.moveto($game_player.x, $game_player.y);
  41.     $game_player.make_encounter_count();
  42.     return 0;
  43.   end
  44.  
  45.   #只在保存地图自带主角的函数,保存到hash当中的key中。
  46.   def self.save_curplayer(key)
  47.     usr_player=@players.get(key);
  48.     if(usr_player!=nil)
  49.       return false;
  50.     end
  51.     usr_player=Usr_Player.new(key);
  52.     usr_player.set_player($game_player);
  53.     usr_player.char=SceneManager.scene.spriteset.read_cur_sp();
  54.     @players.insert(key,usr_player);
  55.     @cur_key=key;
  56.     return true;
  57.   end
  58.  
  59.   def self.del_player(key)
  60.     if(key==@cur_key)
  61.       return false;
  62.     end
  63.     @players.del(key);
  64.     return true;
  65.   end
  66. end


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

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


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


事件2,切换到角色2
RUBY 代码复制
  1. PlayerManager.switch_player(2);


事件3,切换到角色1
RUBY 代码复制
  1. PlayerManager.switch_player(1);


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


然后切换角色2时,可以控制刚创建的新角色。


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

评分

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

查看全部评分

Lv1.梦旅人

梦石
0
星屑
490
在线时间
9 小时
注册时间
2013-8-30
帖子
2
17
发表于 2013-9-4 10:03:24 | 只看该作者
判断一对象是否为 nil 时,可以这么写:
RUBY 代码复制
  1. if tmp1
  2.    return -2;
  3. end


或直接
RUBY 代码复制
  1. return -2  if tmp1
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
9280
在线时间
2504 小时
注册时间
2011-5-20
帖子
15389

开拓者

16
发表于 2013-8-22 18:08:29 | 只看该作者
不会用····能给个范例让我明白第一段脚本加在哪里吗···
[img]http://service.t.sina.com.cn/widget/qmd/5339802982/c02e16bd/7.png
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
780
在线时间
924 小时
注册时间
2006-6-26
帖子
1529
15
发表于 2012-10-31 13:05:16 | 只看该作者
我知道这东西 的用处了,,如果稍微更改一下,用处肯定很大。。     如果两个角色之间,可以互相交易:“金钱、物品,队友。”那就很有用了。换句话说,当你新建一个角色,你的金钱、物品、队友,统统会变成0
我是不是可以签名了?
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
56 小时
注册时间
2012-10-1
帖子
36
14
 楼主| 发表于 2012-10-13 11:44:23 | 只看该作者
so_aries 发表于 2012-10-12 14:20
很多大型rpg都有类似这功能吧?1队人马到分歧点分成2队各由某个人物带头....甚至主角被抓走要换另个主角进行 ...

昨天看了下,同时切换也写出来了,呵呵。

点评

所以可以在Game_Player上定义一个与Game_CharacterBase里的moveto方法不同名但是同样的处理内容的方法囧  发表于 2012-10-13 16:11
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
56 小时
注册时间
2012-10-1
帖子
36
13
 楼主| 发表于 2012-10-12 17:39:31 | 只看该作者
so_aries 发表于 2012-10-12 14:20
很多大型rpg都有类似这功能吧?1队人马到分歧点分成2队各由某个人物带头....甚至主角被抓走要换另个主角进行 ...

这个代码除了贴上去的一部份,还有些其他代码的修改,这个主要给个思路,整个功能还没完善,我在看能不能写一个和地图一起的切换。刚才在开会回复晚了哈。。
回复 支持 反对

使用道具 举报

Lv1.梦旅人

Mr.Gandum

梦石
0
星屑
226
在线时间
2070 小时
注册时间
2007-1-31
帖子
3039

贵宾

12
发表于 2012-10-12 17:25:04 | 只看该作者
又是C!又见C的身影(大雾


好吧其实如果要在原创区发的话最好还是来一个整个脚本整合的。


一个关于RGSS的提醒
将角色移动到特定坐标可以直接用
  1. character.moveto(x,y)
复制代码
这个语句是在Game_CharacterBase类内定义,因此Game_Player(玩家)和Game_Event(事件)皆可使用。
若是想要屏蔽Game_Player类moveto方法新定义的移动画面位置的话,可以在Game_CharacterBase进行一次alias。


好C++的代码啊(你够

点评

在Game_Player类中调用moveto会将地图的焦点移动哦,有没有方法Game_player类调用charactor当中的moveto方法哦。。。  发表于 2012-10-13 11:47
不是,主要是我对ruby不熟,我之前也是写的那种风格的,但是一直调总有语法问题。就还是用C的风格的了,请见谅啊  发表于 2012-10-13 11:45
回复 支持 反对

使用道具 举报

菜鸟飞呀飞 该用户已被删除
11
发表于 2012-10-12 16:37:20 手机端发表。 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
329
在线时间
371 小时
注册时间
2010-8-23
帖子
418
10
发表于 2012-10-12 15:09:57 | 只看该作者
赞!求XP版
回复 支持 反对

使用道具 举报

Lv1.梦旅人

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

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-13 14:07

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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