我在上课时被抓到玩Slither。我的惩罚是用小基础来编程游戏。
我现在有一排球,如果第一个球滚过小点。这些点将消失,你将获得一分。检查大球是否在小点上的if语句是这样的:
If (foodX[x] - SnakeHeadX) < precision And (foodX[x] - SnakeHeadX) > -precision And (foodY[x] - SnakeHeadY) < precision And (foodY[x] - SnakeHeadY) > -precision Then
此if语句在for loop
中
For x = 1 To 500
所以我得到了我的分数,但当大球的x值和y值小于20时,我也得到了分数。这是不应该的。
这是场景(@是大球)
---------------------------------------------------------------------------------------------
|@ *
|
| *
| *
| * *
|
| *
---------------------------------------------------------------------------------------------
正如你所看到的,大球不会碰到小点。但我确实获得了分数。为什么它是真的?我该如何修复它?
听起来你正在努力管理命中率。两个形状相互作用的地方。此外,你的方法似乎是计算两个物体之间的距离,如果它低于阈值(你的精度变量),你就把它算作命中。
我有两个建议:
- 使用全程公式。您当前正在检查X和Y我认为这是造成你问题的原因
- 放弃距离而选择命中框。这需要一些非常Small Basic中的If语句很长且非常复杂,但它会更多的控制
样品:
'Distance from centers
distance = Math.SquareRoot(Math.Power(foodX[x] - SnakeHeadX,2) + Math.Power(foodY[x] - SnakeHeadY),2)
If distance < precision Then
'feed the snake
EndIf
'Hit boxes
If SnakeHeadX > foodX[x] And SnakeHeadX < foodX[x] And SnakeHeadY > foodY[x] And SnakeHeadY < foodY[x] Then 'top left corner of snake
If 'top right coner of the snake
' Repeat for all four corners of the snake
EndIf
endif
如果这无助于澄清你的问题。您提供的详细信息和示例代码越多越好。