Initial commit

This commit is contained in:
2026-04-05 17:17:46 -03:00
commit 2293dc29fb
33 changed files with 1644 additions and 0 deletions

17
core/build.gradle Normal file
View File

@@ -0,0 +1,17 @@
[compileJava, compileTestJava]*.options*.encoding = 'UTF-8'
eclipse.project.name = appName + '-core'
dependencies {
api "com.badlogicgames.gdx:gdx:$gdxVersion"
api "com.github.crykn:kryonet:$kryoNetVersion"
implementation project(':shared')
if(enableGraalNative == 'true') {
implementation "io.github.berstanio:gdx-svmhelper-annotations:$graalHelperVersion"
implementation(project(":shared"))
}
}
jar {
duplicatesStrategy = DuplicatesStrategy.EXCLUDE
}

View File

@@ -0,0 +1,17 @@
package io.github.eldek0;
import com.badlogic.gdx.Game;
import io.github.eldek0.game.MultiplayerScreen;
public class Main extends Game {
@Override
public void create() {
setScreen(new MultiplayerScreen());
}
@Override
public void dispose() {
super.dispose();
}
}

View File

@@ -0,0 +1,99 @@
package io.github.eldek0.game;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Input;
import com.badlogic.gdx.Screen;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.glutils.ShapeRenderer;
import io.github.eldek0.network.GameClient;
import io.github.eldek0.network.NetworkPackets;
public class MultiplayerScreen implements Screen {
private ShapeRenderer shapeRenderer;
private GameClient gameClient;
private float x = 100;
private float y = 100;
private float speed = 200f;
private float sendTimer = 0f;
@Override
public void show() {
shapeRenderer = new ShapeRenderer();
gameClient = new GameClient();
try {
gameClient.connect("127.0.0.1", "Jugador");
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void render(float delta) {
update(delta);
Gdx.gl.glClearColor(0.15f, 0.15f, 0.2f, 1f);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
shapeRenderer.begin(ShapeRenderer.ShapeType.Filled);
for (NetworkPackets.PlayerState player : gameClient.getPlayers().values()) {
shapeRenderer.rect(player.x, player.y, 32, 32);
}
shapeRenderer.end();
}
private void update(float delta) {
boolean moved = false;
if (Gdx.input.isKeyPressed(Input.Keys.W)) {
y += speed * delta;
moved = true;
}
if (Gdx.input.isKeyPressed(Input.Keys.S)) {
y -= speed * delta;
moved = true;
}
if (Gdx.input.isKeyPressed(Input.Keys.A)) {
x -= speed * delta;
moved = true;
}
if (Gdx.input.isKeyPressed(Input.Keys.D)) {
x += speed * delta;
moved = true;
}
sendTimer += delta;
if (moved && sendTimer >= 0.05f) {
gameClient.sendMyPosition(x, y);
sendTimer = 0f;
}
}
@Override
public void resize(int width, int height) {
}
@Override
public void pause() {
}
@Override
public void resume() {
}
@Override
public void hide() {
}
@Override
public void dispose() {
if (shapeRenderer != null) shapeRenderer.dispose();
if (gameClient != null) gameClient.stop();
}
}

View File

@@ -0,0 +1,95 @@
package io.github.eldek0.network;
import com.esotericsoftware.kryonet.Client;
import com.esotericsoftware.kryonet.Connection;
import com.esotericsoftware.kryonet.Listener;
import java.io.IOException;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
public class GameClient {
private final Client client;
private final Map<Integer, NetworkPackets.PlayerState> players = new ConcurrentHashMap<>();
private int myId = -1;
public GameClient() {
client = new Client();
Network.register(client);
client.addListener(new Listener() {
@Override
public void received(Connection connection, Object object) {
if (object instanceof NetworkPackets.PlayerConnected packet) {
NetworkPackets.PlayerState player = new NetworkPackets.PlayerState();
player.id = packet.id;
player.name = packet.name;
player.x = packet.x;
player.y = packet.y;
players.put(player.id, player);
if (packet.id == connection.getID()) {
myId = packet.id;
}
}
if (object instanceof NetworkPackets.PlayerDisconnected packet) {
players.remove(packet.id);
}
if (object instanceof NetworkPackets.PlayerMove packet) {
NetworkPackets.PlayerState player = players.get(packet.id);
if (player != null) {
player.x = packet.x;
player.y = packet.y;
}
}
if (object instanceof NetworkPackets.WorldState packet) {
players.clear();
for (NetworkPackets.PlayerState p : packet.players) {
players.put(p.id, p);
}
}
}
});
}
public void connect(String host, String name) throws IOException {
client.start();
client.connect(5000, host, Network.TCP_PORT, Network.UDP_PORT);
NetworkPackets.Login login = new NetworkPackets.Login();
login.name = name;
client.sendTCP(login);
}
public void sendMyPosition(float x, float y) {
if (!client.isConnected() || myId == -1) return;
NetworkPackets.PlayerMove move = new NetworkPackets.PlayerMove();
move.id = myId;
move.x = x;
move.y = y;
client.sendUDP(move);
}
public Map<Integer, NetworkPackets.PlayerState> getPlayers() {
return players;
}
public int getMyId() {
return myId;
}
public boolean isConnected() {
return client.isConnected();
}
public void stop() {
client.stop();
}
}