Files
Game/src/main/java/uno/mloluyu/desktop/GameScreen.java
2025-09-25 14:57:01 +08:00

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();
}
}