Witam. Udało mi się wreszcie stworzyc funkcje, która umożliwia w miarę płynny skok postaci.
- Pierwszy problem polega na tym, ze skacze tylko góra dół i nie wiem jak zrobić, żeby podczas skoku można było ruszać się w prawo / lewo.
- Drugi to kolizje. Postać podczas skoku, gdy natrafi na przeszkodę na chwile zatrzymuje się pod nią, zaś następnie leci nadal w górę. Nie mam pojęcia ja to rozwiązać. Dodam, że funkcja opowiadająca za kolizje działa, niestety nie wiem jak zaimplementować ją przy skoku i przy spadaniu.
Proszę o jakąkolwiek pomoc.
Cała klasa Gameplay :
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.ImageIcon;
import javax.swing.JPanel;
import javax.swing.Timer;
public class ElectricManGameplay extends JPanel implements KeyListener, ActionListener
{
Textury box = new Textury("box.png", 600, 670, 200, 270);
Postać postać = new Postać("Postać.png", 100, 680, 70, 70, 40, 70);
private ImageIcon picture;
private static final int LeftMapBorder = 21;
private static final int RightMapBorder = 1405 ;
private static final int TopMapBorder = 21;
private static final int BottomMapBorder = 750;
private int moves = 0;
private int delay = 100;
private int t = 1;
private boolean left = false;
private boolean right = false;
private boolean jump = false;
private boolean down = false;
private Timer timer;
public ElectricManGameplay()
{
addKeyListener(this);
setFocusable(true);
setFocusTraversalKeysEnabled(false);
timer = new Timer(delay, this);
timer.start();
}
public void Jump()
{
if(jump)
{
postać.Yposition = 4*t*t - postać.Jump*t + 743;
t++;
System.out.println(t + " "+ postać.Yposition);
if(postać.Yposition > 680)
{
postać.Yposition = 680;
jump = false;
t=1;
}
}
}
public static boolean Kolizja(Postać postać, Textury box)
{
return(postać.Xposition < box.rightSide && postać.Xposition + postać.Width > box.leftSide && postać.Yposition + postać.Height > box.topSide && postać.Yposition < box.bottomSide);
}
public void paint(Graphics g)
{
if(moves == 0)
{
postać.Xposition = 100;
postać.Yposition = 680;
}
g.setColor(Color.black);
g.drawRect(20, 20, 1455, 730);
g.setColor(Color.white);
g.fillRect(21, 21, 1454, 729);
picture = new ImageIcon(postać.NazwaPliku); //rysowanie postaci
picture.paintIcon(this,g , postać.Xposition, postać.Yposition);
picture = new ImageIcon(box.NazwaPliku); // rysowanie przeszkody
picture.paintIcon(this,g, box.leftSide, box.topSide);
//picture = new ImageIcon(box.NazwaPliku); // rysowanie przeszkody
//picture.paintIcon(this,g, box.leftSide, box.topSide);
}
public void keyPressed(KeyEvent e)
{
if(e.getKeyCode() == KeyEvent.VK_RIGHT) // jeśli przycisk (prawa strzałka) jest wciśnięty to wykonaj instrukcje
{
moves ++;
right = true;
left = false;
jump = false;
down = false;
}
if(e.getKeyCode() == KeyEvent.VK_LEFT)
{
moves ++;
right = false;
left = true;
jump = false;
down = false;
}
if(e.getKeyCode() == KeyEvent.VK_UP)
{
moves ++;
right = false ;
left = false;
jump = true;
down = false;
}
if(e.getKeyCode() == KeyEvent.VK_DOWN)
{
moves ++;
right = false;
left = false;
jump = false;
down = true;
}
if(e.getKeyCode() == KeyEvent.VK_1)
{
postać.Prędkość=60;
}
if(e.getKeyCode() == KeyEvent.VK_2)
{
postać.Prędkość=80;
}
if(e.getKeyCode() == KeyEvent.VK_3)
{
postać.Prędkość=100;
}
}
public void keyReleased(KeyEvent e)
{
right = false;
left = false;
down = false;
}
public void keyTyped(KeyEvent e)
{
}
public void actionPerformed(ActionEvent e)
{
if(right)
{
postać.Xposition += postać.Prędkość;
if(postać.Xposition > RightMapBorder)
{
postać.Xposition = RightMapBorder;
}
if(Kolizja(postać, box)==true)
{
postać.Xposition = box.leftSide - postać.Width;
}
System.out.println("Xpos:[" + postać.Xposition + "] X1pos:[" + (postać.Xposition+postać.Width) + "]" + "Ypos:[" + postać.Yposition + "] Y1pos:[" + (postać.Yposition+postać.Height) + "]" + " Kolizja: " + Kolizja(postać, box));
}
if(left)
{
postać.Xposition -= postać.Prędkość;
if(postać.Xposition < LeftMapBorder)
{
postać.Xposition = LeftMapBorder;
}
if(Kolizja(postać, box)==true)
{
postać.Xposition = box.rightSide;
}
System.out.println("Xpos:[" + postać.Xposition + "] X1pos:[" + (postać.Xposition+postać.Width) + "]" + "Ypos:[" + postać.Yposition + "] Y1pos:[" + (postać.Yposition+postać.Height) + "]" + " Kolizja: " + Kolizja(postać, box));
}
if(jump )
{
Jump();
if(Kolizja(postać, box)==true)
{
postać.Yposition = box.bottomSide;
}
if(postać.Yposition < TopMapBorder)
{
postać.Yposition = TopMapBorder;
}
System.out.println("Xpos:[" + postać.Xposition + "] X1pos:[" + (postać.Xposition+postać.Width) + "]" + "Ypos:[" + postać.Yposition + "] Y1pos:[" + (postać.Yposition+postać.Height) + "]" + " Kolizja: " + Kolizja(postać, box));
}
if(down)
{
postać.Yposition += postać.Prędkość;
if(postać.Yposition + postać.Height > BottomMapBorder)
{
postać.Yposition = BottomMapBorder-70;
}
if(Kolizja(postać, box)==true)
{
postać.Yposition = box.topSide - postać.Height;
}
System.out.println("Xpos:[" + postać.Xposition + "] X1pos:[" + (postać.Xposition+postać.Width) + "]" + "Ypos:[" + postać.Yposition + "] Y1pos:[" + (postać.Yposition+postać.Height) + "]" + " Kolizja: " + Kolizja(postać, box));
}
repaint();
}
}
A to klasa postać :
public class Postać
{
public String NazwaPliku;
public int Xposition;
public int Yposition;
public int Width;
public int Height;
public int Prędkość;
public int Jump; //wysokość skoku (W zakresie 67 - 107)
public Postać(String N, int X, int Y, int W, int H, int P, int J)
{
NazwaPliku = N;
// punkt A(Xposition, Yposition)
Xposition = X;
Yposition = Y;
Width = W;
Height = H;
Prędkość = P;
Jump = J;
}
}