Как заставить моего персонажа прыгать на одинаковой высоте, если он находится на земле или платформе? (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