速度的加速/减速 import java.util.*; 导入javax.swing.*; 导入java.awt.*; 导入java.awt.event.*; 公共类Zhang扩展了JFrame,实现了可运行的KeyListener { 容器con=getContentPane(); 螺纹t=新螺纹(此); int霍格沃茨X=10,霍格沃茨Y=10,Snitchx=200,Snitchy=200,Loopx=50,Loopy=300,Loop2x=120,Loop2y=10, Loopx2=190,Loopy2=300,Loop2x2=260,Loop2y2=10,Loopx3=320, Loopy3=300,Loop2x3=380,Loop2y3=10, SnitchxVel=10,SnitchyVel=10; 图像环路; 图像环2; 图像窃贼; 霍格沃茨形象; 公众张() { addKeyListener(此); 霍格沃茨=Toolkit.getDefaultToolkit().getImage(getClass().getResource(“Hogwarts.gif”); 霍格沃茨=霍格沃茨。getScaledInstance(500500,1); Loop2=Toolkit.getDefaultToolkit().getImage(getClass().getResource(“Loop2.gif”); Loop2=Loop2.getScaledInstance(2002002001); Loop=Toolkit.getDefaultToolkit().getImage(getClass().getResource(“Loop.gif”)); Loop=Loop.getScaledInstance(2002001); Snitch=Toolkit.getDefaultToolkit().getImage(getClass().getResource(“Snitch.gif”); Snitch=Snitch.getScaledInstance(150,150,1); con.setLayout(新的FlowLayout()); t、 start(); setDefaultCloseOperation(关闭时退出); } 公开募捐 { 试一试{ while(true) { t、 睡眠(100); 重新油漆(); Snitchy+=SnitchyVel; 如果(Snitchy>500) { 系统出口(0); } } } 捕获(例外e){} } 公共空间更新(图g) { 油漆(g); } 公共空间涂料(图形gr) { 图像i=createImage(getSize().width,getSize().height); Graphics2D g2=(Graphics2D)i.getGraphics(); g2.绘图图像(霍格沃茨、霍格沃茨X、霍格沃茨西、本); g2.drawImage(Loop2,Loop2x,Loop2y,this); g2.drawImage(Loop,Loopx,Loopy,this); g2.drawImage(Loop2,Loop2x2,Loop2y2,this); g2.drawImage(Loop,Loopx2,Loopy2,this); g2.drawImage(Loop2,Loop2x3,Loop2y3,this); g2.drawImage(Loop,Loopx3,Loopy3,this); g2.drawImage(Snitch、Snitchx、Snitchy、this); g2.dispose(); gr.drawImage(i,0,0,this); } 公共静态void main(字符串[]args) { 张帧=新张(); 框架。设置尺寸(500500); frame.setVisible(true); } 公共无效密钥已释放(密钥事件k) { } 按下公共无效键(KeyEvent k) { if(k.getKeyCode()==38) { 用于(SnitchyVel=10;SnitchyVel>=10;SnitchyVel++) { 鼻涕虫-=鼻涕虫; 因为(SnitchyVel=0;SnitchyVel
我不知道这个游戏,只听说过它 您的代码有几个问题。经典:速度的加速/减速 import java.util.*; 导入javax.swing.*; 导入java.awt.*; 导入java.awt.event.*; 公共类Zhang扩展了JFrame,实现了可运行的KeyListener { 容器con=getContentPane(); 螺纹t=新螺纹(此); int霍格沃茨X=10,霍格沃茨Y=10,Snitchx=200,Snitchy=200,Loopx=50,Loopy=300,Loop2x=120,Loop2y=10, Loopx2=190,Loopy2=300,Loop2x2=260,Loop2y2=10,Loopx3=320, Loopy3=300,Loop2x3=380,Loop2y3=10, SnitchxVel=10,SnitchyVel=10; 图像环路; 图像环2; 图像窃贼; 霍格沃茨形象; 公众张() { addKeyListener(此); 霍格沃茨=Toolkit.getDefaultToolkit().getImage(getClass().getResource(“Hogwarts.gif”); 霍格沃茨=霍格沃茨。getScaledInstance(500500,1); Loop2=Toolkit.getDefaultToolkit().getImage(getClass().getResource(“Loop2.gif”); Loop2=Loop2.getScaledInstance(2002002001); Loop=Toolkit.getDefaultToolkit().getImage(getClass().getResource(“Loop.gif”)); Loop=Loop.getScaledInstance(2002001); Snitch=Toolkit.getDefaultToolkit().getImage(getClass().getResource(“Snitch.gif”); Snitch=Snitch.getScaledInstance(150,150,1); con.setLayout(新的FlowLayout()); t、 start(); setDefaultCloseOperation(关闭时退出); } 公开募捐 { 试一试{ while(true) { t、 睡眠(100); 重新油漆(); Snitchy+=SnitchyVel; 如果(Snitchy>500) { 系统出口(0); } } } 捕获(例外e){} } 公共空间更新(图g) { 油漆(g); } 公共空间涂料(图形gr) { 图像i=createImage(getSize().width,getSize().height); Graphics2D g2=(Graphics2D)i.getGraphics(); g2.绘图图像(霍格沃茨、霍格沃茨X、霍格沃茨西、本); g2.drawImage(Loop2,Loop2x,Loop2y,this); g2.drawImage(Loop,Loopx,Loopy,this); g2.drawImage(Loop2,Loop2x2,Loop2y2,this); g2.drawImage(Loop,Loopx2,Loopy2,this); g2.drawImage(Loop2,Loop2x3,Loop2y3,this); g2.drawImage(Loop,Loopx3,Loopy3,this); g2.drawImage(Snitch、Snitchx、Snitchy、this); g2.dispose(); gr.drawImage(i,0,0,this); } 公共静态void main(字符串[]args) { 张帧=新张(); 框架。设置尺寸(500500); frame.setVisible(true); } 公共无效密钥已释放(密钥事件k) { } 按下公共无效键(KeyEvent k) { if(k.getKeyCode()==38) { 用于(SnitchyVel=10;SnitchyVel>=10;SnitchyVel++) { 鼻涕虫-=鼻涕虫; 因为(SnitchyVel=0;SnitchyVel,java,velocity,flappy-bird-clone,Java,Velocity,Flappy Bird Clone,我不知道这个游戏,只听说过它 您的代码有几个问题。经典: 不要扩展JFrame 暗示:切勿覆盖JFrame的更新或绘制方法 在事件分派线程上创建GUI 不要让顶级类实现这些接口 使用适当的变量名 避免使用神奇常数(Loop2x3=380,Loop2y3=10等) 具体措施如下: 动画的速度应该取决于时间,而不是帧速率 你应该考虑如何对动画建模。如果你想用位置、速度和加速度进行计算,那么你应该有这些的表示。特别是,你不应该尝试将它们存储在int值中。对于简单的2D游戏,Point2D可能是一
- 不要扩展JFrame
- 暗示:切勿覆盖JFrame的
或更新
方法绘制
- 在事件分派线程上创建GUI
- 不要让顶级类实现这些接口
- 使用适当的变量名
- 避免使用神奇常数(Loop2x3=380,Loop2y3=10等)
- 动画的速度应该取决于时间,而不是帧速率
- 你应该考虑如何对动画建模。如果你想用位置、速度和加速度进行计算,那么你应该有这些的表示。特别是,你不应该尝试将它们存储在
值中。对于简单的2D游戏,int
可能是一个不错的选择Point2D
import java.util.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Zhang extends JFrame implements Runnable, KeyListener
{
Container con = getContentPane();
Thread t = new Thread(this);
int Hogwartsx = 10, Hogwartsy= 10, Snitchx = 200, Snitchy = 200, Loopx = 50, Loopy = 300, Loop2x = 120, Loop2y = 10,
Loopx2 = 190, Loopy2 = 300, Loop2x2 = 260, Loop2y2 = 10,Loopx3 = 320,
Loopy3 = 300, Loop2x3 = 380, Loop2y3 = 10,
SnitchxVel = 10, SnitchyVel = 10;
Image Loop;
Image Loop2;
Image Snitch;
Image Hogwarts;
public Zhang()
{
addKeyListener(this);
Hogwarts = Toolkit.getDefaultToolkit().getImage(getClass().getResource("Hogwarts.gif"));
Hogwarts = Hogwarts.getScaledInstance(500, 500, 1);
Loop2 = Toolkit.getDefaultToolkit().getImage(getClass().getResource("Loop2.gif"));
Loop2 = Loop2.getScaledInstance(200, 200, 1);
Loop = Toolkit.getDefaultToolkit().getImage(getClass().getResource("Loop.gif"));
Loop = Loop.getScaledInstance(200, 200, 1);
Snitch = Toolkit.getDefaultToolkit().getImage(getClass().getResource("Snitch.gif"));
Snitch = Snitch.getScaledInstance(150, 150, 1);
con.setLayout(new FlowLayout());
t.start();
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
public void run()
{
try{
while(true)
{
t.sleep(100);
repaint();
Snitchy += SnitchyVel;
if (Snitchy > 500)
{
System.exit(0);
}
}
}
catch(Exception e){}
}
public void update(Graphics g)
{
paint(g);
}
public void paint(Graphics gr)
{
Image i=createImage(getSize().width, getSize().height);
Graphics2D g2 = (Graphics2D)i.getGraphics();
g2.drawImage(Hogwarts, Hogwartsx, Hogwartsy, this);
g2.drawImage(Loop2, Loop2x, Loop2y, this);
g2.drawImage(Loop,Loopx, Loopy, this);
g2.drawImage(Loop2, Loop2x2, Loop2y2, this);
g2.drawImage(Loop,Loopx2, Loopy2, this);
g2.drawImage(Loop2, Loop2x3, Loop2y3, this);
g2.drawImage(Loop,Loopx3, Loopy3, this);
g2.drawImage(Snitch,Snitchx,Snitchy, this);
g2.dispose();
gr.drawImage(i, 0, 0, this);
}
public static void main(String[] args)
{
Zhang frame = new Zhang();
frame.setSize(500, 500);
frame.setVisible(true);
}
public void keyReleased (KeyEvent k)
{
}
public void keyPressed (KeyEvent k)
{
if( k.getKeyCode() == 38)
{
for (SnitchyVel = 10; SnitchyVel>= 10; SnitchyVel++)
{
Snitchy-=SnitchyVel;
for (SnitchyVel = 0; SnitchyVel<=10; SnitchyVel--)
{
Snitchy+=SnitchyVel;
}
}
}
}
public void keyTyped (KeyEvent k)
{}
}
导入java.awt.BorderLayout;
导入java.awt.Color;
导入java.awt.Graphics;
导入java.awt.event.KeyAdapter;
导入java.awt.event.KeyEvent;
导入java.awt.event.KeyListener;
导入java.awt.geom.Point2D;
导入javax.swing.JComponent;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入javax.swing.SwingUtilities;
公营垃圾鸟
{
公共静态void main(字符串[]args)
{
SwingUtilities.invokeLater(新的Runnable()
{
@凌驾
公开募捐
{
createAndShowGUI();
}
});
}
私有静态void createAndShowGUI()
{
JFrame f=新的JFrame();
f、 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f、 getContentPane().setLayout(新的BorderLayout());
CrappyBirdGame CrappyBirdGame=新的CrappyBirdGame();
CrappyBirdPanel CrappyBirdPanel=新的CrappyBirdPanel(crappyBirdGame);
setComponent(crapyBirdPanel);
f、 getContentPane().add(crapyBirdPanel,BorderLayout.CENTER);
crappyBirdGame.start();
f、 设置大小(800800);
f、 setLocationRelativeTo(空);
f、 setVisible(真);
}
}
类CrappyBirdGame
{
私有点2D位置=新点2D.Double(0,500);
私有点2D速度=新点2D.Double(20,0);
专用点2D加速度=新点2D.Double(0,-9.81);
私有组件;
void setComponent(JComponent组件)
{
这个组件=组件;
}
void start()
{
Thread Thread=新线程(new Runnable()
{
@凌驾
公开募捐
{
long oldNS=System.nanoTime();
while(true)
{
long newNS=System.nanoTime();
性能化(新-旧);
oldNS=newNS;
repaint();
尝试
{
睡眠(20);
}
捕捉(中断)
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.geom.Point2D;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class CrappyBird
{
public static void main(String[] args)
{
SwingUtilities.invokeLater(new Runnable()
{
@Override
public void run()
{
createAndShowGUI();
}
});
}
private static void createAndShowGUI()
{
JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.getContentPane().setLayout(new BorderLayout());
CrappyBirdGame crappyBirdGame = new CrappyBirdGame();
CrappyBirdPanel crappyBirdPanel = new CrappyBirdPanel(crappyBirdGame);
crappyBirdGame.setComponent(crappyBirdPanel);
f.getContentPane().add(crappyBirdPanel, BorderLayout.CENTER);
crappyBirdGame.start();
f.setSize(800, 800);
f.setLocationRelativeTo(null);
f.setVisible(true);
}
}
class CrappyBirdGame
{
private Point2D position = new Point2D.Double(0, 500);
private Point2D velocity = new Point2D.Double(20, 0);
private Point2D acceleration = new Point2D.Double(0, -9.81);
private JComponent component;
void setComponent(JComponent component)
{
this.component = component;
}
void start()
{
Thread thread = new Thread(new Runnable()
{
@Override
public void run()
{
long oldNS = System.nanoTime();
while (true)
{
long newNS = System.nanoTime();
performAnimation(newNS - oldNS);
oldNS = newNS;
component.repaint();
try
{
Thread.sleep(20);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
}
});
thread.setDaemon(true);
thread.start();
}
private void performAnimation(long ns)
{
double delta = (ns / 1e9) * 15;
double newVx = velocity.getX() + delta * acceleration.getX();
double newVy = velocity.getY() + delta * acceleration.getY();
velocity.setLocation(newVx, newVy);
double newPx = position.getX() + delta * velocity.getX();
double newPy = position.getY() + delta * velocity.getY();
if (newPy < 0)
{
newPy = 0;
velocity.setLocation(velocity.getX(), 0);
}
position.setLocation(newPx, newPy);
}
public Point2D getPosition()
{
return new Point2D.Double(position.getX(), position.getY());
}
public void flap()
{
double newVx = velocity.getX();
double newVy = velocity.getY() + 50;
newVy = Math.min(30, newVy);
velocity.setLocation(newVx, newVy);
}
}
class CrappyBirdPanel extends JPanel
{
private final CrappyBirdGame crappyBirdGame;
CrappyBirdPanel(final CrappyBirdGame crappyBirdGame)
{
this.crappyBirdGame = crappyBirdGame;
setFocusable(true);
requestFocusInWindow();
KeyListener keyListener = new KeyAdapter()
{
@Override
public void keyPressed(KeyEvent e)
{
if( e.getKeyCode() == KeyEvent.VK_UP)
{
crappyBirdGame.flap();
}
}
};
addKeyListener(keyListener);
}
@Override
protected void paintComponent(Graphics g)
{
super.paintComponent(g);
Point2D p = crappyBirdGame.getPosition();
int x = (int)p.getX() % getWidth();
int y = getHeight() - (int)p.getY();
g.setColor(Color.BLUE);
g.fillOval(x-15, y-15, 30, 30);
}
}