gpt4 book ai didi

JAVA背景动画(LinearGradientPaint)

转载 作者:行者123 更新时间:2023-12-01 23:13:52 32 4
gpt4 key购买 nike

来自 java.awt 的 LinearGradientPaint 对象一旦绘制可能看起来不错,但在某种游戏模型中绘制动画背景时我遇到了一个问题,这需要我很长时间才能构建。

我想使用 Graphics2D 绘制对象在背景上绘制动画彩虹渐变,但当我这样做时,我注意到重新绘制面板有很多滞后。它应该至少每秒重新绘制 30 帧,只有当图形对象使用的 Paint 对象不是彩虹渐变时才有可能。

即使将其作为单独的线程运行也无法解决问题。下面是我在每帧末尾尝试执行的操作的代码:

gamePanel.executor.execute(new Runnable(){
public void run()
{
while(true)
{
if (Background.selectedBackgroundIndex >= Background.SKY_HORIZON_GRADIENT_PAINT &&
Background.selectedBackgroundIndex < Background.SPACE_PAINT)
{
float displacementValue = 1.0f;

if (Background.backgroundShape.y < ((-2990.0f) + CannonShooterModel.gamePanel.getSize().height) && gamePanel.horizonGoingDown)
gamePanel.horizonGoingDown = false;
else if (Background.backgroundShape.y > (-10.0f) && !gamePanel.horizonGoingDown)
gamePanel.horizonGoingDown = true;

Point2D.Double startPoint = (Point2D.Double)(((LinearGradientPaint)Background.background).getStartPoint()),
endPoint = (Point2D.Double)(((LinearGradientPaint)Background.background).getEndPoint());

if (gamePanel.horizonGoingDown)
Background.backgroundShape.y -= displacementValue;
else
Background.backgroundShape.y += displacementValue;

startPoint.setLocation(0, Background.backgroundShape.y);
endPoint.setLocation(0, Background.horizonGradientPaintHeight + Background.backgroundShape.y);


// Should be done in another thread, particularly in arithmetic calculations.
Background.background = new LinearGradientPaint(startPoint, endPoint,
((LinearGradientPaint)Background.background).getFractions(),
((LinearGradientPaint)Background.background).getColors());

}

for (int a = 0; a < PlayerUnit.weapon.bullets.length; a++)
{
if (PlayerUnit.weapon.bullets[a] != null)
{
if (PlayerUnit.weapon instanceof Pistol &&
((Ellipse2D.Float)PlayerUnit.weapon.bullets[a]).x + ((Pistol)PlayerUnit.weapon).bulletWidth >= 0 &&
((Ellipse2D.Float)PlayerUnit.weapon.bullets[a]).x <= CannonShooterModel.gamePanel.getSize().width &&
((Ellipse2D.Float)PlayerUnit.weapon.bullets[a]).y + ((Pistol)PlayerUnit.weapon).bulletWidth >= 0)
{
if (PlayerUnit.weapon.weaponAngles[a] >= 0)
((Ellipse2D.Float)PlayerUnit.weapon.bullets[a]).x +=
PlayerUnit.weapon.bulletSpeed * Math.cos(PlayerUnit.weapon.weaponAngles[a]);
else
((Ellipse2D.Float)PlayerUnit.weapon.bullets[a]).x -=
PlayerUnit.weapon.bulletSpeed * Math.cos(PlayerUnit.weapon.weaponAngles[a]);

if (PlayerUnit.weapon.weaponAngles[a] >= 0)
((Ellipse2D.Float)PlayerUnit.weapon.bullets[a]).y -=
PlayerUnit.weapon.bulletSpeed * Math.sin(PlayerUnit.weapon.weaponAngles[a]);
else
((Ellipse2D.Float)PlayerUnit.weapon.bullets[a]).y +=
PlayerUnit.weapon.bulletSpeed * Math.sin(PlayerUnit.weapon.weaponAngles[a]);
}
else
PlayerUnit.weapon.bullets[a] = null;
}
}

//System.out.println(Background.backgroundShape.y);

repaint();

try
{
Thread.sleep(1000 / 60);
}
catch (InterruptedException ex)
{
}
}
}
});

Background、PlayerUnit 和 CannonShooterModel 类对我的游戏模型很重要。这是一款直立射击游戏,应该设计有各种武器和敌人。

我的这个彩虹渐变使用了八个不同 Color 对象的数组。对于通过的每一帧,我根据需要更改渐变绘制所需的两个 Point2D.Float 对象的 y 坐标。为了使动画正常工作,我必须使用前一个对象的一些先前属性再次实例化 LinearGradientPaint 的另一个对象,并由 Paint 类型的变量背景引用它。

问题是,LinearGradientPaint 没有可以在两个端点上进行平移的方法,并且 get 方法不会返回 LinearGradientPaint 对象包含的实际对象。 (我的意思是,get 方法返回一个新的 Point2D 对象,其值与 LinearGradientPaint 对象的那些部分相同。)

对于传递的每一帧,我不仅必须更改与渐变关联的形状的 y 坐标属性,还要设置再次实例化 LinearGradientPaint 所需的两个 Point2D 对象的位置。

我很想简单地重新解释这一点,因为我可能在一些英语知识方面遇到困难,即使这是我的主要语言。如果您需要重新解释,请告诉我。

最佳答案

您可以尝试几种解决方案。

您可以创建一个 BufferedImage ,而不是填充整个可绘制区域,其宽度为 1 像素,高度等于您要填充的区域(假设您正在填充垂直)。然后,您可以将 LinearGradientPaint 应用于此 BufferedImageGraphics2D 并填充它(不要忘记处理 Graphics 完成后的上下文)。

然后,您只需使用 Graphics#drawImage(Image, x, y, width, height, ImageObserver) 来实际绘制图像。一般来说,重新缩放图像似乎比使用 LinearGradientPaint 填充图像更快,尤其是当您认为只是水平拉伸(stretch)图像时。

另一种选择是生成一个基本的 BufferedImage,其中已应用了 LinearGradientPaint,您只需根据需要绘制此偏移即可。这可能需要您至少将其绘制两次才能将其“缝合”在一起......

关于JAVA背景动画(LinearGradientPaint),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21519250/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com