java - 基于图像添加地板或如何优化现有方法
问题描述
我正在为一个学校项目使用 Java 创建一个游戏。我目前有一个 Player 类,我正在创建他将在其中行走的地板。现在,我刚刚做了一个 Clamp 方法,我根据图像添加不同的部分,这样他就可以在“地板”上行走。最终,我有他需要能够跳上的平台,但如果他错过了就摔倒。该代码目前无法正常工作,我不知道该怎么做。有没有更简单或更有效的方法来做地板?如果没有,我怎样才能使平台工作?
我已经尝试在方法的末尾使用一个变量来测试它是否是一个平台。
package com.sewd.sophomorevisitation.objects;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import com.sewd.sophomorevisitation.Background;
import com.sewd.sophomorevisitation.KeyListener;
import com.sewd.sophomorevisitation.Main;
import com.sewd.sophomorevisitation.sprites.SpriteAnimation;
import com.sewd.sophomorevisitation.sprites.SpriteSheet;
public class Player extends GameObject {
Handler handler;
static int times = 0;
private static BufferedImage[] shreccRun = {SpriteSheet.getSprite(0, 0, 128, 106, 0, 0), SpriteSheet.getSprite(1, 0, 128, 106, 0, 0), SpriteSheet.getSprite(0, 0, 128, 106, 0, 0), SpriteSheet.getSprite(2, 0, 128, 106, 0, 0)};
private static BufferedImage[] shreccJump = {SpriteSheet.getSprite(3, 0, 128, 106, 0, 0), SpriteSheet.getSprite(4, 0, 128, 106, 0, 0)};
public static SpriteAnimation shreccRunAnimation = new SpriteAnimation(shreccRun, 5);
public static SpriteAnimation shreccJumpAnimation = new SpriteAnimation(shreccJump, 5);
public static SpriteAnimation animation = shreccRunAnimation;
public Player(int x, int y, ID id) {
super(x, y, id);
}
public void tick() {
y += velY;
if(x < 0) {
death();
}
if(Main.started) {
/*floor(1076, 1215, -500, Main.screenSize.width, 0, 972);
floor(1215, 1374, -500, Main.screenSize.width, 0, 969);
floor(1374, 1538, -500, Main.screenSize.width, 0, 936);
floor(1538, 1667, -500, Main.screenSize.width, 0, 925);
floor(1667, 3711, -500, Main.screenSize.width, 0, 919);*/
floor(0, 473, -500, Main.screenSize.width, 0, (Main.screenSize.height/ 4) * 3 - 40);
floor(473, 600, -500, Main.screenSize.width, 0, (Main.screenSize.height/ 4) * 3 - 70);
floor(600, 775, -500, Main.screenSize.width, 0, (Main.screenSize.height/ 4) * 3 - 90);
floor(775, 2900, -500, Main.screenSize.width, 0, (Main.screenSize.height/ 4) * 3 - 100);
floor(2900, 2980, -500, Main.screenSize.width, 0, (Main.screenSize.height/ 4) * 3 - 140);
floor(2980, 3060, -500, Main.screenSize.width, 0, (Main.screenSize.height/ 4) * 3 - 190);
floor(2980, 3060, -500, Main.screenSize.width, 0, 873);
floor(3060, 3073, -500, Main.screenSize.width, 0, 843);
floor(3073, 3827, -500, Main.screenSize.width, 0, 813);
floor(3827, 3857, -500, Main.screenSize.width, 0, 784);
floor(3827, 10000, -500, Main.screenSize.width, 0, 784);
}
if(animation != shreccJumpAnimation) {
animation.update();
}else {
if(times <= 5)animation.update();
times++;
}
}
public void death() {
System.out.println("Dead");
}
public static void floor(int start, int stop, int minX, int maxX, int minY, int maxY) {
if( start <= Background.x && Background.x < stop) Player.clamp(minX, maxX, minY, maxY);
}
public static void clamp(int minX, int maxX, int minY, int maxY) {
if(x <= minX) x = minX;
else if(x >= maxX) x = maxX;
else if(y <= minY) {
y = minY;
KeyListener.isInAir = true;
velY = -velY;
if(velY == 0) velY = 10;
}else if(y >= maxY) {
y = maxY;
KeyListener.isInAir = false;
if(times > 0) {
times = 0;
animation.stop();
animation.restart();
animation = shreccRunAnimation;
animation.start();
}
}else return;
}
public void render(Graphics g) {
g.drawImage(animation.getSprite(), x - shreccRun[0].getWidth() - 50, y, shreccRun[0].getWidth() * 2, shreccRun[0].getHeight() * 2, null);
}
}
地板需要在所有没有平台的地方都能正常工作。他只是走在上面。否则,如果他降落在一个平台上,他需要一直呆在平台上直到该平台结束,那么他就会跌倒。或者,如果他错过了一个平台,那么他就会摔倒。
解决方案
弄清楚了
public static boolean onFloor;
public void tick() {
if(Main.isStarted()) {
floor();
if(!onFloor) {
Player.setVelY(20);
}else {
Player.setVelY(0);
}
}
}
private void floor() {
clamp(0, 5000, 824, "f");
clamp(5000, 10000, 750, "p");
}
private void clamp(int start, int stop, int minY, String type) {
if(x > start && x < stop) {
if(Player.getY() != minY) {
if(Player.getY() > minY) {
if(type != "p") {
Player.setY(minY);
Player.setVelY(0);
onFloor = true;
return;
}
}
if(!Player.jumping) {
Player.setVelY(10);
onFloor = false;
}
}else if(Player.getY() == minY) {
Player.setY(minY);
Player.setVelY(0);
onFloor = true;
}else if(Player.getY() > minY) {
if(type != "p") {
Player.setY(minY);
Player.setVelY(0);
}
}
}
}
推荐阅读
- powershell - 如何将 -Verbose 的输出附加到 PowerShell 中的日志文件?
- wpf - DataGrid CellEditingTemplate 数据绑定最近不再工作
- nuget-package - 命名空间 azure 中不存在类型或命名空间 webjobs
- c - AVR - 高速中断驱动的 UART 代码不工作
- java - 将字符串转换为日期的问题
- postgresql - 删除未使用的索引
- c# - 桌面应用程序的推送通知
- .net - 如何解决 dotnet 测试中的 Microsoft.NET.Test.Sdk 引用?
- recaptcha - 在 Google Recaptcha 中监控统计数据
- hazelcast - hazelcast自定义mapstore实现的自定义java文件放在哪里