关于RPG maker xp脚本的问题_百度知道cping 的BLOG
用户名:cping
文章数:228
评论数:184
访问量:599263
注册日期:
阅读量:5863
阅读量:12276
阅读量:327786
阅读量:1036134
51CTO推荐博文
Java的图像处理能力相对较弱是一个不争的事实,因为jre需要兼顾不同系统间的相同功能实现,所以并非所有图形操作都可以利用java进行。但对于绝大多数的图形开发而言,java已经足够强大了,尤其是对2d图形游戏而言,其简单快捷的编码风格在某些时候完全可以应用到实际的游戏开发中去。在以前的blog文章中,我曾经历居过一些简单的实例,此系列中我会进行比以前更深入的用例讲解。以前的文章中,我总是喜欢以窗体模式的frame显示数据,这样做有例有弊。好处在于不会消耗额外的系统资源,而坏处在于若不进行相关代码调整则窗体内图像大小总是固定的,无论显示器实际分辨率如何窗体中图形总是会以默认大小显示,而且在窗体环绕中的游戏临场感也不够强。实际上Java中的frame是可以转化为全屏方式显示的,只是我们善于利用GraphicsEnvironment类,就可以对系统显示环境作相应的调整操作。
ScreenManager.java
package org.loon.game.
import java.awt.Cimport java.awt.DisplayMimport java.awt.EventQimport java.awt.Fimport java.awt.Graphics2D;import java.awt.GraphicsCimport java.awt.GraphicsDimport java.awt.GraphicsEimport java.awt.Timport java.awt.Wimport java.awt.event.WindowAimport java.awt.event.WindowEimport java.awt.image.BufferSimport java.awt.image.BufferedIimport java.lang.reflect.InvocationTargetE/** *//**&* &* &p&Title: LoonFramework&/p&&* &p&Description:用于进行屏幕管理&/p&&* &p&Copyright: Copyright (c) 2008&/p&&* &p&Company: LoonFramework&/p&&* &p&License: 我们可以看到,此时一个全屏显示的Hello World被创建出来。以此为基础,我们更可以轻松的创建全屏状态下的动画效果。Animation.java
package org.loon.game.
import java.awt.Iimport java.util.ArrayL
public class Animation ...{
&&& // 缓存动画面板&&& private ArrayList _
&&& private int _frameI
&&& private long _
&&& private long _
&&& private class AnimationFrame ...{
&&&&&&& long endT
&&&&&&& public AnimationFrame(Image image, long endTime) ...{&&&&&&&&&&& this.image =&&&&&&&&&&& this.endTime = endT&&&&&&& }&&& }
&&& public Animation() ...{&&&&&&& _frames = new ArrayList();&&&&&&& _total = 0;&&&&&&& start();&&& }
&&& /** *//**&&&& * 增加一个指定的动画图片并设置动画时间&&&& * &&&& * @param image&&&& * @param duration&&&& */&&& public synchronized void addFrame(Image image, long duration) ...{&&&&&&& _total +=&&&&&&& _frames.add(new AnimationFrame(image, _total));&&& }
&&& /** *//**&&&& * 以默认播放时间载入图像数组&&&& * &&&& * @param image&&&& */&&& public void addFrame(Image[] image) ...{&&&&&&& for (int i = 0; i & image. i++) ...{&&&&&&&&&&& addFrame(image[i], 500);&&&&&&& }&&& }
&&& /** *//**&&&& * 开始执行动画&&&& * &&&& */&&& public synchronized void start() ...{&&&&&&& _time = 0;&&&&&&& _frameIndex = 0;&&& }
&&& /** *//**&&&& * 更新此动画播放时间&&&& * &&&& * @param time&&&& */&&& public synchronized void update(long time) ...{&&&&&&& if (_frames.size() & 1) ...{&&&&&&&&&&& _time +=
&&&&&&&&&&& if (_time &= _total) ...{&&&&&&&&&&&&&&& _time = _time % _&&&&&&&&&&&&&&& _frameIndex = 0;&&&&&&&&&&& }
&&&&&&&&&&& while (_time & getFrame(_frameIndex).endTime) ...{&&&&&&&&&&&&&&& _frameIndex++;&&&&&&&&&&& }&&&&&&& }&&& }
&&& /** *//**&&&& * 获得当前动画image&&&& * &&&& * @return&&&& */&&& public synchronized Image getImage() ...{&&&&&&& if (_frames.size() == 0) ...{&&&&&&&&&&&&&&&&&& } else ...{&&&&&&&&&&& return getFrame(_frameIndex).&&&&&&& }&&& }
&&& /** *//**&&&& * 返回指定frame&&&& * &&&& * @param i&&&& * @return&&&& */&&& private AnimationFrame getFrame(int i) ...{&&&&&&& return (AnimationFrame) _frames.get(i);&&& }
上面是一个动画面板,用于记录一组连续的画面。AnimationSimple.java...
package org.loon.game.
import java.awt.DisplayMimport java.awt.Gimport java.awt.Graphics2D;import java.awt.Iimport java.awt.Timport java.awt.image.BufferedIimport java.awt.image.MemoryImageSimport java.awt.image.PixelG
import javax.swing.ImageI
/** *//**&* &* &p&&* Title: LoonFramework&* &/p&&* &p&&* Description:动画演示&* &/p&&* &p&&* Copyright: Copyright (c) 2008&* &/p&&* &p&&* Company: LoonFramework&* &/p&&* &p&&* License: &* &/p&&* &* @author chenpeng&* @email:&* @version 0.1&*/public class AnimationSimple ...{&&& // 动作时间&&& private static final long TIME = 20000;
&&& final static private int WIDTH = 800;
&&& final static private int HEIGHT = 600;
&&& private ScreenManager _
&&& private Image _bgI
&&& private Animation _animation1;
&&& private Animation _animation2;
&&& private Image _cacheI
&&& private Graphics _
&&& public static void main(String args[]) ...{
&&&&&&& // 创建一个显示模式及设定参数,分别为:宽、高、比特位数、刷新率(赫兹)PS:frame中图像会自动放大&&&&&&& DisplayMode displayMode = new DisplayMode(WIDTH, HEIGHT, 16, 0);&&&&&&& AnimationSimple test = new AnimationSimple();&&&&&&& test.run(displayMode);
&&&&&&& // System.out.println((0 && 16) | (0 && 8) | 0);&&& }
&&& public void loadImages() ...{&&&&&&& // 为保持图片同步加载,构建一个cache作为二级缓存&&&&&&& _cacheImage = new BufferedImage(WIDTH, HEIGHT, 2);&&&&&&& _graphics = _cacheImage.getGraphics();&&&&&&& // 加载图片&&&&&&& _bgImage = loadImage("test_images/bg01.png", false);&&&&&&& Image[] players1 = new Image[9];&&&&&&& for (int i = 0; i & 9; i++) ...{&&&&&&&&&&& players1[i] = loadImage("test_images/marisa_0" + i + ".png", true);&&&&&&& }&&&&&&& Image[] players2 = new Image[7];&&&&&&& for (int i = 1; i & 8; i++) ...{&&&&&&&&&&& players2[i - 1] = loadImage("test_images/reimu2_0" + i + ".png",&&&&&&&&&&&&&&&&&&& true);&&&&&&& }&&&&&&& // 创建动画&&&&&&& _animation1 = new Animation();&&&&&&& _animation1.addFrame(players1);&&&&&&& _animation2 = new Animation();&&&&&&& _animation2.addFrame(players2);&&& }
&&& /** *//**&&&& * 加载图象&&&& * &&&& * @param fileName&&&& * @param isfiltration&&&& * @return&&&& */&&& private Image loadImage(String fileName, boolean isfiltration) ...{
&&&&&&& // 当ImageIcon使用jar包本身资源时,需要通过jvm获得路径&&&&&&& ClassLoader classloader = getClass().getClassLoader();&&&&&&& Image img = new ImageIcon(classloader.getResource(fileName)).getImage();
&&&&&&& // 为了演示例子没有使用偶的loonframework-game包(那天整合下准备发alpha了),而是直接处理了图像&&&&&&& if (isfiltration) ...{&&&&&&&&&&& int width = img.getWidth(null);&&&&&&&&&&& int height = img.getHeight(null);&&&&&&&&&&& // 创建一个PixelGrabber&&&&&&&&&&& PixelGrabber pg = new PixelGrabber(img, 0, 0, width, height, true);&&&&&&&&&&& try ...{&&&&&&&&&&&&&&& pg.grabPixels();&&&&&&&&&&& } catch (InterruptedException e) ...{&&&&&&&&&&&&&&& e.printStackTrace();&&&&&&&&&&& }&&&&&&&&&&& // 获取其中像素&&&&&&&&&&& int pixels[] = (int[]) pg.getPixels();&&&&&&&&&&& // 遍历过滤像素&&&&&&&&&&& for (int i = 0; i & pixels. i++) ...{&&&&&&&&&&&&&&& // -,0,0即纯黑&&&&&&&&&&&&&&& if (pixels[i] == -) ...{&&&&&&&&&&&&&&&&&&& // 转为透明色&&&&&&&&&&&&&&&&&&& // 也就是255,255,255即纯白 处理为 (255 && 16) | (255 && 8) |&&&&&&&&&&&&&&&&&&& // 255 后可得此结果&&&&&&&&&&&&&&&&&&& pixels[i] = ;&&&&&&&&&&&&&&& }&&&&&&&&&&& }&&&&&&&&&&& // 在内存中生成图像后映射到image&&&&&&&&&&& img = Toolkit.getDefaultToolkit().createImage(&&&&&&&&&&&&&&&&&&& new MemoryImageSource(width, height, pixels, 0, width));&&&&&&& }&&&&&&&&&& }
&&& public void run(DisplayMode displayMode) ...{&&&&&&& _screen = new ScreenManager();&&&&&&& try ...{&&&&&&&&&&& _screen.setFullScreen(displayMode);&&&&&&&&&&& // 初始化图像加载&&&&&&&&&&& loadImages();&&&&&&&&&&& // 动画循环播放&&&&&&&&&&& animationLoop();&&&&&&& } finally ...{&&&&&&&&&&& _screen.restoreScreen();&&&&&&& }&&& }
&&& public void animationLoop() ...{&&&&&&& long startTime = System.currentTimeMillis();&&&&&&& long currTime = startT
&&&&&&& // 每次比较工作时间,无效时将退出运作&&&&&&& while (currTime - startTime & TIME) ...{&&&&&&&&&&& long elapsedTime = System.currentTimeMillis() - currT&&&&&&&&&&& currTime += elapsedT
&&&&&&&&&&& // 改变动画1&&&&&&&&&&& _animation1.update(elapsedTime);&&&&&&&&&&& // 改变动画2&&&&&&&&&&& _animation2.update(elapsedTime);&&&&&&&&&&& // 绘制窗体&&&&&&&&&&& Graphics2D g = _screen.getGraphics();&&&&&&&&&&& draw(g);&&&&&&&&&&& g.dispose();
&&&&&&&&&&& // 更新显示内容&&&&&&&&&&& _screen.update();
&&&&&&&&&&& try ...{&&&&&&&&&&&&&&& Thread.sleep(20);&&&&&&&&&&& } catch (InterruptedException ex) ...{&&&&&&&&&&& }&&&&&&& }
&&& public void draw(Graphics g) ...{&&&&&&& // 绘制背景0,0座标&&&&&&& _graphics.drawImage(_bgImage, 0, 0, null);
&&&&&&& // 绘制动画于0,0座标&&&&&&& _graphics.drawImage(_animation2.getImage(), 0, 0, null);&&&&&&& // 绘制动画于400,0座标&&&&&&& _graphics.drawImage(_animation1.getImage(), 400, 0, null);
&&&&&&& // 将缓存图绘制于窗体0,0座标之上&&&&&&& g.drawImage(_cacheImage, 0, 0, null);
}上面是一个动画演示用例,创建了一个背景及两个动画角色,效果图如下:650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)'
alt="" src="/attachment/583203.jpg" border="0" />实际上无论多么复杂的画面效果,也是以这些最基础的环节拼凑而成的。但是我们也都知道,举凡有利也就有弊,首先这种全屏显示方式无疑增加了系统资源损耗,而且由于分辨率改变造成的图像位置偏移也可能会影响到游戏效果,也增加了潜在错误的产生几率。比如国产的纯java网游《海天英雄传》中,虽然游戏初期只提供了全屏的游戏方式,但后来却突然增加窗口模式,我想或多或少也是与此有关的。所以我个人建议在java游戏开发中应当订制全屏及视窗两种显示模式,由用户选择使用。当然,我并非专业的游戏开发人员,具体的抉择还是应当实际需要而来。本文出自 “” 博客,请务必保留此出处
了这篇文章
类别:┆阅读(0)┆评论(0)
14:30:40 13:33:24第一章:术语详解1.开关:相当于数学中的二进制,只有“开”和“关”两种选择。游戏一开始所有开关都是OFF的,玩魔塔时部分开关一开始就是开的,那是人为因素。(详见公共事件:初始化)制作工具中可以随意创建开关,并可以将其命名。(制作时最好写上具体名称,如:控制60层的门开的开关,可以叫:60层门开)工具中开关操作又称SWITCH,Playerdate_SWITCH=1:当1号开关打开,本脚本才开始工作。$game_SWITCH[1]=ON:1号开关开启。2.变量:变量是一个数据,它使用来储存数据的空位(数据可以使中文或英文或其他文本),同开关,变量也可以随便创建,变量的默认数值为0。以下使其中术语意思。代入:把原数据变为所输入数据。剩余:把原数据乘上一个百分数。操作数中:常用:就是直接输入的数。变量:另一个变量的目前数据。随机数:从A到B不等。(A:前面的空。B:后面的空。)物品:就是一个物品你所拥有的数量。角色:一个角色的某项值。敌人:不必去管,魔塔样板涉及不到。角色(下面的):同上面的角色意思。其他:没什么可说的,自行选择吧。大家注意到呢个统一了吗?就是几号到几号开关或变量都等于一个选项或一个数值,也就是统一操作。3.图层:大致就是把画面分为三个层,一般地形放1层方快内有白色区域的一般为了美观都放第二层.在图层里,3层的东西会覆在2层上,2层会覆在1层上,样板图块中的数字就是个最好的例子,样板0层也有些在2或3层的地形.样板里有种特殊的情况,就是2层的地形都可以被破墙镐和地震卷轴破坏,并不一定得是墙,玩玩夏令营2的70余层就知道.4.事件:如果说脚本编辑器是心脏,那么,事件就是肌肉.没有事件,就不能拿宝物,对话,战斗............事件栏的最上方有个"ID:XXX",这个是自动生成的,表示这个地图中他是第几个事件,事件ID必须连续,规格为三位数,不够三位就拿0占位(非常重要!编辑新楼层和怪物事件编号必须要这样~!)每层的事件ID一旦不连续,就会引起脚本错误,打个比方:事件ID不连续就像1户人家有3个孩子,被称为老大老二老四,这怎么行?以上情况通常出现在中途删除部分事件上.5.显示文章:$game_temp.message_text=""显示引号中的文章。更改文章选项:$game_system.message_position=0,1,2表示上、中、下,三个位置$game_system.message_frame=0,10表示不透明,其他的话就透明等待:@wait_count=X等待X帧中断事件处理:command_end把某一个事件暂时消除$game_map.events[X].erase其中X表示把X号事件暂时消除,如果是消除本事件X=@event_id执行公共事件:$mon_event_id=编号执行编号的公共事件。注意,这个执行和直接在事件中的公共事件有微妙区别。开关操作:$game_switches[编号]=true/falsetrue是打开,false是关闭变量操作:$game_variables[编号]=数值这里有一些常用的内容:rand(100):返回0-99的随机数rand(100)+10000:返回1的随机数$game_party.item_number(编号):编号物品的个数角色相关:以下为某编号的角色的相关属性生命:$game_actors[编号].hp精神:$game_actors[编号].sp经验:$game_actors[编号].exp等级:$game_actors[编号].level最大生命:$game_actors[编号].maxhp最大精神:$game_actors[编号].maxsp力量:$game_actors[编号].str灵巧:$game_actors[编号].dex速度:$game_actors[编号].agi魔力:$game_actors[编号].int攻击力:$game_actors[编号].atk物理防御:$game_actors[编号].pdef魔法防御:$game_actors[编号].mdef回避修正:$game_actors[编号].eva姓名:$game_actors[编号].name职业编号:$game_actors[编号].class_id职业名称:$game_actors[编号].class_name武器编号:$game_actors[编号].weapon_id防具1编号:$game_actors[编号].armor1_id防具2编号:$game_actors[编号].armor2_id防具3编号:$game_actors[编号].armor3_id防具4编号:$game_actors[编号].armor4_id完全回复:$game_actors[编号].recover_all领悟特技:$game_actors[编号].learn_skill(编号)遗忘特技:$game_actors[编号].forget_skill(编号)位置(前卫返回0,中卫返回1,后卫返回2):$data_classes[$game_actors[编号].class_id].position学会特技总数:$game_actors[编号].skills.size敌人:$game_troop.enemies[编号]敌人拥有角色的部分功能,包括.hp,.sp,.maxhp,.maxsp,.str,.dex,.agi,.int,.atk,.pdef,.mdef,.eva地图的事件属性:$game_map.events[编号].x,$game_map.events[编号].y编号事件的x,y坐标$game_map.events[编号].screen_x,$game_map.events[编号].screen_y编号事件的屏幕x,y坐标$game_map.events[编号].direction编号事件的朝向$game_map.events[编号].terrain_tag编号事件所处的地形标志$game_map.events[编号].moveto(x,y)把事件扔到(x,y)------------------------------------以上几个事件的,如果要求为角色,则为“$game_player.x”等地图ID:$game_map.map_id同伴总人数:$game_party.actors.size步数:$game_party.steps金钱:$game_party.gold游戏总时间(秒数):Graphics.frame_count/Graphics.frame_rate游戏总帧数:Graphics.frame_count游戏帧速率(可直接=n调整):Graphics.frame_rate计时器剩余秒数:$game_system.timer/Graphics.frame_rate存档次数:$game_system.save_count独立开关操作:$game_self_switches[[地图编号,事件编号,"A"]]=true/false把地图编号的地图上的事件编号的事件的A开关打开。其实不光ABCD,还可以建立更多独立开关,不过调用也得用同样脚本。计时器打开:$game_system.timer=需要的秒数;$game_system.timer_working=true计时器关闭:$game_system.timer_working=false增减金钱:$game_party.gain_gold(金钱量)增减物品:$game_party.gain_item(物品编号,数量)举例:$game_party.gain_item(rand(10),rand(10)):随机获得0-9号中某一物品,数量为0-9随机。增减武器:$game_party.gain_weapon(物品编号,数量)增减防具:$game_party.gain_armor(物品编号,数量)清空现有所有物品:$game_party.items.clear清空所有武器:$game_party.weapons.clear清空所有防具:$game_party.armors.clear角色替换:加入角色:$game_party.add_actor(编号)删除角色:$game_party.remove_actor(编号)初始化角色:$game_party[编号].setup(编号)更改窗口外观:$game_system.windowskin_name=文件名更改禁止存档$game_system.save_disabled=true/false更改禁止菜单:$game_system.menu_disabled=true/false更改禁止遇敌:$game_system.encounter_disabled=true/false地图卷动:$game_map.start_scroll(方向,距离,速度)地图某角色显示动画:$game_map.events[id].animation_id=动画编号角色透明:$game_player.transparent=true/false等待移动结束:@move_route_waiting=true开始更改色调:$game_screen.start_tone_change(Tone.new(R,G,B,A),帧数)画面闪烁:$game_screen.start_flash(Color.new(R,G,B,A),帧数)画面振动:$game_screen.start_shake(力度,速度,帧数)显示图片:$game_screen.pictures[number].show(name,origin,x,y,zoom_x,zoom_y,opacity,blend_type)移动图片:$game_screen.pictures[number].move(duration,origin,x,y,zoom_x,zoom_y,opacity,blend_type)其中:#name:文件名#origin:原点#x:X坐标#y:Y坐标#zoom_x:X方向放大率#zoom_y:Y方向放大率#opacity:不透明度#blend_type:合成方式#duration:时间旋转图片:$game_screen.pictures[number].rotate(速度)删除图片:$game_screen.pictures[number].erase显示动画(战斗中)battler.animation_id=动画编号battler可以是敌人或者自己人,请先定义。显示伤害:battler.damage=伤害值battler.damage_pop=true注意,这个显示伤害可以让伤害值为字符串!并不会真的减血,减血用battler.hp-=数值battler.criticle=true这个还可以打开会心一击标志战斗中断:$game_temp.battle_abort=true调用菜单:$game_temp.menu_calling=true调用存档画面:$game_temp.save_calling=true游戏结束:$game_temp.gameover=true返回标题画面:$game_temp.to_title=true强行启动事件:$game_map.events[编号].start通行判定:$game_player.passable?(x,y,方向)用来判断地图某处是否在某个方向可通行正在移动判定:$game_player.moving?$game_map.events[编号].moving?播放效果:Audio.bgm_play("文件名",音量,节奏速度)Audio.bgs_play("文件名",音量,节奏速度)Audio.me_play("文件名",音量,节奏速度)Audio.se_play("文件名",音量,节奏速度)播放bgm,bgs,me,seAudio.bgm_stopAudio.bgs_stopAudio.me_stopAudio.se_stop停止播放bgm,bgs,me,se$game_system.playing_bgm,$game_system.playing_bgs获得演奏中的bgm,bgsgame_system.bgm_memorize,game_system.bgm_restoregame_system.bgs_memorize,game_system.bgs_restore记忆、还原bgm,bgs判断某角色在队伍中:$game_party.actors.include?($game_actors[编号])判断是否学过某特技:$game_actors[编号].skill_learn?(特技编号)以上选自66RPG,是比较重要的,新手最好记记,这样以后学习脚本会轻松些变量,开关和事件都是基本功,一定要熟知这些,了解其中的原理.第二章.怪物1.能力:打开工具栏-数据库-敌人,就可以对怪物进行编辑了.名字:...........MAXSP:原本是法术值,可样板用不找,不用管他了(不是最新样板的请参考其他怪物的)MAXHP:就是生命的意思啦!力量:攻击灵巧:防御魔法防御:领域怪物的控制范围由这项能力决定金币:...........EXP:经验(如果每个怪都是1的话,建议把角色状态栏里的"经验"从脚本编辑器里改为杀怪数)其他的就不用管了.怪物中有特殊能力,可以查看.数值属性说明0普通1中毒战斗后,角色每行动一格,减生命10点(变量25决定)2衰弱战斗后,角色攻防衰减为正常的75%(变量52决定)4吸血战斗前,怪物首先吸取角色34%的生命加到自身(变量53决定)8坚固怪物的防御至少等于角色攻击-1(变量54决定)16先攻战斗时,怪物首先攻击1次(变量55决定)32迟缓战斗后,勇士行走速度降低到3.3(变量56决定,正常4.3)64魔攻战斗时,怪物的攻击无视角色的防御*1(变量57决定)128连击战斗时,怪物每回合攻击2次(数据库敌人回避修正决定)256领域经过怪物周围Y格时自动减生命X点(X由数据库敌人maxsp决定,Y由数据库敌人魔法防御决定,0为十字领域范围)512爆击战斗前,怪物附加角色防御的X点作为伤害(X等于角色防御的90%,变量58决定百分比)1024潜伏角色看不到怪物,除非拥有物品40-探知器并距离怪物x格(变量79决定物品id,变量84决定x的大小)2048无敌角色无法击败怪物,除非拥有物品10-圣十字架(变量71决定)4096模仿怪物的攻防等于角色的攻防*1(变量60决定)8192诅咒战斗后,角色再次战斗无法获得金币经验,本次可以获得9900反弹战斗时,怪物附加角色攻击的10%作为伤害(变量70决定)9910重生怪物被击败后,角色转换楼层则怪物再次出现9920净化战斗前,怪物附加勇士魔防的3倍作为伤害(变量104决定)9930神偷战斗后,勇士所持的4种血瓶数量减半以上属性中提到的数值不是最新样板的在MAXSP里输入,是最新样板的在怪物名字后面加":"再加数值(多重属性就是:N:N)N的意思:数值.2.编辑:很简单,把事件的名称改为怪物XXX(这里要用到那个1章,4节说哪个规则了)(加上"BOSS"就无法被炸弹和圣锤消灭了.),在设置区域,公共时间-战斗,在固定朝向和停止时动画上打勾,在与事件接触(也可以与主角接触)打勾,就OK了!~攻防超过999用$game_enemies[怪物编号].某项能力=XXX(如果是名字,要把XXX拿双引号引上)第三章.物品1.普通物品如何设图什么的我就不说了。这类物品一般是不能使用的。2.特殊物品像楼层传送器,破墙镐都属于,具体如何制作见公共事件的使用物品处理。做可以使用的物品也要选个公共事件(自己创建也行)。具体的自己做吧,这时要研究下脚本编辑器,学点语言,对做物品很有帮助
相关问题略懂社热议相关搜索
问问青春版,什么都略懂一点页面没有找到