Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -69,14 +69,14 @@ java -jar filename-client.jar --server
- [X] создать ветку и настроить `build.gradle.kts`.
- Баги/проблемы (исправить)
- ? Из-за написанного кода под javafx, на клиенте могут возникать проблемы с логикой из-за другой системы координат в libgdx, например, при просчёте логики полёта пуль, необходимо домножать скорость на размер тайлов.
- [ ] коллизия/рендер пулек поломались и они могут заходить сквозь стены.
- [x] коллизия/рендер пулек поломались и они могут заходить сквозь стены.
- ? вероятно при нестандарных размерах экрана рендер ломается.
- [X] сервер не удаляет игрока, если он отключился.
- [ ] клиент рендерит других игроков как врагов.
- [X] ui не масштабируется как надо при изменении размера окна.
- [ ] при очень высоких значениях fps плавное движение камеры менее заметно.
- [ ] при fullscreen размер окна равен разрешению в настройках
- [ ] если на мобильном устройстве поменять разрешение в настройках то игра крашнет
- [x] (?) при fullscreen размер окна равен разрешению в настройках
- [x] если на мобильном устройстве поменять разрешение в настройках то игра крашнет
- solution: скрыть для мобильных устройств настройки разрешения.
- сделать в Main метод isMobile для проверки среды без и с учётом выбранного управления

