Tag: 2d

java applet:在两层2D场景中有一种简单的绘制和擦除方法吗?

我有一个applet,它使用圆和线显示一些数据。 随着数据不断变化,显示会更新,这意味着有时必须擦除圆圈和线条,所以我只是用白色(我的背景色)绘制它们以擦除它们。 (它们中有很多,所以擦除所有内容然后重新计算并重新绘制除擦除项目之外的所有内容将是一种非常慢的方法来擦除单个项目。) 情况的逻辑是需要显示两个层,我需要能够擦除一个层中的对象而不影响另一个层。 我认为上层需要具有“透明”的背景颜色,但是我将如何擦除对象,因为以透明颜色绘制无效。 这种情况与网络上所有与透明度相关的帮助的区别在于,我希望能够从透明层逐个擦除线条和圆圈,用“完全透明”的颜色覆盖它们的像素。 目前我的applet通过在start()中执行此操作来绘制(仅使用单个图层): screenBuffer = createImage(640, 480); screenBufferGraphics = screenBuffer.getGraphics(); 这在paint()中: g.drawImage(screenBuffer, 0, 0, this); 和对象通过以下命令呈现(或通过白色绘制“擦除”): screenBufferGraphics.drawLine(x1,y1,x2,y2); 是否容易以某种方式制作具有透明背景的第二个屏幕缓冲区,然后能够在该缓冲区中绘制和擦除对象并将其渲染到第一个缓冲区上?

如何在不加载到内存的情况下调整图像大小?

我想检查图像的尺寸,然后在宽度超过给定阈值时调整尺寸。 当我使用ImageIO.read()加载6MB JPEG图像时,BufferedImage会分配大约45MB的堆空间。 有没有办法在不将所有数据加载到内存中的情况下调整直通图像大小? 我尝试传递ImageIO.read()一个File对象,认为它会从磁盘流式传输数据,但它没有帮助。

2D游戏中碰撞的高效算法?

