2017-01-25 1 views
0

gif of the problem at handWeird-Jumping - Grund Java Game Dev

So wie Sie in der gif sehen können, wenn mein Charakter das erste Mal springt er ein sehr kurzer Sprung, aber wenn Sie ihn nach der Landung machen springt sofort springt er auf in den Himmel. Hier

ist das Spiel Code:

package com.game.src.main; 
import java.awt.*; 
import java.util.*; 
import javax.swing.JFrame; 
import java.awt.image.*; 
import java.io.IOException; 
import java.awt.event.*; 
public class Game extends Canvas implements Runnable { 
private Player p; 
private Controller c; 
private Player p2; 

private boolean running = false; 
private Thread thread; 
long timeOfLastProjectile = 0; 
long timeOfLastProjectile2 = 0; 

public static final int WIDTH = 940; 
public static final int HEIGHT = 400; 
public static final int SCALE = 1; 
public final String TITLE = "1v1"; 

private BufferedImage image = new BufferedImage(WIDTH,HEIGHT*2,BufferedImage.TYPE_INT_RGB); 
private BufferedImage spriteSheet = null; 
private BufferedImage background = null; 

private boolean is_shooting = false; 
private boolean is_shooting2 = false; 

public void init() 
{ 
    BufferedImageLoader loader = new BufferedImageLoader(); 
    try 
    { 
     spriteSheet = loader.loadImage("/spritesheet.png"); 
     background = loader.loadImage("/background.gif"); 
    }catch(IOException e) 
    { 
     e.printStackTrace(); 
    } 

    addKeyListener(new KeyInput(this)); 
    this.requestFocus(); 
    p = new Player(200,(370-64),this); 
    p2 = new Player((740-64),(370-64),this); 
    c = new Controller(this); 
} 

private synchronized void start() 
{ 
    if (running) 
     return; 

    running = true; 
    thread = new Thread(this); 
    thread.start(); 
} 

private synchronized void stop() 
{ 
    if (!running) 
     return; 

    running = false; 
    try{ 
     thread.join(); 
    } catch (InterruptedException e){ 
     e.printStackTrace(); 
    } 
    System.exit(1); 
} 

public void run() 
{ 
    init(); 
    long lastTime = System.nanoTime(); 
    final double amountOfTicks = 60.0; 
    double ns = 1000000000/amountOfTicks; 
    double delta = 0; 
    int updates = 0; 
    int frames = 0; 
    long timer = System.currentTimeMillis(); 
    while(running) 
    { 
     long now = System.nanoTime(); 
     delta += (now - lastTime)/ns; 
     lastTime = now; 
     if(delta >= 1) 
     { 
      tick(); 
      updates++; 
      delta--; 
     } 
     render(); 
     frames++; 

     if(System.currentTimeMillis() - timer > 1000) 
     { 
      timer += 1000; 
      System.out.println(updates + " Ticks, Fps " + frames); 
      updates = 0; 
      frames = 0; 
     } 
    } 
    stop(); 
} 

private void tick() 
{ 
    p.tick(); 
    p2.tick(); 
    c.tick(); 
} 

private void render() 
{ 
    BufferStrategy bs = this.getBufferStrategy(); 

    if(bs == null) 
    { 
     createBufferStrategy(3); 
     return; 
    } 

    Graphics g = bs.getDrawGraphics(); 
    //////////////////////////////////// 

    g.drawImage(image, 0, 0, getWidth(), getHeight(), this); 

    g.drawImage(background, 0, 0, null); 

    p2.render(g); 
    p.render(g); 
    c.render(g); 
    //////////////////////////////////// 

    g.dispose(); 
    bs.show(); 
} 

public void keyPressed(KeyEvent e) { 

    int key = e.getKeyCode(); 

    if (key == KeyEvent.VK_D) { 
     p.setVelX(-3); 
    } 

    else if (key == KeyEvent.VK_G) { 
     p.setVelX(3); 
    } 

    else if (key == KeyEvent.VK_R) { 
     p.jump(7); 
    } 

    else if (key == KeyEvent.VK_F) 
    { 
     p.setVelY(3); 
    } 
    else if (key == KeyEvent.VK_Q && !is_shooting) 
    { 
     long timeNow = System.currentTimeMillis(); 
     long time = timeNow - timeOfLastProjectile; 
     if (time < 0 || time > 1000) { 
      timeOfLastProjectile = timeNow; 
      is_shooting = true; 
      c.addBullet(new Bullet(p.getX(), p.getY(), this, 1)); 
     } 
    } 
    //------------------------------------------------------- 
    if (key == KeyEvent.VK_LEFT) 
    { 
     p2.setVelX(-3); 
    } 

    else if (key == KeyEvent.VK_RIGHT) { 
     p2.setVelX(3); 
    } 

    else if (key == KeyEvent.VK_UP) { 
     p2.setVelY(-3); 
    }   

    else if (key == KeyEvent.VK_DOWN) 
    { 
     p2.setVelY(3); 
    } 

    else if (key == KeyEvent.VK_P && !is_shooting2) 
    { 
     long timeNow2 = System.currentTimeMillis(); 
     long time2 = timeNow2 - timeOfLastProjectile2; 
     if (time2 < 0 || time2 > 1000) { 
      timeOfLastProjectile2 = timeNow2; 
      is_shooting2 = true; 
      c.addBullet(new Bullet(p2.getX(), p2.getY(), this, 0)); 
     } 
    } 
} 

public void keyReleased(KeyEvent e) { 

    int key = e.getKeyCode(); 

    if (key == KeyEvent.VK_D) { 
     p.setVelX(0); 
    } 

    else if (key == KeyEvent.VK_G) { 
     p.setVelX(0); 
    } 

    else if (key == KeyEvent.VK_R) { 
    } 
    else if (key == KeyEvent.VK_F) 
    { 
     p.setVelY(0); 
    } 
    else if (key == KeyEvent.VK_Q) 
    {  

     is_shooting = false; 

    } 
    //------------------------------------------------------- 
    if (key == KeyEvent.VK_LEFT) 
    { 
     p2.setVelX(0); 
    } 

    else if (key == KeyEvent.VK_RIGHT) { 
     p2.setVelX(0); 
    } 

    else if (key == KeyEvent.VK_UP) { 
     p2.setVelY(0); 
    }   

    else if (key == KeyEvent.VK_DOWN) 
    { 
     p2.setVelY(0); 
    } 

    else if (key == KeyEvent.VK_P) 
    { 
     is_shooting2 = false; 
    } 

} 

public static void main(String args[]) 
{ 
    Game game = new Game(); 

    game.setPreferredSize(new Dimension(WIDTH * SCALE, HEIGHT * SCALE)); 
    game.setMaximumSize(new Dimension(WIDTH * SCALE, HEIGHT * SCALE)); 
    game.setMinimumSize(new Dimension(WIDTH * SCALE, HEIGHT * SCALE)); 

    JFrame frame = new JFrame(game.TITLE); 
    frame.add(game); 
    frame.pack(); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setResizable(false); 
    frame.setLocationRelativeTo(null); 
    frame.setVisible(true); 

    game.start(); 
} 

public BufferedImage getSpriteSheet() 
{ 
    return spriteSheet; 
} 

}

