- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
所以基本上,我正在尝试编写一个 2d 骨骼动画编辑器以及一个框架,以便可以轻松地在游戏中使用在编辑器中创建的相同动画。最大的问题是我以前没有写过XML解析器,所以我有一种感觉我可能做错了什么,但我不确定它是什么。
这是我的格式的示例文件:
<skeleton name="skeleton1">
<bones>
<bone name="bone1" id="1" textureLoc="/imgs/test.png">
<position>x,y</position>
<rotation>float</rotation>
<scale>float</scale>
</bone>
<bone name="bone2" id="2" textureLoc="/imgs/text2.png">
<position>x,y</position>
<rotation>float</rotation>
<scale>float</scale>
</bone>
</bones>
<animation name="anim1">
<keyframe frameToPlay="1">
<bone id="1" transPosition="x,y" transRotation="float" transScale="float">
</bone>
<bone id="2" transPosition="x,y" transRotation="float" transScale="float">
</bone>
</keyframe>
<keyframe frameToPlay="50">
<bone id="1" transPosition="x,y" transRotation="float" transScale="float">
</bone>
<bone id="2" transPosition="x,y" transRotation="float" transScale="float">
</bone>
</keyframe>
</animation>
<animation name="anim2">
<keyframe frameToPlay="1">
<bone id="1" transPosition="x,y" transRotation="float" transScale="float">
</bone>
<bone id="2" transPosition="x,y" transRotation="float" transScale="float">
</bone>
</keyframe>
<keyframe frameToPlay="50">
<bone id="1" transPosition="x,y" transRotation="float" transScale="float">
</bone>
<bone id="2" transPosition="x,y" transRotation="float" transScale="float">
</bone>
</keyframe>
</animation>
</skeleton>
以下是我组织该系统的方式的描述,如果它使我的代码更容易理解:
AnimationSystem – Management interface for all animations in game, handles updating of each skeleton
--List of skeletons
---Skeletons represent each object
--Update method that updates each skeleton with the game’s current frame
Animation
--List of keyframes
--List of frames, in ascending order, pulled from the list of keyframes
---Order index in list corresponds to order index in list of keyframes
---Should help to speed things up a little bit, no need to search every keyframe to determine which one has a frame value matching the one that is currently needed.
---Will be determined by a set up method after assets are loaded, but before the animation can be used.
--Method to return a keyframe that corresponds to a frame passed to the method
Skeleton
--List of animations
--List of bones
--Value to hold the currently selected animation
--Value to hold the current frame in the game
--Value to hold the name of the skeleton
--Upon moving to a new frame, searches currently selected animation’s list of frames to see if a keyframe should be “played” this frame. If a keyframe exists that should be played at this frame, it should go through each bone in its list of bones, and set the properties of each bone to the properties listed in the keyframe according to the bone’s id.
Bone
--Value to hold the stationary position
--Value to hold the stationary rotation
--Value to hold the stationary scale
--Value to hold the transformed position
--Value to hold the transformed rotation
--Value to hold the transformed scale
--Image value that holds the texture of the bone
--Value to hold the id of the bone within its skeleton
--Value to hold the name of the bone (Used in the editor)
--Method that takes 3 values (position, rotation and scale in that order) and set’s its own transformed pos, rot and scale values to those passed in.
Keyframe
--List of scale values
--List of position values
--List of rotation values
--List of bone ids
---Index of bone id in list matches up to index in scale, position and rotation lists so that the properties can be associated with the bone
--Time value at which the keyframe will be played
--Method to return the scale value of a bone as determined by the bone id passed in
--Method to return the position value of a bone as determined by the bone id passed in
--Method to return the rotation value of a bone as determined by the bone id passed in
我为尝试解析此代码而编写的关联方法如下:
public static Skeleton parseSkeletonFile(String location) throws FileNotFoundException, IOException
{
try
{
Skeleton skelToReturn = null;
File fileToLoad = new File(location);
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(fileToLoad);
doc.getDocumentElement().normalize();
NodeList skelList = doc.getElementsByTagName("skeleton");
for (int counter = 0; counter < skelList.getLength(); counter++)
{
Node skelNode = skelList.item(counter);
Element skelElement = (Element)skelNode;
skelToReturn = new Skeleton(skelElement.getAttribute("name"));
NodeList allNodes = skelNode.getChildNodes();
for (int counter2 = 0; counter2 < allNodes.getLength(); counter2++)
{
Node currentNode = allNodes.item(counter2);
if (currentNode.getNodeName() == "bones")
{
NodeList bonesNL = currentNode.getChildNodes();
for (int counter3 = 0; counter3 < bonesNL.getLength(); counter3++)
{
Node currentBone = bonesNL.item(counter3);
Element currentBoneE = (Element)currentBone;
Bone bone = new Bone(
currentBoneE.getAttribute("name"),
new Point(
Float.valueOf(currentBoneE.getElementsByTagName("position").item(0).getTextContent().split(",")[0]),
Float.valueOf(currentBoneE.getElementsByTagName("position").item(0).getTextContent().split(",")[1])
),
Float.valueOf(currentBoneE.getElementsByTagName("rotation").item(0).getTextContent()),
Float.valueOf(currentBoneE.getElementsByTagName("scale").item(0).getTextContent()),
Integer.valueOf(currentBoneE.getAttribute("id"))
);
bone.setImage(new Image(currentBoneE.getAttribute("textureLoc")));
skelToReturn.bones.add(bone);
}
}
if (currentNode.getNodeName() == "animation")
{
NodeList animsNL = currentNode.getChildNodes();
for (int counter4 = 0; counter4 < animsNL.getLength(); counter4++)
{
Node currentAnim = animsNL.item(counter4);
Element currentAnimE = (Element)currentAnim;
Animation animation = new Animation(currentAnimE.getAttribute("name"));
NodeList keyframesNL = currentAnim.getChildNodes();
for (int counter5 = 0; counter5 < keyframesNL.getLength(); counter5++)
{
Node currentKeyframe = keyframesNL.item(counter5);
Element currentKeyframeE = (Element)currentKeyframe;
Keyframe keyframe = new Keyframe(Integer.valueOf(currentKeyframeE.getAttribute("frameToPlay")));
NodeList kfBonesNL = currentKeyframe.getChildNodes();
for (int counter6 = 0; counter6 < kfBonesNL.getLength(); counter6++)
{
Node currentBoneTrans = kfBonesNL.item(counter6);
Element currentBoneTransE = (Element)currentBoneTrans;
keyframe.boneIDs.add(Integer.valueOf(currentBoneTransE.getAttribute("id")));
keyframe.positions.add(new Point(Float.valueOf(currentBoneTransE.getAttribute("transPosition").split(",")[0]), Float.valueOf(currentBoneTransE.getAttribute("transPosition").split(",")[1])));
keyframe.rotations.add(Float.valueOf(currentBoneTransE.getAttribute("transRotation")));
keyframe.scales.add(Float.valueOf(currentBoneTransE.getAttribute("transScale")));
}
animation.keyframes.add(keyframe);
animation.frames.add(keyframe.getTimeToBePlayed());
}
skelToReturn.animations.add(animation);
skelToReturn.animationNames.add(animation.name);
}
}
}
}
if (skelToReturn != null)
return skelToReturn;
else
return null;
} catch (Exception e)
{
e.printStackTrace();
}
return null;
}
这是我用来测试解析器的代码片段:
AnimationSystem animator = new AnimationSystem();
try {
skeleton = animator.parseSkeletonFile(getClass().getResource("SkeletonTest.xml").getPath());
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if (skeleton != null)
{
System.out.println(skeleton.name);
}
这是在 Slick2D 中构建的一个简单游戏的 init 方法中。我尝试加载的文件 SkeletonTest.xml 与调用解析方法的类位于同一包中。其内容很简单:
<skeleton name="TestSkeleton">
</skeleton>
这是我收到的完整错误消息:
java.io.FileNotFoundException: D:\Eclipse%20Workspace\2dSkeletalAnimator\bin\org\jason\animatorTests\SkeletonTest.xml (The system cannot find the path specified)
at java.io.FileInputStream.open(Native Method)
at java.io.FileInputStream.<init>(Unknown Source)
at java.io.FileInputStream.<init>(Unknown Source)
at sun.net.www.protocol.file.FileURLConnection.connect(Unknown Source)
at sun.net.www.protocol.file.FileURLConnection.getInputStream(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.setupCurrentEntity(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLVersionDetector.determineDocVersion(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(Unknown Source)
at javax.xml.parsers.DocumentBuilder.parse(Unknown Source)
at org.jason.skeletalanimator.AnimationSystem.parseSkeletonFile(AnimationSystem.java:42)
at org.jason.animatorTests.AnimatorTest1.init(AnimatorTest1.java:32)
at org.newdawn.slick.AppGameContainer.setup(AppGameContainer.java:433)
at org.newdawn.slick.AppGameContainer.start(AppGameContainer.java:357)
at org.jason.animatorTests.AnimatorTest1.main(AnimatorTest1.java:65)
对于这个有点笼统的问题和所需的背景信息量感到抱歉,但我已经尝试了几乎所有方法来使其正常工作,而无需重写解析方法的主体。我宁愿不再经历那种困惑。所以我希望有更多从 XML 样式文件加载数据经验的人可以帮助我。我感谢提前给我一些时间的人。
最佳答案
一个问题是您试图从类路径条目中获取一个File
。 getPath()
方法返回文件 URL,而不是文件路径。然后,您尝试加载它,就好像它是文件路径一样,这会导致问题。
如果您使用getClass().getResourceAsStream()
,它会为您提供一个InputStream
,这会容易得多。
您可以将 InputStream
传递给您的 parseSkeleton
方法,然后更改为使用 DocumentBuilder#parse(InputStream),而不是传递 location
.
使用 InputStream
的另一个优点是,如果您将类打包在 JAR 文件中,您仍然可以加载资源(您将无法获取有效的 JAR 内的文件
路径)。或者您的骨架定义可以来自任何其他InputStream
,例如网络等
关于java - 尝试为我自己的 XML 样式文件格式编写解析器,但出现 FileNotFoundException,我有什么特别做错的地方吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14862739/
我一直在使用 AJAX 从我正在创建的网络服务中解析 JSON 数组时遇到问题。我的前端是一个简单的 ajax 和 jquery 组合,用于显示从我正在创建的网络服务返回的结果。 尽管知道我的数据库查
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
我在尝试运行 Android 应用程序时遇到问题并收到以下错误 java.lang.NoClassDefFoundError: com.parse.Parse 当我尝试运行该应用时。 最佳答案 在这
有什么办法可以防止etree在解析HTML内容时解析HTML实体吗? html = etree.HTML('&') html.find('.//body').text 这给了我 '&' 但我想
我有一个有点疯狂的例子,但对于那些 JavaScript 函数作用域专家来说,它看起来是一个很好的练习: (function (global) { // our module number one
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 8 年前。 Improve th
我需要编写一个脚本来获取链接并解析链接页面的 HTML 以提取标题和其他一些数据,例如可能是简短的描述,就像您链接到 Facebook 上的内容一样。 当用户向站点添加链接时将调用它,因此在客户端启动
在 VS Code 中本地开发时,包解析为 C:/Users//AppData/Local/Microsoft/TypeScript/3.5/node_modules/@types//index而不是
我在将 json 从 php 解析为 javascript 时遇到问题 这是我的示例代码: //function MethodAjax = function (wsFile, param) {
我在将 json 从 php 解析为 javascript 时遇到问题 这是我的示例代码: //function MethodAjax = function (wsFile, param) {
我被赋予了将一种语言“翻译”成另一种语言的工作。对于使用正则表达式的简单逐行方法来说,源代码过于灵活(复杂)。我在哪里可以了解更多关于词法分析和解析器的信息? 最佳答案 如果你想对这个主题产生“情绪化
您好,我在解析此文本时遇到问题 { { { {[system1];1;1;0.612509325}; {[system2];1;
我正在为 adobe after effects 在 extendscript 中编写一些代码,最终变成了 javascript。 我有一个数组,我想只搜索单词“assemble”并返回整个 jc3_
我有这段代码: $(document).ready(function() { // }); 问题:FB_RequireFeatures block 外部的代码先于其内部的代码执行。因此 who
背景: netcore项目中有些服务是在通过中间件来通信的,比如orleans组件。它里面服务和客户端会指定网关和端口,我们只需要开放客户端给外界,服务端关闭端口。相当于去掉host,这样省掉了些
1.首先贴上我试验成功的代码 复制代码 代码如下: protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
什么是 XML? XML 指可扩展标记语言(eXtensible Markup Language),标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。 你可以通过本站学习 X
【PHP代码】 复制代码 代码如下: $stmt = mssql_init('P__Global_Test', $conn) or die("initialize sto
在SQL查询分析器执行以下代码就可以了。 复制代码代码如下: declare @t varchar(255),@c varchar(255) declare table_cursor curs
前言 最近练习了一些前端算法题,现在做个总结,以下题目都是个人写法,并不是标准答案,如有错误欢迎指出,有对某道题有新的想法的友友也可以在评论区发表想法,互相学习🤭 题目 题目一: 二维数组中的
我是一名优秀的程序员,十分优秀!