首页 > 解决方案 > 基于图像添加地板或如何优化现有方法

问题描述

我正在为一个学校项目使用 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);
    }


}

地板需要在所有没有平台的地方都能正常工作。他只是走在上面。否则,如果他降落在一个平台上,他需要一直呆在平台上直到该平台结束,那么他就会跌倒。或者,如果他错过了一个平台,那么他就会摔倒。

标签: java

解决方案


弄清楚了

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

推荐阅读