我对更动态的java摇摆编程很陌生。我当然以前用过常规的摇摆组件,比如Button
,Panels
等等。
所以我试图用Swing
和Graphics2D
制作一个非常基本的乒乓球游戏。我以前做过一个绘画项目,我成功了。
我的问题是,当程序运行时,图形会严重口吃。到目前为止,我只实现了球,它只是选择了一个随机的方向,并开始在面板中反弹。这很有效。但是,我只能看到球,如果我一直不断调整帧的大小,否则它会严重口吃,看起来很空白。在第一秒钟左右的时间里,你可以看到球在移动,但严重口吃,然后面板开始显得空白。
相关代码和结构:
程序的主要部分是控制器
和框架
类。其中,控制器
实现runnable并包含执行游戏更新的run方法。
Frame类扩展了JFrame
,并包含一个私有实例变量JPanel
gamePanel,所有的图形都在其中绘制。
当控制器
更新程序时,它在框架
中调用一个名为updateGraphics()
的类,该类以前称为paint(getGraphics())
;
public class Frame extends JFrame {
private JPanel gamePanel;
....
public void paint(Graphics g) {
super.paint(g);
label.setText(Integer.toString(ball.getPos().x) + ", " + Integer.toString(ball.getPos().y));
Graphics2D g2 = (Graphics2D) gamePanel.getGraphics();
g2.setStroke(new BasicStroke(2));
//g2.drawRect(0, 0, gamePanel.getWidth(), gamePanel.getHeight());
try{
//Draws the ball
g2.fillOval(ball.getPos().x, ball.getPos().y, 10, 10);
//Draws the player1(left) shield
g2.setStroke(new BasicStroke(2));
g2.drawLine(playerShield.getNorthX(), playerShield.getNorthY(), playerShield.getSouthX(), playerShield.getSouthY());
g2.drawLine(playerShield.getNorthX(), playerShield.getNorthY(), playerShield.getSouthX(), playerShield.getSouthY());
//Draws the computer/Player2(right) Shield
g2.drawLine(computerShield.getNorthX(), computerShield.getNorthY(), computerShield.getSouthX(), computerShield.getSouthY());
g2.drawLine(computerShield.getNorthX(), computerShield.getNorthY(), computerShield.getSouthX(), computerShield.getSouthY());
} catch(Exception e) {
System.out.println(e);
}
}
...
public void updateGraphics() {
paint(getGraphics());
}
//Another version of the updateGraphics i have tried to use with as little success
public void updateGrapgics() {
gamePanel.validate();
gamePanel.repaint();
}
}
在搜索时,我发现有人说我应该也不应该使用油漆或重新油漆的方法。
有人能给我解释一下为什么会口吃,我应该怎么做才能让它不口吃吗?
我认为应该实现某种双缓冲。
你的问题与这个Java面板双缓冲相似,本教程应该会帮助你很多http://www.cokeandcode.com/info/tut2d.html.
不需要实现双缓冲或其他技巧。只需执行以下操作:
public class SomeVisualObject extends JComponent {
public void paintComponent(Graphics g) {
Graphics2D g2d = (Graphics2D)g;
// paint things
}
}
...
final SomeVisualObject obj = new SomeVisualObject()
frame.add(obj);
...
final Timer repaintTimer = new Timer(20, new ActionListener() {
public void actionPerformed(ActionEvent evt) {
// do some stuff here, for example calculate game physics.
// repaint actually does not repaint anything, but enqueues repaint request
obj.repaint();
}
});
repaintTimer.start();
它将运行和油漆顺利,没有故障。
只是不要弄乱循环。Swing运行自己的事件循环,这对于重新绘制和其他内容至关重要。
请参见2d游戏对象(弹跳球)的完整工作示例:https://gist.github.com/akhikhl/8199472
我试图用Java创建一个简单的乒乓球游戏进行处理。我还没有完成,一切都很顺利,只是我不能让球从乒乓桨上反弹。我已经成功地做到了,如果球低于桨板,它会反弹回来,但出于某种原因,如果球高于桨板,它会穿过。 paddleFunctions选项卡:
我想创造一个和乒乓球一样的游戏。我创建了一个沿着圆周移动的桨。注意桨是弧形的。我想知道我如何检测球和桨之间的碰撞。为了更好地理解这个:http://gyazo.com/7bac8acdf0faf66005015d496498ca33球将在圆圈内,当与桨碰撞时反射出去。提前感谢!
本教程将教你如何使用 Kivy 编写一款乒乓球游戏。我们将从一个基本的应用程序开始,描述创建这个游戏的每个步骤。 Kivy 是用 Python 和 Cython 编写的,基于 OpenGL ES 2,支持各种输入设备并拥有丰富的部件库。使用相同的代码,你可直接实现多平台应用,包括 Windows、macOS、Linux、Android 和 iOS。所有 Kivy 部件都支持多点触控。
根据https://tools.ietf.org/html/rfc6455#page-37中的文档,必须使用响应请求。 我已经实现了来处理来自客户端的连接。 我对此有疑问- 我是否必须在中处理这些请求? 如果是,如何在spring boot应用程序中实现此功能,并使用响应请求?
我想做一个正在处理的乒乓球游戏。但是球的移动不是很平稳。我试着改变帧速率并降低球的速度,但是移动速度似乎不是恒定的。这可能是性能问题吗?我是否做错了什么,或者即使对于简单的游戏,处理可能也不是正确的事情?(我的目标是试用processing.js,制作一款没有插件的游戏)。这是我的代码:
本文向大家介绍python使用pygame实现笑脸乒乓球弹珠球游戏,包括了python使用pygame实现笑脸乒乓球弹珠球游戏的使用技巧和注意事项,需要的朋友参考一下 今天我们用python和pygame实现一个乒乓球的小游戏,或者叫弹珠球游戏。 笑脸乒乓球游戏功能介绍 乒乓球游戏功能如下: 乒乓球从屏幕上方落下,用鼠标来移动球拍,使其反弹回去,并获得得分,如果没有接到该球,则失去一条命。玩家有一