2015-04-01 104 views
0

这是一个拼图般的益智游戏。我希望它能在所有作品到位后直接进入下一个场景。因此,在每个“地图片”旁边都会显示它在适当位置的坐标。if语句的多个条件? (代码不起作用)

但是//出乎意料的惊喜//它不起作用:c甚至有可能把这么多条件放在第一位?

谢谢您的阅读C:(justABeginner)

if (map1.x== 259.45 && 
map1.y== 77.05 && 

map2.x== 368.3 && 
map2.y== 69.45 && 

map3.x== 445.30 && 
map3.y== 90.4 && 

map4.x== 288.5 && 
map4.y== 207.15 && 

map5.x== 325.75 && 
map5.y== 164.65 && 

map6.x== 436.20 && 
map6.y== 187.65) 

{ 
gotoAndStop (1, "Scene 3"); 
} 
+0

是的,你可以尽可能多的条件,只要你喜欢。但正如akmozo所说,这种情况非常具体。当map1的x值为259.44时会发生什么?确切地说,没有。 – DodgerThud 2015-04-01 05:58:25

+0

从技术上讲,你的'if'很好,但是你使用了很多非常精确的值,所以我不确定你会得到它的工作!相反,你可以尝试使用['hitTestObject()'](http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/display/DisplayObject.html#hitTestObject%28%29)和/或['hitArea()'](http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/display/Sprite.html#hitArea)。 – akmozo 2015-04-01 06:01:17

+0

您也可以创建一个方法来验证所有这些条件(如果需要,还可以更多)并返回true或false。所以,你的if语句将会清晰易读。例如:if(verifyMapPositions()){gotoAndStop(1,“Scene3”); }。所以,在这个函数中,你可以添加和评论什么是必要的,并且容易理解是什么导致返回'false'并修复它。 – gabriel 2015-04-01 06:10:40

回答

0

代码看起来没什么问题。如果条件不能评估为真,那么它实际上可能是不同的值。在printf之类的If语句之前进行一个简单的调试步骤来检查这些值是否完全相同。

有时,精度将在这种If语句中发挥重要作用。

编码愉快:)

+0

很好的建议,但AS3/Flash不使用'printf'。它使用一个名为“trace(...)”的函数 – DodgerThud 2015-04-01 06:02:53

0

你可能会发现它不工作,因为它特别难以对齐亚像素精度的对象。因此,您可能需要考虑“地板”或“四舍五入”您的号码。我会建议地板,以避免它被四舍五入到下一个值。

if (Math.floor(map1.x) == 259 && Math.floor(map1.y) == 77 && 
    Math.floor(map2.x) == 368 && Math.floor(map2.y) == 69 && 
    Math.floor(map3.x) == 445 && Math.floor(map3.y) == 90 && 
    Math.floor(map4.x) == 288 && Math.floor(map4.y) == 207 && 
    Math.floor(map5.x) == 325 && Math.floor(map5.y) == 164 && 
    Math.floor(map6.x) == 436 && Math.floor(map6.y) == 187) 
{ 
    gotoAndStop (1, "Scene 3"); 
} 

做这样的事情会给你一个更“模糊”的比较,应该更容易排列拼图块。此外,你可能要考虑可能是通过增加一个帮助用户“捕捉到的地点”功能...

function inrange(targetX, targetY, mapX, mapY, strength) { 
    targetX -= (strength/2); 
    targetY -= (strength/2); 
    return (mapX >= targetX && mapX <= (targetX+strength) && 
     mapY >= targetY && mapY <= (targetY+strength)); 
} 

//snap map piece into place if within 3 pixels 
if (inrange(259, 77, map1.x, map1.y, 3)) { 
    map1.x = 259; 
    map1.y = 77; 
} 
0

作为建议的一般一块,你永远不应该有使用相等性检查(= =)浮点数。在某些时候,你会发现你不能相信0.5 + 0.2会等于0.7。它可能最终等于0.70000000001或0.6999999999999

正如其他人所提到的,尝试四舍五入你的数字,或者更好的办法是尝试一个小范围,在这个小范围内,这个小块被捕捉到位,比如说加或减10个像素?