我在libgdx/java使用Box2d的RPG 2d中工作。
我有主角和其他三个追随者。我希望他们像蛇一样沿着主人公的路线走(与Master System/Phantasy Star和其他旧RPG一样),以免在发现狭窄的入口时搞砸。
在我的PlayScreen课程中,我分别调用所有角色。
private static Alis _player;
private static Myau _follower;
private static Odin _follower1;
private static Noah _follower2;
在屏幕上
_player = new Alis(world, this, mapManager);
_follower = new Myau(world, this, mapManager);
_follower1 = new Odin(world, this, mapManager);
_follower2 = new Noah(world, this, mapManager);
HandleInput(浮点dt)方法我只移动主字符
if(Gdx.input.isKeyPressed(Input.Keys.RIGHT) && _player.b2body.getLinearVelocity().x <= 0.5f) {
_player.b2body.applyLinearImpulse(new Vector2(0.05f, 0), _player.b2body.getWorldCenter(), true);
}else if(Gdx.input.isKeyPressed(Input.Keys.LEFT) && _player.b2body.getLinearVelocity().x >= -0.5f) {
_player.b2body.applyLinearImpulse(new Vector2(-0.05f, 0), _player.b2body.getWorldCenter(), true);
}else if(Gdx.input.isKeyPressed(Input.Keys.RIGHT) == Gdx.input.isKeyPressed(Input.Keys.LEFT)){
_player.b2body.setLinearVelocity(0f, _player.b2body.getLinearVelocity().y);
}
if(Gdx.input.isKeyPressed(Input.Keys.UP) && _player.b2body.getLinearVelocity().y <= 0.5f) {
_player.b2body.applyLinearImpulse(new Vector2(0, 0.05f), _player.b2body.getWorldCenter(), true);
} else if(Gdx.input.isKeyPressed(Input.Keys.DOWN) && _player.b2body.getLinearVelocity().y >= -0.5f) {
_player.b2body.applyLinearImpulse(new Vector2(0, -0.05f), _player.b2body.getWorldCenter(), true);
} else if(Gdx.input.isKeyPressed(Input.Keys.UP) == Gdx.input.isKeyPressed(Input.Keys.DOWN)){ _player.b2body.setLinearVelocity(_player.b2body.getLinearVelocity().x, 0f);
}
更新(浮点dt)方法
handleInput(dt);
_player.update(dt);
_follower.update(dt, _player.b2body.getPosition());
_follower1.update(dt, _follower.b2body.getPosition());
_follower2.update(dt, _follower1.b2body.getPosition());
渲染(浮动增量)方法
game.batch.begin();
_follower2.draw(game.batch);
_follower1.draw(game.batch);
_follower.draw(game.batch);
_player.draw(game.batch);
game.batch.end();
dispose()方法
_player.dispose();
_follower.dispose();
_follower1.dispose();
_follower2.dispose();
现在,在我的characters类中,使用update(float dt,Vector2 position)方法
if ((position.x - b2body.getPosition().x) > (15 /PhantasyStar.PPM)) {
b2body.setLinearVelocity(new Vector2(0.5f, 0));
} else if ((position.x - b2body.getPosition().x) < ( - 15 /PhantasyStar.PPM)) {
b2body.setLinearVelocity(new Vector2(-0.5f, 0));
} else if ((position.y - b2body.getPosition().y) > (15 / PhantasyStar.PPM)) {
b2body.setLinearVelocity(new Vector2(0, 0.5f));
} else if ((position.y - b2body.getPosition().y) < (-15 / PhantasyStar.PPM)) {
b2body.setLinearVelocity(new Vector2(0, -0.5f));
} else if (((position.y - b2body.getPosition().y) <= (15 / PhantasyStar.PPM) && (position.y - b2body.getPosition().y) >= (-15 / PhantasyStar.PPM)) || ((position.x - b2body.getPosition().x) <= (15 /PhantasyStar.PPM) && (position.x - b2body.getPosition().x) >= (-15 /PhantasyStar.PPM)) ) {
b2body.setLinearVelocity(new Vector2(0, 0));
}
setPosition(b2body.getPosition().x - getWidth() / 2, b2body.getPosition().y - getHeight() / 4);
setRegion(getFrame(dt));
这段代码给了我一个很好的结果,例如,如果我只在x轴或y轴上行走,玩家之间的距离和我所需要的完全一样,而且回来也正确,但是如果我开始上下移动,他们开始互相跟随,但每次我发现障碍物时,一些跟随者就会卡住。所以我想让他们遵循主人公的路线。
我百分之百确信我所做的是不正确的,但我试图找到一些相关文献,但没有找到。我相信如果我找到了一种方法来获得主力球员的最后一个位置,并使其成为第二个目标。
我试着在更新玩家位置后收集最后一个位置,并在跟随者的下一次更新中使用,但是,即使我要求跟随者跟随那个位置,它也太近了,所以我假设它不是正确的收集位置,或者可能是不同的方法。我是否需要创建一个数组来收集所有的位置,并延迟将此信息传递给其他角色?
是某个在游戏开发方面更有经验的人来帮我?
在PlayScreen类上创建2个数组变量。这两个数组将收集主要玩家的位置和状态。
public class PlayScreen implements Screen {
private Array<Vector2> _playerPath;
private Array<Alis.State> _playerState;
}
在PlayScreen构造函数中,我初始化了数组,所以在。快去拿。布景会有用的。
public PlayScreen(PhantasyStar game, MapManager mapManager){
//starting Array for player path and state
_playerPath = new Array<Vector2>(100);
_playerState = new Array<Alis.State>(100);
for(int k=0;k<100;k++) {
_playerPath.add(new Vector2(0f, 0f));
_playerState.add(Alis.State.STANDING_DOWN);
}
//Create Player
_player = new Alis(world, this, mapManager);
_follower = new Myau(world, this, mapManager);
_follower1 = new Odin(world, this, mapManager);
_follower2 = new Noah(world, this, mapManager);
}
仍然在PlayScreen类中,更新方法。阵列中的每个位置和每个状态都会更新,为跟随者创建一条路径。我更新了followers更新方法,每次延迟20帧。
public void update(float dt){
//start ***Items for the following path***
for (int i = 99; i > 0; i--) {
_playerPath.get(i).set(_playerPath.get(i - 1));
_playerState.set(i,_playerState.get(i - 1));
}
_playerPath.get(0).set(_player.b2body.getPosition());
_playerState.set(0, _player.currentState);
handleInput(dt);
world.step(1/60f, 6, 2);
_player.update(dt);
_follower.update(dt, _playerPath.get(20), _playerState.get(20));
_follower1.update(dt, _playerPath.get(40), _playerState.get(40));
_follower2.update(dt, _playerPath.get(60), _playerState.get(60));
// end ***Items for the following path ***
gamecam.position.x = _player.b2body.getPosition().x;
gamecam.position.y = _player.b2body.getPosition().y;
//removing the blank spaces in the borders stopping the camera
xOffset = (gamecam.position.x - PhantasyStar.V_WIDTH / PhantasyStar.PPM / 2);
xOffsetRight = (mapManager.getMapWidth() / PhantasyStar.PPM) - gamecam.position.x - (PhantasyStar.V_WIDTH / PhantasyStar.PPM / 2);
yOffset = (gamecam.position.y - (PhantasyStar.V_HEIGHT / PhantasyStar.PPM / 2));
yOffsetUp = (mapManager.getMapHeight() / PhantasyStar.PPM) - gamecam.position.y - (PhantasyStar.V_HEIGHT / PhantasyStar.PPM / 2);
if(xOffset < 0)
gamecam.position.x = PhantasyStar.V_WIDTH / PhantasyStar.PPM / 2;
if(xOffsetRight < 0)
gamecam.position.x = (mapManager.getMapWidth() / PhantasyStar.PPM) - (PhantasyStar.V_WIDTH / PhantasyStar.PPM / 2);
if(yOffset < 0)
gamecam.position.y = PhantasyStar.V_HEIGHT / PhantasyStar.PPM / 2;
if(yOffsetUp < 0)
gamecam.position.y = (mapManager.getMapHeight() / PhantasyStar.PPM) - (PhantasyStar.V_HEIGHT / PhantasyStar.PPM / 2);
// end removing blank spaces
//portal contact
if(isCollided) {
updateMap();
}
gamecam.update();
renderer.setView(gamecam);
}
下一个代码是跟随类,使用数组中的位置和状态。
public TextureRegion getFrame(float dt, Alis.State state) {
currentState = getState(state);
TextureRegion region;
switch (currentState) {
case RUN_UP:
region = myauRun_Up.getKeyFrame(stateTimer, true);
break;
case RUN_DOWN:
region = myauRun_Down.getKeyFrame(stateTimer, true);
break;
case RUN_RIGHT:
region = myauRun_Right.getKeyFrame(stateTimer, true);
break;
case RUN_LEFT:
region = myauRun_Left.getKeyFrame(stateTimer, true);
break;
case STANDING_UP:
region = myauStand_Up;
break;
case STANDING_RIGHT:
region = myauStand_Right;
break;
case STANDING_LEFT:
region = myauStand_Left;
break;
case STANDING_DOWN:
default:
region = myauStand_Down;
break;
}
stateTimer = currentState == previousState ? stateTimer + dt : 0;
previousState = currentState;
return region;
}
public State getState(Alis.State state) {
if (state == Alis.State.RUN_UP)
return State.RUN_UP;
else if (state == Alis.State.RUN_DOWN)
return State.RUN_DOWN;
else if (state == Alis.State.RUN_RIGHT)
return State.RUN_RIGHT;
else if (state == Alis.State.RUN_LEFT)
return State.RUN_LEFT;
else if (state == Alis.State.STANDING_UP)
return State.STANDING_UP;
else if (state == Alis.State.STANDING_LEFT)
return State.STANDING_LEFT;
else if (state == Alis.State.STANDING_DOWN)
return State.STANDING_DOWN;
else
return State.STANDING_DOWN;
}
public void update(float dt, Vector2 position, Alis.State state) {
setPosition(position.x - getWidth() / 2, position.y - getHeight() / 4);
setRegion(getFrame(dt, state));
}
我希望这能帮助其他人
问题内容: 我有两个AWS账户-假设A和B. 在帐户B中,我定义了一个角色,该角色允许从帐户A中访问另一个角色。我们称其为角色B 在帐户A中,我定义了一个角色,该角色允许root用户承担角色。让我们称之为角色A 角色A附加了以下策略 作为帐户A的用户,我担任角色A。现在使用此临时凭据,我想承担角色B并访问帐户B拥有的资源。我有以下代码 该代码适用于我从客户端获得的一组角色,但不适用于我在我有权
我想用JavaFx让我的角色跳跃。当我快速点击空格多次时,角色会迅速掉落并消失。当我多次单击空格,但速度较慢时,角色会按其应有的方式跳跃。 我不确定问题出在哪里,但我认为这与AnimationTimer及其帧有关。也许我用了一种错误的方式让我的角色跳跃,所以如果是这样,有人能给我正确的方式吗?我必须使用JavaFx<化身:我角色的形象。我用重力和AnimationTimer使曲线像跳跃一样。
角色是一系列权限的集合,用户加入项目时的角色决定了用户在项目中的权限。 角色是一系列权限的集合,用户加入项目时的角色决定了用户在项目中的权限。 系统内置角色说明如下: 角色 权限 是否共享 权限范围 权限说明 admin sysadmin 全局共享 系统 用户只有以admin角色加入default的system项目时才有管理后台全部权限。 domainadmin domainadmin 全局共享
角色定义了对集群的指定命名空间下资源的权限。 角色定义了对集群的指定命名空间下资源的权限。多集群角色支持将角色关联到多个集群,并在指定集群中创建同样权限的角色。 入口:在云管平台单击左上角导航菜单,在弹出的左侧菜单栏中单击 “容器/多集群资源/角色” 菜单项,进入角色页面。 新建角色 该功能用于新建多集群角色。新建多集群角色之前请先创建多集群命名空间。 在角色页面,单击列表上方 “新建” 按钮,进
角色定义了对集群的指定命名空间下资源的权限。 角色定义了对指定命名空间里资源的权限,通过与服务账户进行绑定,从而控制服务账户的操作权限。 角色的详细介绍请参考Kubernetes官方文档-RBAC。 入口:在云管平台单击左上角导航菜单,在弹出的左侧菜单栏中单击 “容器/集群/角色” 菜单项,进入角色页面。 查看角色 该功能用于基于集群、命名空间筛选角色信息。 在角色页面,默认查看一个集群下所有命名
安全角色是由应用开发人员或装配人员定义的逻辑用户分组。当部署了应用,由部署人员映射角色到运行时环境的 principal 或组。 Servlet 容器根据 principal 的安全属性为与进入请求相关的principal 实施声明式或编程式安全。 这可能以如下任一方式发生: 部署人员已经映射一个安全角色到运行环境中的一个用户组。调用的principal 所属的用户组取自其安全属性。仅当 prin