Merge branch 'test' of http://124.70.85.113:3000/wsj/Game into test
3
.idea/.gitignore
generated
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
# Default ignored files
|
||||
/shelf/
|
||||
/workspace.xml
|
||||
13
.idea/compiler.xml
generated
Normal file
@@ -0,0 +1,13 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="CompilerConfiguration">
|
||||
<annotationProcessing>
|
||||
<profile name="Maven default annotation processors profile" enabled="true">
|
||||
<sourceOutputDir name="target/generated-sources/annotations" />
|
||||
<sourceTestOutputDir name="target/generated-test-sources/test-annotations" />
|
||||
<outputRelativeToContentRoot value="true" />
|
||||
<module name="game" />
|
||||
</profile>
|
||||
</annotationProcessing>
|
||||
</component>
|
||||
</project>
|
||||
7
.idea/encodings.xml
generated
Normal file
@@ -0,0 +1,7 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="Encoding">
|
||||
<file url="file://$PROJECT_DIR$/src/main/java" charset="UTF-8" />
|
||||
<file url="file://$PROJECT_DIR$/src/main/resources" charset="UTF-8" />
|
||||
</component>
|
||||
</project>
|
||||
20
.idea/jarRepositories.xml
generated
Normal file
@@ -0,0 +1,20 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="RemoteRepositoriesConfiguration">
|
||||
<remote-repository>
|
||||
<option name="id" value="central" />
|
||||
<option name="name" value="Central Repository" />
|
||||
<option name="url" value="https://repo.maven.apache.org/maven2" />
|
||||
</remote-repository>
|
||||
<remote-repository>
|
||||
<option name="id" value="central" />
|
||||
<option name="name" value="Maven Central repository" />
|
||||
<option name="url" value="https://repo1.maven.org/maven2" />
|
||||
</remote-repository>
|
||||
<remote-repository>
|
||||
<option name="id" value="jboss.community" />
|
||||
<option name="name" value="JBoss Community repository" />
|
||||
<option name="url" value="https://repository.jboss.org/nexus/content/repositories/public/" />
|
||||
</remote-repository>
|
||||
</component>
|
||||
</project>
|
||||
12
.idea/misc.xml
generated
Normal file
@@ -0,0 +1,12 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ExternalStorageConfigurationManager" enabled="true" />
|
||||
<component name="MavenProjectsManager">
|
||||
<option name="originalFiles">
|
||||
<list>
|
||||
<option value="$PROJECT_DIR$/pom.xml" />
|
||||
</list>
|
||||
</option>
|
||||
</component>
|
||||
<component name="ProjectRootManager" version="2" languageLevel="JDK_21" default="true" project-jdk-name="11" project-jdk-type="JavaSDK" />
|
||||
</project>
|
||||
6
.idea/vcs.xml
generated
Normal file
@@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="VcsDirectoryMappings">
|
||||
<mapping directory="$PROJECT_DIR$" vcs="Git" />
|
||||
</component>
|
||||
</project>
|
||||
30
pom.xml
@@ -1,14 +1,14 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0">
|
||||
|
||||
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
|
||||
<groupId>uno.mloluyu</groupId>
|
||||
|
||||
|
||||
<artifactId>game</artifactId>
|
||||
|
||||
|
||||
<version>1.0-SNAPSHOT</version>
|
||||
|
||||
|
||||
<packaging>jar</packaging>
|
||||
|
||||
<properties>
|
||||
@@ -18,21 +18,21 @@
|
||||
<gdx.version>1.12.1</gdx.version>
|
||||
|
||||
</properties>
|
||||
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>com.badlogicgames.gdx</groupId>
|
||||
<artifactId>gdx</artifactId>
|
||||
<version>1.12.1</version> <!-- 替换为你的 LibGDX 版本 -->
|
||||
</dependency>
|
||||
|
||||
|
||||
<!-- FreeType 字体扩展 -->
|
||||
<dependency>
|
||||
<groupId>com.badlogicgames.gdx</groupId>
|
||||
<artifactId>gdx-freetype</artifactId>
|
||||
<version>1.12.1</version> <!-- 与 LibGDX 版本保持一致 -->
|
||||
</dependency>
|
||||
|
||||
|
||||
<!-- 桌面平台的 FreeType 原生库 -->
|
||||
<dependency>
|
||||
<groupId>com.badlogicgames.gdx</groupId>
|
||||
@@ -54,17 +54,17 @@
|
||||
<dependency>
|
||||
<groupId>com.badlogicgames.gdx</groupId>
|
||||
<artifactId>gdx</artifactId>
|
||||
<version>${gdx.version}</version>
|
||||
<version>1.12.1</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.badlogicgames.gdx</groupId>
|
||||
<artifactId>gdx-backend-lwjgl3</artifactId>
|
||||
<version>${gdx.version}</version>
|
||||
<version>1.12.1</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.badlogicgames.gdx</groupId>
|
||||
<artifactId>gdx-platform</artifactId>
|
||||
<version>${gdx.version}</version>
|
||||
<version>1.12.1</version>
|
||||
<classifier>natives-desktop</classifier>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
@@ -81,7 +81,7 @@
|
||||
<!-- 移除不必要的预览特性,除非确实需要 -->
|
||||
</configuration>
|
||||
</plugin>
|
||||
|
||||
|
||||
<plugin>
|
||||
<groupId>org.codehaus.mojo</groupId>
|
||||
<artifactId>exec-maven-plugin</artifactId>
|
||||
@@ -92,7 +92,7 @@
|
||||
<mainClass>uno.mloluyu.desktop.DesktopLauncher</mainClass>
|
||||
</configuration>
|
||||
</plugin>
|
||||
|
||||
|
||||
<!-- 添加运行时类路径配置,解决类找不到问题 -->
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
@@ -109,6 +109,6 @@
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
|
||||
|
||||
|
||||
|
||||
</project>
|
||||
|
||||
@@ -0,0 +1,82 @@
|
||||
package uno.mloluyu.characters;
|
||||
|
||||
import com.badlogic.gdx.graphics.g2d.*;
|
||||
import com.badlogic.gdx.math.Rectangle;
|
||||
import com.badlogic.gdx.utils.Array;
|
||||
import uno.mloluyu.util.SimpleFormatter;
|
||||
|
||||
import java.util.EnumMap;
|
||||
|
||||
public class FighterAnimationManager {
|
||||
private EnumMap<Action, Animation<TextureRegion>> animations = new EnumMap<>(Action.class);
|
||||
private EnumMap<Action, Float> frameDurations = new EnumMap<>(Action.class);
|
||||
private TextureAtlas atlas;
|
||||
private float scaleX = 1.0f;
|
||||
private float scaleY = 1.0f;
|
||||
|
||||
public FighterAnimationManager(TextureAtlas atlas) {
|
||||
this.atlas = atlas;
|
||||
for (Action action : Action.values()) {
|
||||
frameDurations.put(action, 0.1f);
|
||||
}
|
||||
}
|
||||
|
||||
public void loadAnimation(Action action, String prefix, int count, boolean loop) {
|
||||
Array<TextureRegion> frames = new Array<>();
|
||||
for (int i = 0; i < count; i++) {
|
||||
String regionName = prefix + SimpleFormatter.addLeadingZeros(i, 3);
|
||||
TextureRegion region = atlas.findRegion(regionName);
|
||||
if (region == null) {
|
||||
throw new IllegalArgumentException("未找到区域: " + regionName);
|
||||
}
|
||||
frames.add(region);
|
||||
}
|
||||
|
||||
Animation<TextureRegion> animation = new Animation<>(frameDurations.get(action), frames);
|
||||
animation.setPlayMode(loop ? Animation.PlayMode.LOOP : Animation.PlayMode.NORMAL);
|
||||
animations.put(action, animation);
|
||||
}
|
||||
|
||||
public void loadLooping(Action action, String prefix, int count) {
|
||||
loadAnimation(action, prefix, count, true);
|
||||
}
|
||||
|
||||
public void loadOneShot(Action action, String prefix, int count) {
|
||||
loadAnimation(action, prefix, count, false);
|
||||
}
|
||||
|
||||
public void setFrameDuration(Action action, float duration) {
|
||||
frameDurations.put(action, duration);
|
||||
Animation<TextureRegion> anim = animations.get(action);
|
||||
if (anim != null) anim.setFrameDuration(duration);
|
||||
}
|
||||
|
||||
public boolean isFinished(Action action, float stateTime) {
|
||||
Animation<TextureRegion> anim = animations.get(action);
|
||||
return anim != null && anim.isAnimationFinished(stateTime);
|
||||
}
|
||||
|
||||
public void render(SpriteBatch batch, Action action, float stateTime, Rectangle hitbox, boolean isFacingRight) {
|
||||
Animation<TextureRegion> anim = animations.get(action);
|
||||
if (anim == null) return;
|
||||
|
||||
TextureRegion frame = anim.getKeyFrame(stateTime, anim.getPlayMode() == Animation.PlayMode.LOOP);
|
||||
if (frame == null) return;
|
||||
|
||||
float frameWidth = frame.getRegionWidth() * scaleX;
|
||||
float frameHeight = frame.getRegionHeight() * scaleY;
|
||||
float drawX = hitbox.x + (hitbox.width - frameWidth) / 2;
|
||||
float drawY = hitbox.y;
|
||||
|
||||
boolean wasFlippedX = frame.isFlipX();
|
||||
frame.flip(!isFacingRight && !wasFlippedX, false);
|
||||
frame.flip(isFacingRight && wasFlippedX, false);
|
||||
|
||||
batch.draw(frame, drawX, drawY, frameWidth / 2, frameHeight / 2, frameWidth, frameHeight, 1f, 1f, 0f);
|
||||
frame.flip(wasFlippedX != frame.isFlipX(), false);
|
||||
}
|
||||
|
||||
public void dispose() {
|
||||
if (atlas != null) atlas.dispose();
|
||||
}
|
||||
}
|
||||
@@ -2,33 +2,52 @@ package uno.mloluyu.desktop;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
import com.badlogic.gdx.Input;
|
||||
import com.badlogic.gdx.InputProcessor;
|
||||
import com.badlogic.gdx.graphics.Texture;
|
||||
import uno.mloluyu.characters.AdvancedFighter;
|
||||
import uno.mloluyu.network.NetworkManager;
|
||||
|
||||
import com.badlogic.gdx.Gdx;
|
||||
import com.badlogic.gdx.ScreenAdapter;
|
||||
import com.badlogic.gdx.graphics.Color;
|
||||
import com.badlogic.gdx.graphics.GL20;
|
||||
import com.badlogic.gdx.graphics.g2d.BitmapFont;
|
||||
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
|
||||
import com.badlogic.gdx.graphics.glutils.ShapeRenderer;
|
||||
|
||||
import uno.mloluyu.characters.AdvancedFighter;
|
||||
import uno.mloluyu.characters.SimpleFighter;
|
||||
import uno.mloluyu.network.NetworkManager;
|
||||
import uno.mloluyu.util.ClearScreen;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
import static uno.mloluyu.util.Font.loadChineseFont;
|
||||
|
||||
public class CharacterSelectScreen extends ScreenAdapter {
|
||||
public class CharacterSelectScreen extends ScreenAdapter implements InputProcessor {
|
||||
private boolean multiplayerMode = false; // 默认为单人模式
|
||||
|
||||
private final MainGame game;
|
||||
private SpriteBatch batch;
|
||||
private BitmapFont font;
|
||||
private ShapeRenderer shapeRenderer;
|
||||
private SimpleFighter selectedFighter1;
|
||||
private SimpleFighter selectedFighter2;
|
||||
|
||||
private final List<Texture> bgs = Arrays.asList(
|
||||
new Texture(Gdx.files.internal("src/main/resources/selectpage/10b_back_blue2p.png")),
|
||||
//new Texture(Gdx.files.internal("src/main/resources/selectpage/back_door.png")),
|
||||
new Texture(Gdx.files.internal("src/main/resources/selectpage/11b_back_red1p.png"))
|
||||
);
|
||||
private final List<Texture> charsTexts = Arrays.asList(
|
||||
new Texture(Gdx.files.internal("src/main/resources/selectpage/character_03.png")),
|
||||
new Texture(Gdx.files.internal("src/main/resources/selectpage/character_00.png"))
|
||||
);
|
||||
private final List<String> characters = Arrays.asList("Alice", "Reimu", "暂定");
|
||||
private int selectedIndex = -1;
|
||||
private Texture profile1p = charsTexts.get(0);
|
||||
private Texture profile2p = charsTexts.get(1);
|
||||
private Texture selectText;
|
||||
|
||||
private static int selectedIndex = 0;
|
||||
private static boolean is1P = true;
|
||||
|
||||
private static final int BUTTON_WIDTH = 300;
|
||||
private static final int BUTTON_HEIGHT = 80;
|
||||
@@ -38,6 +57,7 @@ public class CharacterSelectScreen extends ScreenAdapter {
|
||||
|
||||
public CharacterSelectScreen(MainGame game) {
|
||||
this.game = game;
|
||||
Gdx.input.setInputProcessor(this);
|
||||
}
|
||||
|
||||
public void setMultiplayerMode(boolean multiplayerMode) {
|
||||
@@ -59,10 +79,9 @@ public class CharacterSelectScreen extends ScreenAdapter {
|
||||
|
||||
int mouseX = Gdx.input.getX();
|
||||
int mouseY = Gdx.graphics.getHeight() - Gdx.input.getY();
|
||||
|
||||
renderCharacters(mouseX, mouseY);
|
||||
renderButtons(mouseX, mouseY);
|
||||
renderTexts();
|
||||
renderBackground();
|
||||
renderCharacters(multiplayerMode);
|
||||
// renderTexts();
|
||||
|
||||
handleInput(mouseX, mouseY);
|
||||
if (multiplayerMode) {
|
||||
@@ -78,121 +97,133 @@ public class CharacterSelectScreen extends ScreenAdapter {
|
||||
}
|
||||
}
|
||||
|
||||
private void renderCharacters(int mouseX, int mouseY) {
|
||||
shapeRenderer.begin(ShapeRenderer.ShapeType.Filled);
|
||||
for (int i = 0; i < characters.size(); i++) {
|
||||
int x = 200;
|
||||
int y = 500 - i * 120;
|
||||
boolean hovered = isHovered(mouseX, mouseY, x, y, BUTTON_WIDTH, BUTTON_HEIGHT);
|
||||
shapeRenderer.setColor(selectedIndex == i ? Color.GREEN : (hovered ? Color.LIGHT_GRAY : Color.DARK_GRAY));
|
||||
shapeRenderer.rect(x, y, BUTTON_WIDTH, BUTTON_HEIGHT);
|
||||
}
|
||||
shapeRenderer.end();
|
||||
}
|
||||
|
||||
private void renderButtons(int mouseX, int mouseY) {
|
||||
shapeRenderer.begin(ShapeRenderer.ShapeType.Filled);
|
||||
drawButton(CONFIRM_Y, mouseX, mouseY, "确认");
|
||||
drawButton(BACK_Y, mouseX, mouseY, "返回");
|
||||
shapeRenderer.end();
|
||||
}
|
||||
|
||||
private void renderTexts() {
|
||||
private void renderBackground() {
|
||||
batch.begin();
|
||||
font.draw(batch, "选择你的角色", 200, 650);
|
||||
for (int i = 0; i < characters.size(); i++) {
|
||||
int x = 200 + 30;
|
||||
int y = 500 - i * 120 + 50;
|
||||
font.draw(batch, characters.get(i), x, y);
|
||||
|
||||
for (int i = 0; i < bgs.size(); i ++) {
|
||||
batch.draw(bgs.get(i), 0, 528 * i, 1920, 528);
|
||||
}
|
||||
if (selectedIndex != -1) {
|
||||
font.draw(batch, "已选择: " + characters.get(selectedIndex), 200, 100);
|
||||
}
|
||||
drawButtonText(CONFIRM_Y, "确认");
|
||||
drawButtonText(BACK_Y, "返回");
|
||||
batch.end();
|
||||
}
|
||||
|
||||
private void drawButton(int y, int mouseX, int mouseY, String label) {
|
||||
boolean hovered = isHovered(mouseX, mouseY, BUTTON_X, y, BUTTON_WIDTH, BUTTON_HEIGHT);
|
||||
shapeRenderer.setColor(hovered ? Color.LIGHT_GRAY : Color.DARK_GRAY);
|
||||
shapeRenderer.rect(BUTTON_X, y, BUTTON_WIDTH, BUTTON_HEIGHT);
|
||||
}
|
||||
|
||||
private void drawButtonText(int y, String text) {
|
||||
float textX = BUTTON_X + BUTTON_WIDTH / 2f - font.getScaleX() * text.length() * 10;
|
||||
float textY = y + BUTTON_HEIGHT / 2f + 20;
|
||||
font.draw(batch, text, textX, textY);
|
||||
}
|
||||
|
||||
private boolean isHovered(int x, int y, int bx, int by, int bw, int bh) {
|
||||
return x >= bx && x <= bx + bw && y >= by && y <= by + bh;
|
||||
private void renderCharacters(boolean multiplayerMode) {
|
||||
batch.begin();
|
||||
batch.draw(profile1p, 0, 0, profile1p.getWidth()*3, profile1p.getHeight()*3);
|
||||
batch.draw(profile2p, 0, 528, profile2p.getWidth()*3, profile2p.getHeight()*3);
|
||||
batch.end();
|
||||
}
|
||||
//
|
||||
// private void renderTexts() {
|
||||
// batch.begin();
|
||||
// font.draw(batch, "选择你的角色", 200, 650);
|
||||
// for (int i = 0; i < characters.size(); i++) {
|
||||
// int x = 200 + 30;
|
||||
// int y = 500 - i * 120 + 50;
|
||||
// font.draw(batch, characters.get(i), x, y);
|
||||
//
|
||||
// }
|
||||
// if (selectedIndex != -1) {
|
||||
// font.draw(batch, "已选择: " + characters.get(selectedIndex), 200, 100);
|
||||
// }
|
||||
// drawButtonText(CONFIRM_Y, "确认");
|
||||
// drawButtonText(BACK_Y, "返回");
|
||||
// batch.end();
|
||||
// }
|
||||
//
|
||||
|
||||
private void handleInput(int mouseX, int mouseY) {
|
||||
if (Gdx.input.justTouched()) {
|
||||
// 检查是否点击了角色按钮
|
||||
for (int i = 0; i < characters.size(); i++) {
|
||||
int x = 200;
|
||||
int y = 500 - i * 120;
|
||||
if (isHovered(mouseX, mouseY, x, y, BUTTON_WIDTH, BUTTON_HEIGHT)) {
|
||||
selectedIndex = i;
|
||||
Gdx.app.log("Character", "选择了角色: " + characters.get(i));
|
||||
return; // 防止同时触发其他按钮
|
||||
if (selectedFighter1 != null && selectedFighter2 != null) {
|
||||
if (multiplayerMode) {
|
||||
// 设置唯一玩家 ID 并发送角色选择
|
||||
if (NetworkManager.getInstance().getLocalPlayerId() == null) {
|
||||
String playerId = UUID.randomUUID().toString();
|
||||
NetworkManager.getInstance().setLocalPlayerId(playerId);
|
||||
Gdx.app.log("Network", "设置玩家ID: " + playerId);
|
||||
}
|
||||
NetworkManager.getInstance().sendCharacterSelection(selectedFighter1.getName());
|
||||
}
|
||||
|
||||
// 点击确认按钮
|
||||
if (isHovered(mouseX, mouseY, BUTTON_X, CONFIRM_Y, BUTTON_WIDTH, BUTTON_HEIGHT)) {
|
||||
if (selectedIndex != -1) {
|
||||
String selectedCharacter = characters.get(selectedIndex);
|
||||
Gdx.app.log("Character", "确认角色: " + selectedCharacter);
|
||||
|
||||
SimpleFighter fighter = null;
|
||||
switch (selectedCharacter) {
|
||||
case "Alice":
|
||||
case "Reimu":
|
||||
fighter = new AdvancedFighter(selectedCharacter);
|
||||
break;
|
||||
default:
|
||||
fighter = new SimpleFighter(selectedCharacter);
|
||||
}
|
||||
|
||||
if (fighter != null) {
|
||||
if (multiplayerMode) {
|
||||
NetworkManager nm = NetworkManager.getInstance();
|
||||
// 主机或客户端的 localPlayerId 应该已经在 NetworkSettingsScreen 设置,这里兜底
|
||||
if (nm.getLocalPlayerId() == null) {
|
||||
String playerId = UUID.randomUUID().toString();
|
||||
nm.setLocalPlayerId(playerId);
|
||||
Gdx.app.log("Network", "兜底设置玩家ID: " + playerId);
|
||||
}
|
||||
if (nm.isConnected()) {
|
||||
nm.sendCharacterSelection(selectedCharacter);
|
||||
// 发送初始位置(角色生成初始 hitbox 坐标)
|
||||
nm.sendPosition(fighter.getHitbox().x, fighter.getHitbox().y);
|
||||
} else {
|
||||
Gdx.app.log("Network", "未连接网络,无法发送角色选择");
|
||||
}
|
||||
}
|
||||
game.setScreen(new GameScreen(game, fighter));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 点击返回按钮
|
||||
if (isHovered(mouseX, mouseY, BUTTON_X, BACK_Y, BUTTON_WIDTH, BUTTON_HEIGHT)) {
|
||||
Gdx.app.log("Character", "返回主菜单");
|
||||
game.setScreen(new MainMenuScreen(game));
|
||||
}
|
||||
game.setScreen(new GameScreen(game, selectedFighter1));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void dispose() {
|
||||
batch.dispose();
|
||||
font.dispose();
|
||||
shapeRenderer.dispose();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean keyDown(int i) {
|
||||
boolean value = false;
|
||||
if (!multiplayerMode) {
|
||||
if (i == Input.Keys.LEFT || i == Input.Keys.RIGHT) {
|
||||
selectText = charsTexts.get(selectedIndex);
|
||||
selectedIndex = (selectedIndex + 1) % charsTexts.size();
|
||||
if (is1P) {
|
||||
profile1p = selectText;
|
||||
} else {
|
||||
profile2p = selectText;
|
||||
}
|
||||
}
|
||||
value = true;
|
||||
} else {
|
||||
//占坑说是
|
||||
}
|
||||
if (i == Input.Keys.Z) {
|
||||
if (is1P) {
|
||||
selectedFighter1 = new AdvancedFighter(characters.get(selectedIndex));
|
||||
} else {
|
||||
selectedFighter2 = new AdvancedFighter(characters.get(selectedIndex));
|
||||
}
|
||||
is1P = false;
|
||||
selectedIndex = 1;
|
||||
value = true;
|
||||
}
|
||||
if (i == Input.Keys.ESCAPE) {
|
||||
Gdx.app.log("Character", "返回主菜单");
|
||||
game.setScreen(new MainMenuScreen(game));
|
||||
}
|
||||
return value;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean keyUp(int i) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean keyTyped(char c) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean touchDown(int i, int i1, int i2, int i3) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean touchUp(int i, int i1, int i2, int i3) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean touchCancelled(int i, int i1, int i2, int i3) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean touchDragged(int i, int i1, int i2) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean mouseMoved(int i, int i1) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean scrolled(float v, float v1) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,6 +4,7 @@ import com.badlogic.gdx.Gdx;
|
||||
import com.badlogic.gdx.ScreenAdapter;
|
||||
import com.badlogic.gdx.graphics.Color;
|
||||
import com.badlogic.gdx.graphics.GL20;
|
||||
import com.badlogic.gdx.graphics.Texture;
|
||||
import com.badlogic.gdx.graphics.glutils.ShapeRenderer;
|
||||
import com.badlogic.gdx.graphics.g2d.BitmapFont;
|
||||
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
|
||||
@@ -18,17 +19,20 @@ public class MainMenuScreen extends ScreenAdapter {
|
||||
private SpriteBatch batch;
|
||||
private BitmapFont font;
|
||||
private ShapeRenderer shapeRenderer;
|
||||
private Texture texture;
|
||||
|
||||
// 按钮区域
|
||||
private final int buttonWidth = 400;
|
||||
private final int buttonWidth = 600;
|
||||
private final int buttonHeight = 80;
|
||||
private final int buttonX = 760;
|
||||
private final int startY = 600;
|
||||
private final int settingsY = 480;
|
||||
private final int networkY = 360;
|
||||
private final int escY = 240;
|
||||
|
||||
public MainMenuScreen(MainGame game) {
|
||||
this.game = game;
|
||||
texture = new Texture(Gdx.files.internal("src\\main\\resources\\bg.png"));
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -42,7 +46,7 @@ public class MainMenuScreen extends ScreenAdapter {
|
||||
|
||||
@Override
|
||||
public void render(float delta) {
|
||||
Gdx.gl.glClearColor(0.75F, 1, 0.98F, 1);
|
||||
Gdx.gl.glClearColor(0,0,0,0);
|
||||
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
|
||||
|
||||
int mouseX = Gdx.input.getX();
|
||||
@@ -53,13 +57,16 @@ public class MainMenuScreen extends ScreenAdapter {
|
||||
drawButtonBox(startY, "开始游戏", mouseX, mouseY);
|
||||
drawButtonBox(settingsY, "设置", mouseX, mouseY);
|
||||
drawButtonBox(networkY, "联网设置", mouseX, mouseY);
|
||||
drawButtonBox(escY, "退出游戏", mouseX, mouseY);
|
||||
shapeRenderer.end();
|
||||
|
||||
// 绘制按钮文字
|
||||
batch.begin();
|
||||
batch.draw(texture, 0, 0, 1920, 1080);
|
||||
drawButtonText(startY, "开始游戏");
|
||||
drawButtonText(settingsY, "设置");
|
||||
drawButtonText(networkY, "联网设置");
|
||||
drawButtonText(escY, "退出游戏");
|
||||
batch.end();
|
||||
|
||||
// 点击事件
|
||||
@@ -72,6 +79,8 @@ public class MainMenuScreen extends ScreenAdapter {
|
||||
} else if (isTouched(mouseX, mouseY, buttonX, networkY)) {
|
||||
Gdx.app.log("Button", "联网设置按钮被点击!");
|
||||
game.setScreen(new NetworkSettingsScreen(game));
|
||||
} else if (isTouched(mouseX, mouseY, buttonX, escY)) {
|
||||
Gdx.app.exit();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -41,7 +41,7 @@ public class StartScreen implements Screen {
|
||||
}
|
||||
}
|
||||
|
||||
Gdx.gl.glClearColor(0.75F, 1, 0.98F, 1);
|
||||
Gdx.gl.glClearColor(1, 1, 1, 1);
|
||||
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
|
||||
|
||||
batch.begin();
|
||||
|
||||
@@ -4,9 +4,13 @@ import com.badlogic.gdx.InputAdapter;
|
||||
import com.badlogic.gdx.utils.Array;
|
||||
import uno.mloluyu.characters.SimpleFighter;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
public class FighterController extends InputAdapter {
|
||||
private final SimpleFighter fighter;
|
||||
private final Array<Integer> pressedKeys = new Array<>();
|
||||
private final Map<Integer, Float> keyPressDuration = new HashMap<>();
|
||||
|
||||
public FighterController(SimpleFighter fighter) {
|
||||
this.fighter = fighter;
|
||||
@@ -19,34 +23,44 @@ public class FighterController extends InputAdapter {
|
||||
public void update(float deltaTime) {
|
||||
if (fighter == null)
|
||||
return;
|
||||
|
||||
for (int keycode : pressedKeys) {
|
||||
fighter.handleInput(keycode, true); // 持续按下的键,每帧触发
|
||||
float currentDuration = keyPressDuration.getOrDefault(keycode, 0f);
|
||||
currentDuration += deltaTime;
|
||||
keyPressDuration.put(keycode, currentDuration);
|
||||
fighter.handleInput(keycode, true, currentDuration); // 持续按下的键,传递持续时间
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean keyDown(int keycode) {
|
||||
// System.out.println("按键按下: " + keycode);
|
||||
if (fighter == null)
|
||||
return false;
|
||||
|
||||
if (!pressedKeys.contains(keycode, false)) {
|
||||
pressedKeys.add(keycode);
|
||||
keyPressDuration.put(keycode, 0f); // 初始化按键持续时间
|
||||
}
|
||||
|
||||
fighter.handleInput(keycode, true); // 按下事件
|
||||
fighter.handleInput(keycode, true, 0f); // 按下事件,初始持续时间为 0
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean keyUp(int keycode) {
|
||||
// System.out.println("按键松开: " + keycode);
|
||||
|
||||
if (fighter == null)
|
||||
return false;
|
||||
|
||||
float duration = keyPressDuration.getOrDefault(keycode, 0f);
|
||||
pressedKeys.removeValue(keycode, false);
|
||||
keyPressDuration.remove(keycode);
|
||||
|
||||
fighter.handleInput(keycode, false); // 按键松开事件
|
||||
fighter.handleInput(keycode, false, duration); // 按键松开事件,传递持续时间
|
||||
return true;
|
||||
}
|
||||
}// 松开事件
|
||||
|
||||
public SimpleFighter getFighter() {
|
||||
return fighter;
|
||||
|
||||
BIN
src/main/resources/bg.png
Normal file
|
After Width: | Height: | Size: 1.3 MiB |
|
Before Width: | Height: | Size: 19 KiB After Width: | Height: | Size: 29 KiB |
BIN
src/main/resources/selectpage/10b_back_blue2p.png
Normal file
|
After Width: | Height: | Size: 440 KiB |
BIN
src/main/resources/selectpage/11b_back_red1p.png
Normal file
|
After Width: | Height: | Size: 440 KiB |
BIN
src/main/resources/selectpage/back_door.png
Normal file
|
After Width: | Height: | Size: 320 KiB |
BIN
src/main/resources/selectpage/character_00.png
Normal file
|
After Width: | Height: | Size: 576 KiB |
BIN
src/main/resources/selectpage/character_03.png
Normal file
|
After Width: | Height: | Size: 384 KiB |
|
Before Width: | Height: | Size: 2.3 MiB |
|
Before Width: | Height: | Size: 3.0 MiB |
|
Before Width: | Height: | Size: 1.1 MiB |
@@ -1,24 +0,0 @@
|
||||
uiskin.png
|
||||
format: RGBA8888
|
||||
filter: Nearest,Nearest
|
||||
repeat: none
|
||||
button-up
|
||||
rotate: false
|
||||
xy: 0, 0
|
||||
size: 200, 60
|
||||
split: 10, 10, 10, 10
|
||||
orig: 200, 60
|
||||
offset: 0, 0
|
||||
button-down
|
||||
rotate: false
|
||||
xy: 0, 60
|
||||
size: 200, 60
|
||||
split: 10, 10, 10, 10
|
||||
orig: 200, 60
|
||||
offset: 0, 0
|
||||
white
|
||||
rotate: false
|
||||
xy: 0, 120
|
||||
size: 1, 1
|
||||
orig: 1, 1
|
||||
offset: 0, 0
|
||||