我正在按照教程编写一个用Java编写的炸弹人 (这是我的第一个游戏)。 本教程建议使用以下代码来检测冲突。 for (int p=0; p<entities.size(); p++) { for (int s=p+1; s<entities.size(); s++) { Entity me = (Entity) entities.get(p); Entity him = (Entity) entities.get(s); if (me.collidesWith(him)) { me.collidedWith(him); him.collidedWith(me); } } 到目前为止, 实体是一个包含敌人和玩家的数组列表。 由于我还想检测玩家与墙壁发生碰撞,我是否应该将每个墙壁或砖块放入实体arraylist中? 如果是这样,这个算法效率不高吗? 这些瓷砖不会与其他瓷砖碰撞,所以我想在不同的列表中管理游戏实体。 你有什么建议? 有没有更有效的算法呢? 注意:我已经阅读了与2D游戏中的碰撞有关的其他问题。 非常感谢。

2d球没有正确碰撞

我只是想编写一个漂亮的物理游戏。 球碰撞看起来不错,但如果球碰撞得太慢,它们会互相“粘”。 我不知道他们为什么这样做。 这是我的碰撞function: private void checkForCollision(ArrayList balls) { for (int i = 0; i < balls.size(); i++) { Ball ball = balls.get(i); if (ball != this && ball.intersects(this)) { this.collide(ball, false); } } } public boolean intersects(Ball b) { double dx = Math.abs(b.posX – posX); double dy = Math.abs(b.posY – posY); double d = […]

如何处理不同计算机之间的Java 2D性能变化?

我一直在Windows上用Java设计一款纸牌游戏。 它在我的笔记本电脑和其他一些系统上运行得非常好,但在许多其他系统(甚至是Mac和Windows上的一些新系统)上,动画速度非常慢。 我发现Java用户界面工具包是迄今为止最好的资源,但未能取得重大改进。 我正在使用AWT / Swing库。 题: 看看我的游戏 ,(<1.5Mb),在某些计算机(类似规格)上,性能似乎远远低于笔记本电脑上的性能? 整个应用程序是事件驱动的,我已经完成了大部分优化,我认为在实现的情况下可以完成。 我感觉它与记忆有关。 我创建(兼容),然后在开始时将我的所有图像存储到一个数组中,然后在那里引用它们。 注意:我决定制作这个游戏,以便我可以学习和练习一些新的想法,所以我不只是想分享它 – 我真的很想知道这里发生了什么。

如何在Java中为2D游戏构建Tiled地图?

不知道如何处理这个问题。 基本上,我想要一个400×400窗口的Pixel – > Tile表示。 屏幕上的每个坐标,例如120×300应该是图块的一部分。 我最小的精灵是4个像素,所以我们可以说1个tile = 4个像素。 玩家和敌人的精灵都是20 x 20,所以每个玩家/坏人将占据5个牌。 然后我想使用这个Map类来: 通过提供图块的索引/ id来检索玩家/怪物精灵的x / y坐标。 知道边界的位置,因此它不会将精灵移动到400×400 ,从而隐藏它。 碰撞检测,了解瓷砖是否空置。 如何才能做到这一点? 这里特别谈论x,y-> tile或tile index->​​ x,y转换(适当地绘制精灵)。

在2d数组中添加对角线值

我有以下2d数组 int [][] array = {{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, {10, 11, 12, 13, 14, 15, 16, 17, 18, 19}, {20, 21, 22, 23, 24, 25, 26, 27, 28, 29}, {30, 31, 32, 33, 34, 35, 36, 37, 38, 39}, {40, 41, 42, 43, 44, 45, 46, 47, 48, […]

如何遍历一个2d char数组搜索java中的单词?

我在完成学校任务时遇到了麻烦,并且非常欣赏一些见解。 我被要求使用25×25 2d char数组创建一个wordsearch,并以某种方式通过开发一种算法来遍历该数组,该算法将搜索它以查找21个预定义的单词。 到目前为止,我已经能够创建一个我需要找到的字体的粗糙数组,以及在每个位置放置字符的二维数组。 in = new ASCIIDataFile(“wordsearch.txt”); display = new ASCIIDisplayer(); int numberWords = in.readInt(); wordlist = new char[numberWords][]; for (int i =0; i<wordlist.length; i++){ wordlist[i] = in.readLine().toUpperCase().toCharArray(); } for(int i = 0;i<wordlist.length; i++){ display.writeLine(" "); for(int j = 0;j<wordlist[i].length; j++){ display.writeChar(wordlist[i][j]); } } //done wordlists int gridLength = in.readInt(); int gridHeight = […]

基于空间代理的建模的数据结构

在二维空间模拟中跟踪代理的一些好的数据结构是什么? 我已经看到一些对四叉树(我理解)和kd树(我不太了解)的引用。 我正在寻找一个代理人可以有效地说出的话,“我知道我的位置,而且我想知道哪些代理人在我附近(在我自己的某个半径范围内)。” 非常感谢示例(伪代码很好)。 我在Java工作。

Java慢速2D性能 – resize

我正在使用Windows 7和Aero,并且有一个非常快的显卡(Radeon 6870),我用它来玩游戏。 调整我使用java制作的非常简单的程序时,我遇到了一些问题。 例如,这个程序绝对没有任何作用。 它没有动作侦听器,没有循环。 它只是一个带按钮的GUI界面。 使用OpenGL加速关闭resize: [查看全屏] 大约需要一秒钟来调整组件的大小。 对我来说非常明显。 使用OpenGL加速resize: 我试图启用OpenGl加速来解决这个问题。 我编译了JAR并使用java -Dsun.java2d.opengl=true -jar C:\Test.jar运行它。 结果是窗口周围的黑色区域略微减少 ,但更多的闪烁。 实际上,闪烁在上面的屏幕截图中显示为灰色。 问题是否存在于任何其他软件中? 不,Eclipse,Netbeans,Chrome和其他应用程序已经过测试。 没有这个问题。 因此,我必须得出结论,代码必定存在一些问题。 各种各样的人都运行了这段代码并说他们有“没有问题”。 如果您要测试它,请确保您将窗口从最小尺寸调整到最大尺寸,同时以圆周运动移动鼠标。 码: import java.awt.*; import javax.swing.*; public class JFrameWithButtonsTest { private int iScreen = 25; private int iLocation = 10; JFrame frame = new JFrame(); Container contentPane = frame.getContentPane(); public […]