Как заставить моего персонажа прыгать на одинаковой высоте, если он находится на земле или платформе? (JSFML)

это мой код:

      public class Jsfml_salto_pltfrm {
public static RenderWindow rw;
public static Texture txtr_bgrnd;
public static Texture txtr_grnd;
public static Texture txtr_muro;
public static Texture txtr_plyr;
public static Sprite sprt_bgrnd;
public static Sprite sprt_grnd;
public static Sprite[] sprt_muros;
public static Sprite sprt_muro;
public static Sprite sprt_plyr;
public static boolean is_r,is_l,is_u,is_d,is_spc,is_grnd,is_pltfrm;
public static Vector2f mpos;
public static float velx=0.0f,vely=0.0f;
public static float jumpheight = -300.0f, gravity=-400.0f;
public static float piy;
public static float mposx;
public static float mposy;  
public static boolean canJump;

public static void main(String[] args) throws ContextActivationException, IOException {
    rw = new RenderWindow(new VideoMode(700,500),"platform game 1");
rw.setActive(true);
boolean estado=rw.isOpen();
rw.setKeyRepeatEnabled(false);
    rw.setVerticalSyncEnabled(true);
    
    txtr_bgrnd = new Texture();
    Path pth1 = Paths.get("C:\\alternativo\\background.jpg");
    txtr_bgrnd.loadFromFile(pth1);
    sprt_bgrnd = new Sprite(txtr_bgrnd);
    sprt_bgrnd.setPosition(0.0f,0.0f);
    
    txtr_grnd = new Texture();
    Path pth2 = Paths.get("C:\\alternativo\\ground01.jpg");
    txtr_grnd.loadFromFile(pth2);
    sprt_grnd = new Sprite(txtr_grnd, new IntRect(0, 0, 700, 100));
    sprt_grnd.setPosition(200.0f,400.0f);
    
    txtr_muro = new Texture();
    Path pth3 = Paths.get("C:\\alternativo\\pltfrm_0_rect_slm.png");
    txtr_muro.loadFromFile(pth3);
    sprt_muro = new Sprite(txtr_muro, new IntRect(0, 0, 122, 30));
    sprt_muro.setPosition(300.0f,300.0f);
    
    txtr_plyr = new Texture();
    Path pth4 = Paths.get("C:\\alternativo\\Sprite-0002.png");
    txtr_plyr.loadFromFile(pth4);
    sprt_plyr = new Sprite(txtr_plyr, new IntRect(0, 0, 50, 50));
    sprt_plyr.setPosition(190.0f,400.0f-sprt_plyr.getTextureRect().height);
    piy=400.0f-sprt_plyr.getTextureRect().height;
    
    Clock clck = new Clock();
    Time timeSinceLastUpdate = Time.ZERO;
    Time timePerFrame = Time.getSeconds(1.0f/60.0f);
    
while(estado==true)
{
        timeSinceLastUpdate = Time.add(timeSinceLastUpdate, clck.restart());
        while(timeSinceLastUpdate.asMicroseconds()>timePerFrame.asMicroseconds())
        {
            timeSinceLastUpdate = Time.sub(timeSinceLastUpdate, timePerFrame);
            update(timePerFrame);
        }
        for(Event evt : rw.pollEvents()) {
            switch(evt.type) {
                case CLOSED:
                    rw.close();
                    System.exit(0);
                    break;
                case KEY_PRESSED:
                    if(org.jsfml.window.Keyboard.isKeyPressed(Keyboard.Key.ESCAPE))
                        System.exit(0);
                    if(org.jsfml.window.Keyboard.isKeyPressed(Keyboard.Key.RIGHT))
                        is_r=true;
                    if(org.jsfml.window.Keyboard.isKeyPressed(Keyboard.Key.LEFT))
                        is_l=true;
                    if(org.jsfml.window.Keyboard.isKeyPressed(Keyboard.Key.UP))
                        is_u=true;
                    if(org.jsfml.window.Keyboard.isKeyPressed(Keyboard.Key.DOWN))
                        is_d=true;
                    if(org.jsfml.window.Keyboard.isKeyPressed(Keyboard.Key.SPACE)){
                        is_spc=true;
                        vely=jumpheight;
                    }
                    break;
                case KEY_RELEASED:
                    org.jsfml.window.event.KeyEvent kev = evt.asKeyEvent();
                    
                    if(kev.key.toString()=="RIGHT"){
                        is_r=false;
                        mposx=0.0f;
                    }
                    if(kev.key.toString()=="LEFT"){
                        is_l=false;
                        mposx=0.0f;
                    }
                    if(kev.key.toString()=="UP"){
                        is_u=false;
                        mposy=0.0f;
                    }
                    if(kev.key.toString()=="DOWN"){
                        is_d=false;
                        mposy=0.0f;
                    }
                    if(kev.key.toString()=="SPACE"){
                        is_spc=false;
                    }
                    break;
            }
        }
        render();
    }
}

public static void update(Time deltaTime)
{
    if(is_r)
    {
        mposx+=2.0f*deltaTime.asSeconds();
    }
    if(is_l)
    {
        mposx-=2.0f*deltaTime.asSeconds();
    }
    if(is_u)
    {
        mposy-=1.0f*deltaTime.asSeconds();
    }
    if(is_d)
    {
        mposy+=1.0f*deltaTime.asSeconds();
    }
    ManageJump(deltaTime);
        
    sprt_plyr.setPosition(sprt_plyr.getPosition().x+mposx,sprt_plyr.getPosition().y+mposy);
}

public static void render()
{
    rw.clear(Color.WHITE);
    rw.draw(sprt_bgrnd);
    rw.draw(sprt_grnd);
    rw.draw(sprt_muro);
    rw.draw(sprt_plyr);
    rw.display();
}

public static boolean grounded()
{
    if(sprt_plyr.getPosition().y+sprt_plyr.getTextureRect().height>=sprt_grnd.getPosition().y && sprt_plyr.getPosition().x+sprt_plyr.getTextureRect().width>=sprt_grnd.getPosition().x)
{
        sprt_plyr.setPosition(sprt_plyr.getPosition().x,piy);
        mposy=0.0f;
        is_grnd=true;
}
else
{
        is_grnd=false;
}
return is_grnd;
}
    
public static boolean pltfrmd()
{
    if((sprt_plyr.getPosition().y+sprt_plyr.getTextureRect().height>sprt_muro.getPosition().y)&&(sprt_plyr.getPosition().x+sprt_plyr.getTextureRect().width>sprt_muro.getPosition().x && sprt_plyr.getPosition().x<sprt_muro.getPosition().x+sprt_muro.getTextureRect().width))
{
        sprt_plyr.setPosition(sprt_plyr.getPosition().x,sprt_muro.getPosition().y-sprt_plyr.getTextureRect().height);
        mposy=0;
        is_pltfrm=true;
}
else
{
        is_pltfrm=false;
}
return is_pltfrm;
}

static void ManageJump(Time deltaTime){
    if(grounded()==true || pltfrmd()==true){
        canJump=true;
    }
    
    if((is_spc==true && canJump && sprt_plyr.getPosition().y > sprt_grnd.getPosition().y-sprt_plyr.getTextureRect().height-150f) || (is_spc==true && canJump && sprt_plyr.getPosition().y > sprt_muro.getPosition().y-sprt_plyr.getTextureRect().height-150f)){
        mposy-=30.0f*deltaTime.asSeconds();
    }
    else{
        canJump=false;
        if((sprt_plyr.getPosition().y <= sprt_grnd.getPosition().y-sprt_plyr.getTextureRect().height-150f) || (sprt_plyr.getPosition().y <= sprt_muro.getPosition().y-sprt_plyr.getTextureRect().height-150f)){
            mposy++;
        }
        mposy++;
    }
}

}

Как вы можете видеть на изображениях (если я могу опубликовать видео), когда персонаж прыгает с земли, он делает больше, чем если прыгает с платформы. Мой подход - постоянная высота прыжка, но я застрял: /

прыгнуть с земли https://imgur.com/unzBtys

прыгать с платформы https://imgur.com/6L4UaDK

сравнение https://imgur.com/tBD3jIW

0 ответов

Другие вопросы по тегам