gpt4 book ai didi

java - 代号“一个动画麻烦”(也在纸牌演示中)?

转载 作者:可可西里 更新时间:2023-11-01 06:03:57 27 4
gpt4 key购买 nike

Codename One动画发生了什么?我使用了很多,自12月起,我的应用程序不再起作用。当我在六月离开东西时,一切都很好(至今已经一年多了)。

我的应用程序是草稿(跳棋)游戏,自2013年以来在应用程序商店中可用。在看到CN1 Poker演示后,我完全重写了GUI,因为我想将这些动画添加到我的应用程序中。现在发生的是,我突然使索引超出了绑定的异常范围。我将其缩小为以下情况:

cont.addComponent(comp);
...
...
cont.getComponent(0); <-- index out of bound exception: 0 out of 0

我相信我在6月已经使用过newVM = true,现在是默认设置。我试图通过添加一个来解决问题
cont.animateLayoutAndWait(100);

在addComponent调用之后。这样可以解决索引超出范围的异常的问题,但是现在该应用只是在短暂工作良好后的随机时刻崩溃。我曾尝试过,但一直找不到问题的根源。 CN1中的某些更改使我的代码不再起作用。 (另请参阅旧论坛,搜索“draughts”,我在其中发布了我的基本设计的完整列表。)

我研究了新的纸牌演示,该演示具有我所需的大多数动画功能。而且Solitaire的应用程序商店版本在我的所有iOS / Android设备上均可正常运行。一个较小的错误是可以拖动一组卡片,包括在拖动操作过程中朝下的一些卡片。同样,要拾取正确数量的卡也是非常困难的。拖动一组卡片也会在屏幕上留下一条白色痕迹,看起来不太好。这也发生在模拟器中。

作为实验,我重新设计了GUI布局以使其完全类似于Solitaire代码:两层按钮,唯一的区别是我使用GridLayout(10,10),其中Solitaire使用SolitaireLayout()。这是有效的,除了一件事:如果一个检查器向下移动板,则它可以正确地在其他检查器上方移动,但是如果一个检查器向上移动板,则它可以在其他检查器下移动。

我的代码如下所示:
Button pc = (Button)piecesCnt.getComponentAt(a1);
Button to = (Button)piecesCnt.getComponentAt(a2);

piecesCnt.removeComponent(pc);
piecesCnt.addComponent(a1, createPieceButton(Piece.EMPTY_PIECE, true));
piecesCnt.removeComponent(to);
piecesCnt.addComponent(a2, pc);

piecesCnt.animateLayoutAndWait(1000);

因此,似乎按钮总是按照其GridLayout顺序绘制,而我希望动画(移动)按钮将绘制在最后/顶部,就像纸牌中的移动卡片一样。

在SolitaireLayout和GridLayout中处理动画之间有区别吗?如果是这样,可以在动画逻辑中对此进行更改吗?否则,我必须添加一个额外的动画层和很多开销。

在Android上,动画(运动)无法正常运行。因此,我决定还使用当前的CN1版本(插件3.2.6,库2016-01-11)在我的设备上自行构建并测试纸牌演示。我将动画速度降低了10倍,以更好地了解发生了什么。在模拟器中,布局和动画效果很好,但是在我的iOS和Android设备上存在很多问题。

模拟器(Windows 7,NetBeans 8.0.2):
-我将字体图标替换为文本,因为它们丢失了。
-但是如何访问汉堡菜单?我看不到这三个点,甚至没有空格。
-有时可以拖动一组卡片,并取下一些朝下的卡片;拖动时,它们会暂时朝上翻转。
-自动播放似乎并不总是有效。 (并非所有动作都被播放。)

在iOS 9.2(iPad 4),iOS 8.4(iPhone 4)上:
-[?]显示在汉堡菜单复选框中。
-启动后,Tableau背景卡片的背面会跳到容器/屏幕的底部。
-有时,在从甲板交易中,最右边画面中的卡片暂时朝上,而已经朝上的卡片朝下翻转。但是,最终的交易状态是正确的。
-撤消/重做:有时会导致卡组0上的卡朝上,而卡组1上的卡朝下。
-重做有时会“跳转”到新布局,而不是动画。
仅iPhone:
-一系列自动游戏动作会导致基础状态不一致:顶牌Heart-J,club-10,club-K,diamond-Q;即,在不同基础堆栈上的2张俱乐部卡。

在Android 5.1.1(Nexus 7)上,存在更多问题。
-从甲板上进行交易的动画效果不佳。卡被插入(滑到)桌面堆栈的底部,因此它们在其他卡下滑动。移动的纸牌应朝下,但通常朝上,始终显示发给工作台1的第一张纸牌。最右边工作台中的纸牌暂时朝上。最后,将已经面朝上的卡片朝下翻转,然后再向后翻转。但是,最终的交易状态是正确的。
-连续进行多次移动时,自动播放也不正确。在动画期间,几张朝上的基础卡会暂时更改其卡值(正面)。另外,移动卡也会在基础卡下方滑动(有时会滑过,但这是例外)。
-游戏结束后,做得好的屏幕被破坏了,因为文本似乎没有重叠显示,而是在纸牌下方(在较大的空白区域)显示,这些文字仅在屏幕顶部的一小部分可见。
-开始新游戏通常会失败,因为未开始从甲板上开始交易;屏幕显示平台和地基为空的地基上的四个国王。当点击卡座时,发一张牌并显示完成的顺序。有时重复此操作会成功启动新游戏。

所有这些已经花费了很多时间,而且我仍然没有使我的应用程序再次正常工作,这非常令人沮丧。即使使用已下载的演示应用程序,对于此主题也有很多麻烦,使用Codename One构建这种类型的应用程序感觉就像在流沙上构建。请帮忙!

最佳答案

一旦遇到麻烦,您应该只问过一个问题,而不是在工作上如此努力。是的,我们确实做了一些重大的兼容性突破性更改,作为针对长期存在的动画问题(其中并行运行的动画可能发生冲突)的错误修复的一部分。

这引入了一些冲突,但减少了设备/模拟器之间的不一致,这始终是一件好事。

我们在这里宣布:https://www.codenameone.com/blog/new-animation-manager.html

实际上,现在创建便携式动画要简单得多,因为所有内容都将同步以避免动画冲突,例如如果在动画进行过程中执行Component.removeComponent(),则会将其隐式添加到动画队列中,并在动画完成后立即执行,而不是立即执行。

要将下一个动作推迟到动画结束后:

form.getAnimationManager().flushAnimation(() -> doThisAfterAnimation());

简单得多,没有特殊情况的全局锁。

直接将代码“移植”到新方法上有点困难,但是看起来您的动画逻辑依赖于动画花费1000毫秒,并且当方法返回时它完全完成了,而情况并非总是如此(例如添加/删除调用或其他逻辑可能会成为障碍)。

过去,确保动画完整的唯一方法是将它们分开,但是现在您可以使用 flushAnimation来确保所有动画都已完成。请记住,某些不是动画的东西现在可以偶然变成动画,例如如果调用它们时正在进行动画,则添加/删除组件将变为动画。

关于java - 代号“一个动画麻烦”(也在纸牌演示中)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34743873/

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