Expand Down
12 changes: 10 additions & 2 deletions core/src/main/java/xyz/samiker/theendlessweave/Main.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,14 +16,15 @@ public class Main extends Game {
public SpriteBatch batch;
private ManifestAssetManager assetManager;
public static boolean isMobile;

public static boolean isMobControl;

@Override
public void create() {
batch = new SpriteBatch();
try {
assetManager = new ManifestAssetManager(ResourceManifest.load());
isMobile = (Gdx.app.getType() == Application.ApplicationType.Android || Gdx.app.getType() == Application.ApplicationType.iOS) || SettingsManager.getString(ClientSettings.CONTROL).contains("mobile");
isMobile = isMobile(false);
isMobControl = isMobile(true);
} catch (IOException e) {
throw new RuntimeException(e);
}
Expand Down Expand Up @@ -51,6 +52,7 @@ public ManifestAssetManager getAssetManager() {
}

public void applySettings() {
if (isMobile) return;
boolean isFullscreen = SettingsManager.getBoolean(ClientSettings.FULLSCREEN);
boolean isBorderless = SettingsManager.getBoolean(ClientSettings.BORDERLESS);

Expand All @@ -66,4 +68,10 @@ public void applySettings() {
}
}
}

public static boolean isMobile(boolean byControl) {
return byControl ?
SettingsManager.getString(ClientSettings.CONTROL).contains("mobile") :
(Gdx.app.getType() == Application.ApplicationType.Android || Gdx.app.getType() == Application.ApplicationType.iOS);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package xyz.samiker.theendlessweave.custom;

public class ClientConstants {
public static final float VIRTUAL_WIDTH = 1440;
public static final float VIRTUAL_HEIGHT = 720;
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
import com.badlogic.gdx.utils.viewport.Viewport;
import xyz.samiker.theendlessweave.Main;
import xyz.samiker.theendlessweave.assetsManager.ManifestAssetManager;
import xyz.samiker.theendlessweave.custom.ClientConstants;
import xyz.samiker.theendlessweave.custom.InputManager;
import xyz.samiker.theendlessweave.network.GameClient;
import xyz.samiker.theendlessweave.settings.ClientSettings;
Expand All @@ -33,7 +34,6 @@
import java.io.IOException;

public class GameScreen implements Screen {

private final Main mainApp;
private GameData data;

Expand Down Expand Up @@ -78,8 +78,9 @@ public GameScreen(Main mainApp) {
public void show() {
batch = new SpriteBatch();

float worldWidth = Gdx.graphics.getWidth();
float worldHeight = Gdx.graphics.getHeight();
float worldWidth = ClientConstants.VIRTUAL_WIDTH;
float worldHeight = ClientConstants.VIRTUAL_HEIGHT;

gameCamera = new OrthographicCamera();
gameViewport = new ExtendViewport(worldWidth, worldHeight, gameCamera);

Expand Down Expand Up @@ -131,7 +132,7 @@ private void setupUI() {
private void setupMobileControls() {
String controlMode = SettingsManager.getString(ClientSettings.CONTROL);
if ("auto".equals(controlMode)) {
controlMode = Main.isMobile ? "mobile_aim_joystick" : "pc";
controlMode = Main.isMobile(true) ? "mobile_aim_joystick" : "pc";
}

if ("pc".equals(controlMode)) return;
Expand Down Expand Up @@ -169,7 +170,7 @@ public void touchUp(InputEvent event, float x, float y, int pointer, int button)

private void updateUI() {
debugLabel.setPosition(10, Gdx.graphics.getHeight() / 2f);
if (Main.isMobile) {
if (Main.isMobControl) {
if (aimStick != null) aimStick.setBounds(Gdx.graphics.getWidth() - 250, 50, 200, 200);
if (attackBtn != null) attackBtn.setPosition(Gdx.graphics.getWidth() - 150, Gdx.graphics.getHeight() - 300);
}
Expand Down Expand Up @@ -257,7 +258,7 @@ private void initializeGameSession(PacketLoginResponse serverData) {
var map = gameLogic.getGameMap();
var profiler = gameLogic.getProfiler();
InputSystem inputSystem = new InputSystem(client, gameLogic, gameCamera);
inputSystem.setInputMode(Main.isMobile);
inputSystem.setInputMode(Main.isMobControl);

gameLogic.addLogicSystem(new ClientNetworkEventSystem(client, gameLogic));
gameLogic.addLogicSystem(inputSystem);
Expand Down Expand Up @@ -297,7 +298,7 @@ public void render(float delta) {
gameCamera.update();
batch.setProjectionMatrix(gameCamera.combined);

if (Main.isMobile) {
if (Main.isMobControl) {
double deadzone = 0.3;
if (moveStick != null) {
InputManager.handleAxis(moveStick.getKnobPercentX(), deadzone, Input.Keys.D, Input.Keys.A);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,16 @@
import com.badlogic.gdx.scenes.scene2d.utils.ChangeListener;
import com.badlogic.gdx.scenes.scene2d.utils.ClickListener;
import com.badlogic.gdx.utils.ScreenUtils;
import com.badlogic.gdx.utils.viewport.ScreenViewport;
import com.badlogic.gdx.utils.viewport.ExtendViewport;
import xyz.samiker.theendlessweave.Main;
import xyz.samiker.theendlessweave.GameData;
import xyz.samiker.theendlessweave.gamemap.MapGeneratorSettings;

import java.util.Random;

import static xyz.samiker.theendlessweave.custom.ClientConstants.VIRTUAL_HEIGHT;
import static xyz.samiker.theendlessweave.custom.ClientConstants.VIRTUAL_WIDTH;

public class GenerationScreen implements Screen {

private final Main game;
Expand Down Expand Up @@ -65,7 +68,7 @@ public GenerationScreen(Main game) {

@Override
public void show() {
stage = new Stage(new ScreenViewport());
stage = new Stage(new ExtendViewport(VIRTUAL_WIDTH, VIRTUAL_HEIGHT));
Gdx.input.setInputProcessor(stage);

skin = new Skin(Gdx.files.internal("ui/uiskin.json"));
Expand Down Expand Up @@ -165,7 +168,9 @@ public void changed(ChangeEvent event, Actor actor) {
details.defaults().left().pad(5);

widthField = createIntField("Width:", details);
widthField.setText("100");
heightField = createIntField("Height:", details);
heightField.setText("100");
details.row();

minRoomSizeField = createIntField("Min Room:", details);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,13 @@
import com.badlogic.gdx.scenes.scene2d.ui.TextButton;
import com.badlogic.gdx.scenes.scene2d.utils.ClickListener;
import com.badlogic.gdx.utils.ScreenUtils;
import com.badlogic.gdx.utils.viewport.ExtendViewport;
import com.badlogic.gdx.utils.viewport.ScreenViewport;
import xyz.samiker.theendlessweave.Main;

import static xyz.samiker.theendlessweave.custom.ClientConstants.VIRTUAL_HEIGHT;
import static xyz.samiker.theendlessweave.custom.ClientConstants.VIRTUAL_WIDTH;

public class MainMenuScreen implements Screen {
private final Main game;
private Stage stage;
Expand All @@ -23,7 +27,7 @@ public MainMenuScreen(Main game) {

@Override
public void show() {
stage = new Stage(new ScreenViewport());
stage = new Stage(new ExtendViewport(VIRTUAL_WIDTH, VIRTUAL_HEIGHT));
Gdx.input.setInputProcessor(stage);
skin = new Skin(Gdx.files.internal("ui/uiskin.json"));

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,15 @@
import com.badlogic.gdx.scenes.scene2d.utils.ChangeListener;
import com.badlogic.gdx.scenes.scene2d.utils.ClickListener;
import com.badlogic.gdx.utils.ScreenUtils;
import com.badlogic.gdx.utils.viewport.ExtendViewport;
import com.badlogic.gdx.utils.viewport.ScreenViewport;
import xyz.samiker.theendlessweave.Main;
import xyz.samiker.theendlessweave.settings.ClientSettings;
import xyz.samiker.theendlessweave.settings.SettingsManager;

import static xyz.samiker.theendlessweave.custom.ClientConstants.VIRTUAL_HEIGHT;
import static xyz.samiker.theendlessweave.custom.ClientConstants.VIRTUAL_WIDTH;

public class SettingsScreen implements Screen {

private final Main game;
Expand All @@ -32,7 +36,7 @@ public SettingsScreen(Main game) {

@Override
public void show() {
stage = new Stage(new ScreenViewport());
stage = new Stage(new ExtendViewport(VIRTUAL_WIDTH, VIRTUAL_HEIGHT));
Gdx.input.setInputProcessor(stage);

skin = new Skin(Gdx.files.internal("ui/uiskin.json"));
Expand All @@ -49,7 +53,7 @@ private void buildLayout() {
stage.addActor(root);

Label title = new Label("Settings", skin);
title.setFontScale(1.5f);
title.setFontScale(1.2f);
root.add(title).padBottom(20).colspan(2).row();

Table tabsTable = new Table();
Expand Down Expand Up @@ -151,45 +155,46 @@ private void showVideoSettings() {
table.pad(20);
table.defaults().left().pad(5);

table.add(new Label("Resolution:", skin));
SelectBox<String> resolutionSelect = new SelectBox<>(skin);
resolutionSelect.setItems("1920x1200", "1920x1080", "1600x900", "1366x768", "1280x720", "800x600");
resolutionSelect.setSelected(SettingsManager.getString(ClientSettings.RESOLUTION));
table.add(resolutionSelect).width(200).row();

boolean fscr = SettingsManager.getBoolean(ClientSettings.FULLSCREEN);
boolean brdr = SettingsManager.getBoolean(ClientSettings.BORDERLESS);
CheckBox fullscreenCheck = new CheckBox(" Fullscreen", skin);
fullscreenCheck.setChecked(fscr && !brdr);

CheckBox borderlessCheck = new CheckBox(" Borderless Window", skin);
borderlessCheck.setChecked(brdr && !fscr);

table.add(fullscreenCheck).colspan(2).row();
table.add(borderlessCheck).colspan(2).row();

CheckBox vsyncCheck = new CheckBox(" VSync", skin);
vsyncCheck.setChecked(SettingsManager.getBoolean(ClientSettings.VSYNC));
table.add(vsyncCheck).colspan(2).row();

CheckBox fpsLimitCheck = new CheckBox(" Limit FPS", skin);
fpsLimitCheck.setChecked(SettingsManager.getBoolean(ClientSettings.FPS_LIMIT_ENABLED));

TextField fpsField = new TextField(String.valueOf(SettingsManager.getInt(ClientSettings.FPS_LIMIT)), skin);
fpsField.setTextFieldFilter(new TextField.TextFieldFilter.DigitsOnlyFilter());
fpsField.setDisabled(!fpsLimitCheck.isChecked());

fpsLimitCheck.addListener(new ChangeListener() {
@Override
public void changed(ChangeEvent event, Actor actor) {
fpsField.setDisabled(!fpsLimitCheck.isChecked());
}
});
final SelectBox<String> resolutionSelect = !Main.isMobile ? new SelectBox<>(skin) : null;
final CheckBox fullscreenCheck = !Main.isMobile ? new CheckBox(" Fullscreen", skin) : null;
final CheckBox borderlessCheck = !Main.isMobile ? new CheckBox(" Borderless Window", skin) : null;
final CheckBox vsyncCheck = !Main.isMobile ? new CheckBox(" VSync", skin) : null;
final CheckBox fpsLimitCheck = !Main.isMobile ? new CheckBox(" Limit FPS", skin) : null;
final TextField fpsField = !Main.isMobile ? new TextField(String.valueOf(SettingsManager.getInt(ClientSettings.FPS_LIMIT)), skin) : null;

if (!Main.isMobile) {
table.add(new Label("Resolution:", skin));
resolutionSelect.setItems("1920x1200", "1920x1080", "1600x900", "1366x768", "1280x720", "800x600");
resolutionSelect.setSelected(SettingsManager.getString(ClientSettings.RESOLUTION));
table.add(resolutionSelect).width(200).row();

boolean fscr = SettingsManager.getBoolean(ClientSettings.FULLSCREEN);
boolean brdr = SettingsManager.getBoolean(ClientSettings.BORDERLESS);
fullscreenCheck.setChecked(fscr && !brdr);
borderlessCheck.setChecked(brdr && !fscr);

table.add(fullscreenCheck).colspan(2).row();
table.add(borderlessCheck).colspan(2).row();

vsyncCheck.setChecked(SettingsManager.getBoolean(ClientSettings.VSYNC));
table.add(vsyncCheck).colspan(2).row();

fpsLimitCheck.setChecked(SettingsManager.getBoolean(ClientSettings.FPS_LIMIT_ENABLED));
fpsField.setTextFieldFilter(new TextField.TextFieldFilter.DigitsOnlyFilter());
fpsField.setDisabled(!fpsLimitCheck.isChecked());

fpsLimitCheck.addListener(new ChangeListener() {
@Override
public void changed(ChangeEvent event, Actor actor) {
fpsField.setDisabled(!fpsLimitCheck.isChecked());
}
});

Table fpsTable = new Table();
fpsTable.add(fpsLimitCheck).padRight(10);
fpsTable.add(fpsField).width(60);
table.add(fpsTable).colspan(2).row();
Table fpsTable = new Table();
fpsTable.add(fpsLimitCheck).padRight(10);
fpsTable.add(fpsField).width(60);
table.add(fpsTable).colspan(2).row();
}

table.add(new Label("Brightness:", skin));
Slider brightnessSlider = new Slider(0, 100, 1, false, skin);
Expand All @@ -212,23 +217,26 @@ public void changed(ChangeEvent event, Actor actor) {
applyBtn.addListener(new ClickListener() {
@Override
public void clicked(InputEvent event, float x, float y) {
SettingsManager.set(ClientSettings.RESOLUTION, resolutionSelect.getSelected());
SettingsManager.set(ClientSettings.FULLSCREEN, fullscreenCheck.isChecked());
SettingsManager.set(ClientSettings.BORDERLESS, borderlessCheck.isChecked());
SettingsManager.set(ClientSettings.VSYNC, vsyncCheck.isChecked());
SettingsManager.set(ClientSettings.FPS_LIMIT_ENABLED, fpsLimitCheck.isChecked());
try {
SettingsManager.set(ClientSettings.FPS_LIMIT, Integer.parseInt(fpsField.getText()));
} catch (NumberFormatException ignored) {}
SettingsManager.set(ClientSettings.BRIGHTNESS, brightnessSlider.getValue());
SettingsManager.saveSettings();
if (!Main.isMobile) {
SettingsManager.set(ClientSettings.RESOLUTION, resolutionSelect.getSelected());
SettingsManager.set(ClientSettings.FULLSCREEN, fullscreenCheck.isChecked());
SettingsManager.set(ClientSettings.BORDERLESS, borderlessCheck.isChecked());
SettingsManager.set(ClientSettings.VSYNC, vsyncCheck.isChecked());
SettingsManager.set(ClientSettings.FPS_LIMIT_ENABLED, fpsLimitCheck.isChecked());
try {
SettingsManager.set(ClientSettings.FPS_LIMIT, Integer.parseInt(fpsField.getText()));
} catch (NumberFormatException ignored) {}

applyGraphicsSettings();
}

applyGraphicsSettings();
SettingsManager.set(ClientSettings.BRIGHTNESS, (double) brightnessSlider.getValue());
SettingsManager.saveSettings();
System.out.println("Video settings saved.");
}
});

table.add(applyBtn).padTop(20).colspan(2).center();

contentContainer.add(table).top();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,9 @@ public void update(Array<Entity> entities, double deltaTime) {
ProjectileComponent proj = entity.getComponent(ProjectileComponent.class);
if (proj != null && proj.timeAlive < proj.spawnDelay) continue;

if (!camera.frustum.boundsInFrustum((float)pos.x + 25, (float)pos.y + 25, 0, 50, 50, 0)) {
float size = ENTITY_SIZE;

if (!camera.frustum.boundsInFrustum((float)pos.x + size / 2f, (float)pos.y + size / 2f, 0, size / 2f, size / 2f, 0)) {
continue;
}

Expand Down
Loading
Loading