我有一个游戏系统但我不知道应该用它来显示它.我正在制作一个垂直射击游戏,我已经为所有控制敌人和玩家的课程编写了方法,但我不知道如何有效地展示游戏.我在想Canvas,它会重绘每一帧,但这真的是最有效的方法吗?
重要细节:
我需要一个坐标平面.如果不完全重构我的代码,这是唯一无法改变的基本部分.
最重要的是我拥有的一切设置方式,每帧的所有对象的移动,并在一个坐标平面上我设计的互动(带冲突检测和运动,没有图形组件的交易),那么一切都应该得到画到屏幕上,只需要去通过ArrayLists跟踪所有移动的对象并逐个绘制它们.
有没有办法让JFrame对象的事件监听器检测用户何时单击窗口最大化或最小化按钮?
我使用JFrame对象如下:
JFrame frame = new JFrame("Frame");
我有一个简单的类,当鼠标拖动时绘制一条线或鼠标按下(释放)时画一个点.
当我最小化应用程序然后恢复它时,窗口的内容消失,除了最后一个点(像素).我知道super.paint(g)每次窗口改变时该方法都会重新绘制背景,但无论我是否使用它,结果似乎都是一样的.它们之间的区别在于,当我不使用它时,窗口上绘制的不仅仅是一个像素,而不是我的所有绘画.我怎样才能解决这个问题?
这是班级.
package painting;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import javax.swing.JFrame;
import javax.swing.JPanel;
class CustomCanvas extends Canvas{
Point oldLocation= new Point(10, 10);
Point location= new Point(10, 10);
Dimension dimension = new Dimension(2, 2);
CustomCanvas(Dimension dimension){
this.dimension = dimension;
this.init();
addListeners();
}
private void init(){
oldLocation= new Point(0, 0);
location= new Point(0, 0);
}
public void paintLine(){
if ((location.x!=oldLocation.x) || (location.y!=oldLocation.y)) {
repaint(location.x,location.y,1,1);
}
}
private void addListeners(){
addMouseListener(new MouseAdapter(){
@Override
public void mousePressed(MouseEvent me){ …Run Code Online (Sandbox Code Playgroud) 我正在尝试开发一个小的java 2d塔防游戏,我遇到了试图计算如何做导弹的问题.经过几个小时的搜索和测试,我更加困惑.
到目前为止我所拥有的是:
Math.sqrt(x2, x1, y2, y1).现在我遇到的问题是如何将导弹的增量x和y缩放到目标,这看起来很逼真.数学不是我的强项,而是在这里展示.下面我展示了我对塔楼SE象限的看法.
public int distanceX, distanceY;
public double sep, scale;
if(xBullet < Screen.mobs[shotMob].x && yBullet < Screen.mobs[shotMob].y){
distanceX = Screen.mobs[shotMob].x- xBullet;
distanceY = Screen.mobs[shotMob].y - yBullet;
sep = Math.sqrt( (distanceX * distanceX) + (distanceY * distanceY));
scale = // This is the part I am confused about.
xBullet += distanceX * scale;
yBullet += distanceY * scale;
Run Code Online (Sandbox Code Playgroud) 我是Java图形和线程的新手,我正在尝试制作游戏(特别是Pong).这个想法是两个人可以在同一个键盘上玩(即有两个通过不同键控制的拨片).目前,两名球员不能同时移动他们的球拍.
这个问题有方法解决吗?单独的线程是答案吗?
如果可能的话,我希望桨能够同时移动(至少看似).
更新:似乎使用Set<Integer>存储按键是最好的选择.我已经完成了(并且它可以工作),但我想知道是否有任何此代码不在事件调度线程(EDT)上,如果我需要使用SwingUtilities.invokeLater();.这是必要的代码:
private Set<Integer> keysDown = Collections.synchronizedSet(new HashSet<Integer>());
public void keyPressed(KeyEvent e)
{
keysDown.add(e.getKeyCode());
}
public void keyReleased(KeyEvent e)
{
keysDown.remove(e.getKeyCode());
}
public void updatePaddlePositions()
{
if (keysDown.contains(KeyEvent.VK_W))
paddleOne.move(-PADDLE_MOVE_INCREMENT);
if (keysDown.contains(KeyEvent.VK_S))
paddleOne.move(PADDLE_MOVE_INCREMENT);
if (keysDown.contains(KeyEvent.VK_UP))
paddleTwo.move(-PADDLE_MOVE_INCREMENT);
if (keysDown.contains(KeyEvent.VK_DOWN))
paddleTwo.move(PADDLE_MOVE_INCREMENT);
try {
Thread.sleep(DELAY);
} catch (InterruptedException e) {
System.out.println("You Interrupted the game!");
}
canvas.repaint();
}
Run Code Online (Sandbox Code Playgroud)
这是对象的paintComponent方法canvas:
public void paintComponent(Graphics g)
{
super.paintComponent(g);
paddleOne.paint(g);
paddleTwo.paint(g);
updatePaddlePositions(); // Does this need to be …Run Code Online (Sandbox Code Playgroud) 大家好,我最近遇到的问题是,现在有些显示器有不同的DPI设置,有些显示器更密集,例如Apple的Retina显示器.
如何用Java补偿各种监视器上的不同DPI设置和密度?是否可以在任何监视器上将控件缩放为相同的大小.我知道在为Android编程时,所有测量都在"DP"中,您可以为三种不同的显示密度指定不同的图像.
有没有办法可以使用Java/Swing为不同的显示密度选择不同的图像,这样我的应用程序在高密度显示器上看起来并不模糊?或者这不是那么重要或可能吗?我知道Chrome目前没有考虑DPI,但是Internet Explorer和其他应用程序也是如此.
谢谢你的帮助,我是Java开发人员,我以前从未考虑过DPI,并且想知道如何去做它:)
这是我第一次尝试使用BufferStrategy,我真的很感激一些提示.
1)为什么在下面的代码中,getSize()在调整窗口大小之前返回0的尺寸?如何立即检测窗口的大小?
2)为什么什么时候getSize()返回的东西不是窗户的全尺寸?IE为什么底部和右边都有一条黑色条带?
3)调整窗口大小时有没有办法摆脱闪烁?
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.image.BufferStrategy;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class BSTest extends JFrame {
BufferStrategy bs;
DrawPanel panel = new DrawPanel();
public BSTest() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(800,420);
setLocationRelativeTo(null);
setIgnoreRepaint(true);
setVisible(true);
createBufferStrategy(2);
bs = getBufferStrategy();
panel.setIgnoreRepaint(true);
add(panel);
panel.drawStuff();
}
public class DrawPanel extends JPanel {
public void drawStuff() {
while(true) {
try {
Graphics2D g = (Graphics2D)bs.getDrawGraphics();
g.setColor(Color.BLACK);
System.out.println("W:"+getSize().width+", H:"+getSize().height);
g.fillRect(0,0,getSize().width,getSize().height);
bs.show();
g.dispose();
Thread.sleep(20);
} catch (Exception e) { System.exit(0); …Run Code Online (Sandbox Code Playgroud) 我有一个JPanel,里面有一个按钮.按钮的位置无关紧要.该paint(Graphics g)代码是:
@Override
public void paint(Graphics g) {
super.paint(g);
/* drawing code */
}
如果我想用黑色矩形填充面板的整个空间,同时在面板中也有按钮,填充的矩形将简单地覆盖所有内容.因此,按钮周围没有按钮然后是黑色,整个面板都是黑色的.
有没有办法修改面板或绘画程序,以便在自定义绘画的顶部绘制组件?
我试图把super.paint(g)绘画结束,如:
@Override
public void paint(Graphics g) {
/* drawing code */
super.paint(g);
}
......以为它会首先进行自定义绘画,然后简单地将组件放在它上面.但是,如果这样做,自定义绘画将完全消失,只显示按钮.也就是说,只有一个按钮和一个白色(默认)背景而不是黑色矩形.
有任何想法吗?
谢谢!
编辑:我想澄清黑色矩形是一个例子.我知道我可以简单地设置背景颜色,但我想最终能够做任何我想要的自定义绘画.
我有一个JPanel,我在上面画了四个矩形.随机选择这些矩形中的每一个的颜色.仅当用户单击特定矩形时,颜色才会更改.
问题是,当用户调整窗口大小时,JPanel上的所有内容都会重复"重新绘制".这导致矩形快速改变颜色.
理想情况下,在调整大小时,我需要矩形的颜色保持不变.否则,我还可以使用一个解决方案,在完成调整大小后,JPanel只重画一次.
您对我如何实现这一点有什么一般性的想法吗?如果ComponentListener中有onStartResize和onFinishResize回调方法,我觉得这样会容易得多.
谢谢!
我这里有这个代码用于创建像素数组并将其绘制到图像中:
import javax.swing.JFrame;
import java.awt.Canvas;
import java.awt.Graphics;
import java.awt.image.BufferStrategy;
import java.awt.image.BufferedImage;
import java.awt.image.DataBufferInt;
public class test extends Canvas implements Runnable {
private static final long serialVersionUID = 1L;
public static int WIDTH = 800;
public static int HEIGHT = 600;
public boolean running = true;
public int[] pixels;
public BufferedImage img;
public static JFrame frame;
private Thread thread;
public static void main(String[] arg) {
test wind = new test();
frame = new JFrame("WINDOW");
frame.add(wind);
frame.setVisible(true);
frame.setSize(WIDTH, HEIGHT);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
wind.init();
} …Run Code Online (Sandbox Code Playgroud) java ×10
swing ×8
awt ×3
graphics ×2
jpanel ×2
paint ×2
2d ×1
components ×1
dpi ×1
game-physics ×1
jframe ×1
key-bindings ×1
math ×1
repaint ×1
resize ×1