100 lines
3.2 KiB
Java
100 lines
3.2 KiB
Java
package uno.mloluyu.desktop;
|
|
|
|
import com.badlogic.gdx.Gdx;
|
|
import com.badlogic.gdx.ScreenAdapter;
|
|
import com.badlogic.gdx.graphics.Color;
|
|
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
|
|
import com.badlogic.gdx.graphics.glutils.ShapeRenderer;
|
|
import com.badlogic.gdx.math.Rectangle;
|
|
|
|
import java.util.HashMap;
|
|
import java.util.Map;
|
|
|
|
import uno.mloluyu.characters.SimpleFighter;
|
|
import uno.mloluyu.network.NetworkManager;
|
|
import uno.mloluyu.util.ClearScreen;
|
|
import uno.mloluyu.versatile.FighterController;
|
|
|
|
public class GameScreen extends ScreenAdapter {
|
|
private final SimpleFighter player;
|
|
private final FighterController controller;
|
|
private final Map<String, SimpleFighter> otherPlayers = new HashMap<>();
|
|
|
|
private SpriteBatch batch;
|
|
private ShapeRenderer shapeRenderer;
|
|
|
|
public GameScreen(MainGame game, SimpleFighter player) {
|
|
this.player = player;
|
|
this.controller = new FighterController(player);
|
|
}
|
|
|
|
@Override
|
|
public void show() {
|
|
batch = new SpriteBatch();
|
|
shapeRenderer = new ShapeRenderer();
|
|
Gdx.input.setInputProcessor(controller);
|
|
}
|
|
|
|
@Override
|
|
public void render(float delta) {
|
|
new ClearScreen();
|
|
|
|
player.update(delta);
|
|
controller.update(delta);
|
|
|
|
if (NetworkManager.getInstance().isConnected()) {
|
|
NetworkManager.getInstance().sendPosition(player.getHitbox().x, player.getHitbox().y);
|
|
}
|
|
|
|
shapeRenderer.begin(ShapeRenderer.ShapeType.Filled);
|
|
|
|
renderFighter(player, Color.BLUE);
|
|
if (player.isAttacking()) renderAttackBox(player, Color.RED);
|
|
|
|
Map<String, float[]> positions = NetworkManager.getInstance().getPlayerPositions();
|
|
if (positions != null) {
|
|
for (Map.Entry<String, float[]> entry : positions.entrySet()) {
|
|
String id = entry.getKey();
|
|
float[] pos = entry.getValue();
|
|
if (pos == null) continue;
|
|
SimpleFighter remote = otherPlayers.computeIfAbsent(id, k -> new SimpleFighter("Remote-" + k));
|
|
remote.setPosition(pos[0], pos[1]);
|
|
remote.update(delta);
|
|
renderFighter(remote, Color.GREEN);
|
|
}
|
|
}
|
|
|
|
shapeRenderer.end();
|
|
}
|
|
|
|
private void renderFighter(SimpleFighter fighter, Color color) {
|
|
shapeRenderer.setColor(color);
|
|
Rectangle r = fighter.getHitbox();
|
|
shapeRenderer.rect(r.x, r.y, r.width, r.height);
|
|
}
|
|
|
|
private void renderAttackBox(SimpleFighter fighter, Color color) {
|
|
shapeRenderer.setColor(color);
|
|
Rectangle a = fighter.getAttackbox();
|
|
shapeRenderer.rect(a.x, a.y, a.width, a.height);
|
|
}
|
|
|
|
// private void checkPlayerAttacks() {
|
|
// if (!player.isAttacking()) return;
|
|
|
|
// for (SimpleFighter target : otherPlayers.values()) {
|
|
// if (target.isAlive() && player.getAttackbox().overlaps(target.getHitbox())) {
|
|
// target.takeHit(player.getAttackPower()); // 使用访问器方法
|
|
// System.out.println("命中远程玩家:" + target.getName());
|
|
// }
|
|
// }
|
|
// }
|
|
|
|
@Override
|
|
public void dispose() {
|
|
batch.dispose();
|
|
shapeRenderer.dispose();
|
|
NetworkManager.getInstance().disconnect();
|
|
}
|
|
}
|