und hier ist Spieler:

package com.game.src.main; 
import java.awt.*; 
import java.awt.image.BufferedImage; 

public class Player { 
private double x; 
private double y; 
protected double maxDY; 
protected double gravity; 
protected boolean canJump; 

private BufferedImage player; 

private double velX = 0; 
private double velY = 0; 
public Player(double x, double y, Game game) { 
    this.x = x; 
    this.y = y; 
    SpriteSheet ss = new SpriteSheet(game.getSpriteSheet()); 
    player = ss.grabImage(1,1,32,32); 
    gravity = 0.1; 
    maxDY = 5; 
} 

private void initPlayer() { 

} 

public void tick() 
{ 

    x+=velX; 
    y+=velY; 
    fall(); 
    if(x <= 0) 
     x=0; 

    if (x >= 940-32) 
     x=940-32; 

    if(y <= 0) 
     y=0; 

    if (y >= 370-64) 
    { 
     y=370-64; 
     canJump = true; 
    } 
    else 
    { 
     canJump = false; 
    } 
} 

public void render(Graphics g) 
{ 
    g.drawImage(resize(player,64,64), (int)x, (int)y, null); 
} 

public double getX() { 
    return x; 
} 

public double getY() { 
    return y; 
} 

public void setX(double x) 
{ 
    this.x = x; 
} 

public void setY(double y) 
{ 
    this.y = y; 
} 

public void setVelX(double velX) 
{ 
    this.velX = velX; 
} 

public void setVelY(double velY) 
{ 
    this.velY = velY; 
} 
public static BufferedImage resize(BufferedImage img, int newW, int newH) { 
    Image tmp = img.getScaledInstance(newW, newH, Image.SCALE_SMOOTH); 
    BufferedImage dimg = new BufferedImage(newW, newH, BufferedImage.TYPE_INT_ARGB); 

    Graphics2D g2d = dimg.createGraphics(); 
    g2d.drawImage(tmp, 0, 0, null); 
    g2d.dispose(); 

    return dimg; 
} 

public void fall() 
{ 
    if (y < 320) 
    velY += gravity; 
    if (velY > maxDY) velY = maxDY; 
} 

public void jump(double jumpHeight) 
{  
    if (canJump) 
     velY -= jumpHeight; 
} 
} 

Ich bin ziemlich sicher, es hat etwas mit diesem speziellen Bit von Spielern zu tun aber ich bin mir nicht sicher:

public void tick() 
{ 

    x+=velX; 
    y+=velY; 
    fall(); 
    if(x <= 0) 
     x=0; 

    if (x >= 940-32) 
     x=940-32; 

    if(y <= 0) 
     y=0; 

    if (y >= 370-64) 
    { 
     y=370-64; 
     canJump = true; 
    } 
    else 
    { 
     canJump = false; 
    } 
} 

Kann mir jemand dabei helfen?

Antwort

0

Es scheint, als ob dein Charakter am Boden keine vertikale Geschwindigkeit von Null hat. Er fällt immer noch auf Endgeschwindigkeit. Ihr Code bringt ihn automatisch auf den Boden, wenn er unter die Erde geht, also sehen Sie das nicht. Er versucht zu springen, und die daraus resultierende Veränderung der Vertikalgeschwindigkeit überwindet das, aber gerade noch.

Aber wenn man sofort springt, wenn er nach einem kleinen Sprung auf den Boden aufschlägt, fährt er noch nicht mit der Endgeschwindigkeit nach unten - er fährt an dieser Stelle mit einer relativ niedrigen Geschwindigkeit ab. Da seine Geschwindigkeit vor dem Sprung nach unten kleiner ist, überwindet sein Sprung leicht und er steigt höher.

+0

Deshalb habe ich, wenn (y <320) \t hinzugefügt { \t \t VELY + = Schwerkraft; \t \t wenn (velY> maxDY) velY = maxDY; \t} – Brandyn

+0

aber das repariert es nicht – Brandyn

+0

Das macht es einfach so velY kann nicht mehr als 5 gehen. Warum reist der Kerl mit einer vertikalen Rate von 5, wenn er auf dem Boden steht? Warum reist er nicht mit 0, wenn er nur da steht? –