package org.test; import loon.LTexture; import loon.action.avg.AVGDialog; import loon.action.sprite.AnimationHelper; import loon.event.GameTouch; import loon.font.LFont; import loon.srpg.SRPGScreen; import loon.srpg.ability.SRPGDamageData; import loon.srpg.actor.SRPGActor; import loon.srpg.actor.SRPGActorFactory; import loon.srpg.actor.SRPGActorStatus; import loon.srpg.actor.SRPGActors; import loon.srpg.actor.SRPGStatus; import loon.srpg.field.SRPGField; import loon.srpg.field.SRPGFieldElement; import loon.srpg.field.SRPGFieldElements; import loon.srpg.field.SRPGTeams; import loon.utils.ArrayMap; import loon.utils.MathUtils; import loon.utils.timer.LTimerContext; /** * 此示例暂时不能运行在HTML5之上(因为GWT不支持多线程,目前此示例有待改进,一是重写srpg模块,二是上teavm) */ public class SRPGTest extends SRPGScreen { public SRPGTest() { // super("assets/srpg/map.txt", AVGDialog.getRMXPDialog("assets/srpg/w11.png", 460, 150), 48, 48); // 不使用回合交替特效进行提示 setPhase(false); } /** * 设置当前地图中索引与具体地图瓦片的对应关系 */ protected void initFieldElementConfig(SRPGFieldElements elements) { // LGame默认提供了22种基础地形,不同的地形对应了不同的移动限制效果. // 当然,用户可以在需要时自行扩展. elements.putBattleElement(0, ELEMENT_PALACE, "皇宫"); elements.putBattleElement(1, ELEMENT_WALL, "雕塑"); } protected void initMapConfig(SRPGField field) { field.setBigImageMap("assets/srpg/map.png"); } protected void winnerCheck() { } protected boolean startSrpgProcess() { return false; } protected boolean endSrpgProcess() { return false; } private SRPGActor p, hero, hero1; protected void initActorConfig(SRPGActors actors) { // 载入默认的角色及技能设置 actors.makeDefActors(); // 自定义角色状态 SRPGActorStatus status = new SRPGActorStatus(); status.status_jobname = "人形自走炮"; status.status_max_hp = new float[] { 180F, 9F }; status.status_max_mp = new float[] { 100F, 1.0F }; status.status_power = new float[] { 140F, 8.8F }; status.status_vitality = new float[] { 145F, 6.5F }; status.status_agility = new float[] { 140F, 4F }; status.status_magic = new float[] { 10F, 0F }; status.status_resume = new float[] { 0F, 0F }; status.status_mind = new float[] { 125F, 3F }; status.status_sp = new float[] { 95F, 5.5F }; status.status_dexterity = new float[] { 95F, 6.5F }; status.status_regeneration = new float[] { 71F, 0.9F }; status.status_guardelement = new int[] { 105, 95, 105, 105, 105, 95, 105, 105 }; status.status_move = new float[] { 3F, 0F }; status.ability = new int[] { 0, 1, 2, 10, 6 }; status.status_movetype = 0; SRPGActorStatus status1 = new SRPGActorStatus(); status1.status_jobname = "火星来的灌水女王"; status1.status_max_hp = new float[] { 180F, 9F }; status1.status_max_mp = new float[] { 300F, 2.0F }; status1.status_power = new float[] { 140F, 8.8F }; status1.status_vitality = new float[] { 145F, 6.5F }; status1.status_agility = new float[] { 140F, 4F }; status1.status_magic = new float[] { 10F, 0F }; status1.status_resume = new float[] { 0F, 0F }; status1.status_mind = new float[] { 125F, 3F }; status1.status_sp = new float[] { 95F, 5.5F }; status1.status_dexterity = new float[] { 95F, 6.5F }; status1.status_regeneration = new float[] { 71F, 0.9F }; status1.status_guardelement = new int[] { 105, 95, 105, 105, 105, 95, 105, 105 }; status1.status_move = new float[] { 3F, 0F }; status1.ability = new int[] { 0, 14, 16, 20, 6 }; status1.status_movetype = 0; // 保存到静态引用的SRPGActorFactory类当中(所以自定义的SRPGActorStatus加载一次即可, // 不用每个Scrren都设置一次) SRPGActorFactory.putActorStatus(status); SRPGActorFactory.putActorStatus(status1); // 在索引0位置注入角色,角色动画采集方式为E社标准,职业索引为15(从SRPGActorFactory中取),等级为1,分组为1,坐标为7,12 p = actors.putActor(0, "鹏凌三千", AnimationHelper .makeEObject("assets/srpg/cp.png"), 15, 1, 1, 7, 12); // 方向向下 p.setDirection(MOVE_UP); // 设定脸谱(没有也无所谓) p.getActorStatus().face = LTexture.createTexture("assets/srpg/cpf.png"); // 身份为敌方主角 p.getActorStatus().leader = LEADER_MAIN; // AI模式为顽抗模式 p.getActorStatus().computer = STUBBORNLYRESIST; hero = actors.putActor(1, "诚哥", AnimationHelper .makeRMVXObject("assets/srpg/rz.png"), 16, 90, 0, 8, 3); hero.setDirection(MOVE_LEFT); hero.getActorStatus().face = LTexture.createTexture("assets/srpg/rzf.png"); hero1 = actors.putActor(2, "鱿鱼娘", "assets/srpg/wz.png", 17, 95, 0, 7, 3); hero1.setDirection(MOVE_RIGHT); hero1.getActorStatus().face = LTexture.createTexture("assets/srpg/wzf.png"); hero1.getActorStatus().leader = LEADER_MAIN; } protected void initTeamConfig(SRPGTeams team) { // 设定分组名称(顺序配置分组ID,也可详细设置) team.setTeams(new String[] { "鱿鱼娘一方", "鹏凌三千一方" }); } public void onClickActor(SRPGActor actor, int x, int y) { } public void onClickField(SRPGFieldElement element, int x, int y) { } protected void processAttackAfter(int index, SRPGActor actor) { } protected void processAttackBefore(int index, SRPGActor actor) { } protected void processChangePhaseAfter() { // 禁止滚屏执行 setTouchMoveLock(true); // 让事件仅在主角方阶段发生 if (getTeams().getPhase() == 0) { switch (getTeams().getTurn()) { // 当回合1时 case 1: // 显示提示信息,自动播放 setHelper(new String[] { "太平洋深处的水产世界", "坐井喷天火星城" }, true); // 设定一个移动状态标记,以调控剧情中的移动节奏 boolean moveFlag = true; for (int j = 0; j < 4; j++) { for (int i = 0; i < (moveFlag ? 1 : 2); i++) { hero1.moveActorShow(MOVE_LEFT, j < 2 ? 90 : 30); hero.moveActorShow(MOVE_LEFT, j < 2 ? 90 : 30); hero.setDirection(MOVE_LEFT); hero1.setDirection(MOVE_RIGHT); hero.waitMove(this); hero1.waitMove(this); } moveFlag = !moveFlag; for (int i = 0; i < (moveFlag ? 1 : 2); i++) { hero.moveActorShow(MOVE_RIGHT, j < 2 ? 90 : 30); hero1.moveActorShow(MOVE_RIGHT, j < 2 ? 90 : 30); hero.setDirection(MOVE_LEFT); hero1.setDirection(MOVE_RIGHT); hero.waitMove(this); hero1.waitMove(this); } hero.waitMove(this); hero1.waitMove(this); switch (j) { case 0: // 调用AVG脚本中的分支判定 callAvgScript("assets/srpg/script.txt", "index", "0"); break; case 1: callAvgScript("assets/srpg/script.txt", "index", "1"); break; default: break; } } callAvgScript("assets/srpg/script.txt", "index", "2"); break; case 2: callAvgScript("assets/srpg/script.txt", "index", "3"); break; default: break; } } // 恢复滚屏执行 setTouchMoveLock(false); } protected void processChangePhaseBefore() { } /** * 当角色已经被确定死亡时 */ protected boolean processDeadActor(int index) { if (index != 0) { setHelper("鹏凌三千回家吃饭去了 !"); return true; } else { SRPGActor actor = findActor(index); SRPGStatus oldStatus = actor.getActorStatus(); if (oldStatus.level < 99) { ArrayMap vars = new ArrayMap(10); vars.put("index", "4"); switch (MathUtils.random.nextInt(3)) { case 0: vars .put( "cpmes", "鹏凌三千:鹏翼一展凌九天,三千世界等云烟。长啸能将星斗碎,高翮会令银河干。凤凰于我看家狗,真龙是吾盘中餐。须弥倾覆身未老,昆仑山崩体犹闲。可笑蝼蚁啖金石,金石未损只自残!"); break; case 1: vars.put("cpmes", "鹏凌三千:哈哈哈哈哈哈,信春哥不过是原地满血复活,让你见识一下本少爷原地满血升级复活的神技~"); break; case 2: vars.put("cpmes", "鹏凌三千:道法无形,无器可容,君子不器,始臻全功,生死随心,神魔震惊!"); break; } // 让角色消失 actor.setVisible(false); actor.setExist(false); LTexture old = actor.getActorStatus().face; // 重新设定状态 actor.setActorStatus(SRPGActorFactory.makeActorStatus("鹏凌三千", oldStatus.number, oldStatus.level + 1, oldStatus.team, oldStatus.group)); actor.getActorStatus().face = old; // 执行脚本 callAvgScript("assets/srpg/script.txt", vars); } return false; } } /** * 角色伤害数据输入前 */ protected void processDamageInputBefore(SRPGDamageData damagedata, int atk, int def) { } /** * 角色伤害数据输入后 */ protected void processDamageInputAfter(SRPGDamageData damagedata, int atk, int def) { } /** * 角色死亡后 */ protected void processDeadActorAfter(int index, SRPGActor actor) { } /** * 角色死亡后 */ protected void processDeadActorBefore(int index, SRPGActor actor) { } public void onLoading() { makeEmulatorButton(); add(MultiScreenTest.getBackButton(this,1,getWidth() - 100, 25)); } public void processLevelUpAfter(int index, SRPGActor actor) { } public void processLevelUpBefore(int index, SRPGActor actor) { } public void onDown(GameTouch e) { } public void onMove(GameTouch e) { } public void onUp(GameTouch e) { } public void alter(LTimerContext timer) { } @Override public void resize(int width, int height) { // TODO Auto-generated method stub } @Override public void resume() { // TODO Auto-generated method stub } @Override public void pause() { // TODO Auto-generated method stub } }