首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在没有延迟的情况下以非常快的速度递增sprite位置- Python

在没有延迟的情况下以非常快的速度递增sprite位置- Python
EN

Stack Overflow用户
提问于 2012-07-30 17:32:36
回答 3查看 481关注 0票数 2

我正在使用Python中的Kivy为一个学校项目制作一个乒乓球游戏。到目前为止,多亏了这个论坛,我已经为NPC划桨做了一些人工智能。代码如下:

代码语言:javascript
复制
    if self.ball.y < self.player2.center_y:
        self.player2.center_y = self.player2.center_y - 4
    if self.ball.y > self.player2.center_y:
        self.player2.center_y = self.player2.center_y + 4

这是在名为ArtificialIntelligence()的PongGame()类的方法中。

我用这个来称呼它:

代码语言:javascript
复制
Clock.schedule_interval(game.ArtificialIntelligence, 1/300)     

这允许我每隔1/300秒调用它一次。但是,任何超过1/300的值,我似乎都没有区别。也就是说,1/9001不会每1/9001秒调用它一次。

它的工作方式是将y坐标相对于球的位置增加4个像素,并且每隔1/300秒这样做一次,因此它不会以这个速度“滞后”。对于玩家来说,这基本上是一种“简单”的模式。如果我想做一个“硬”模式,我需要让NPC更准确。我可以这样做

代码语言:javascript
复制
self.player2.center_y = self.player2.center_y + 20

就像这样。这是非常准确的。然而,它看起来并不“流畅”,它看起来“滞后”。我假设我可以通过更频繁地调用该方法来获得相同的移动量,而不是通过改变像素移动来改变它的移动量。然而,我不知道如何做到这一点,因为,正如我所说的,从高于1/300的任何位置更改它似乎没有什么不同。

这就是我如何使用我的球拍:

代码语言:javascript
复制
if touch.x < self.width/3:
    self.player1.center_y = touch.y

我可以随心所欲地移动它,因为它会随着我移动鼠标而更新。而且它看起来很流畅,因为它需要更新就更新一次。我不知道如何用我的人工智能来做这件事。

有没有人知道我怎么才能让NPC的划桨更准确,让我做简单-正常-困难等等,同时保持流畅性和没有滞后?我认为只有一种方法可以做到这一点:增加方法的调用数量。

然而,我打赌一定有更好的方法,但我不知道该怎么做。有人知道我是怎么做到的吗?谢谢。

编辑:看起来我可以这样做:

代码语言:javascript
复制
Clock.schedule_interval(game.ArtificialIntelligence, 1/300)     
Clock.schedule_interval(game.ArtificialIntelligence, 1/300) 
Clock.schedule_interval(game.ArtificialIntelligence, 1/300) 
Clock.schedule_interval(game.ArtificialIntelligence, 1/300)         
Clock.schedule_interval(game.ArtificialIntelligence, 1/300) 

但这看起来真的很丑陋,效率也很低。我更喜欢更干净的方式。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-07-30 19:01:11

在每秒300帧的速度下,问题不在于更新速度,因为您的人眼感知运动的能力超出了50倍或更多。

之所以会出现急速运动,是因为球是沿着线性轨迹运动的,而你的球拍只是跳到球现在所在的位置。理想情况下,你的电脑玩家可以计算出当球击中电脑球拍的平面时球将在哪里,然后以每秒30帧或更少的速度非常平滑地到达该位置。当然,预测数学需要少量的三角运算,但从某种意义上说,这是一种“正确”的方法,那就是一个好的玩家会如何玩,通过预测。

仅仅增加计算机的控制板的大小会容易得多,这也会给人类玩家一个视觉上的指示,让他们知道游戏到底有多难。当电脑的棋盘变成一堵墙时,玩家会发现没有什么可赢的了。更大的球拍会有一个副作用,那就是不那么抖动,但这是否是一个“好”的方法取决于你的决定。

票数 1
EN

Stack Overflow用户

发布于 2012-07-30 21:08:50

我的建议是使用trig来计算出球将在哪里,并让球拍移动到那里来拦截它。

动画将在每秒30帧时平滑。

当制作一款游戏时,AI现在非常重要,玩家看不到它的“作弊”,给它一个更大的桨,或者传送的能力,将是这一点的明显迹象。它应该以与人类相同的方式玩,只是更好-而不是使用玩家无法访问的某种机制。“这个游戏很烂,因为CPU作弊”是视频游戏论坛上非常常见的负面评论。

编辑:例如:如果随机(X) <=球的速度,则正确拦截,否则以随机(Y)为单位未命中。

票数 1
EN

Stack Overflow用户

发布于 2012-07-31 12:24:29

谢谢你们的帮助,在你们的帮助和他的帮助下,我和我的老师一起解决了这个问题。

他开发了这个算法(他做得太快了,我真的不能理解它!)但这实际上是使用trig来生成桨的位置(注意,我没有使用角度,因为我有其他可以使用的值)

代码语言:javascript
复制
def AIController(self, *args):      
    ballsFuturePos = self.ball.center_y + ((self.width - self.ball.center_x) / self.ball.velocity_x) * self.ball.velocity_y
    numIterations = ((self.width - self.ball.center_x) / self.ball.velocity_x)
    #print ballsFuturePos
    #print numIterations
    if numIterations > 0:
        self.wantedPos = self.player2.center_y +(ballsFuturePos - self.player2.center_y) / numIterations        
        #print wantedPos
        #self.player2.center_y = wantedPos + (error / wantedPos) * 100


    if self.player2.center_y < self.wantedPos:
        self.player2.center_y = self.player2.center_y + 9
    if self.player2.center_y > self.wantedPos:
        self.player2.center_y = self.player2.center_y - 9

所以我通过得到球的y位置,加上(width -球的x位置)(它给出了离屏幕最右边的x像素有多远),然后我用x速度除以x速度,再用y速度乘以整个东西,得到了斜率(我想),所以现在斜率计算出来了,它也意味着它有轨迹,因此可以预测球将击中屏幕的位置。

我计算了到达球所需的迭代次数,方法是将屏幕的宽度减去球的x位置,这将计算出距离屏幕最右侧有多远,然后除以速度。这给了我一个可以用来迭代的数字。

现在我使用这个进行迭代,并创建一个名为wantedPos的变量,这是我希望我的划板所在的位置。随着每次调用中numIterations的减少,wantedPos也会减少,这意味着差距会变小。然后,我使用9作为速度来迭代靠近球的球拍,这允许我增加或减少难度。

谢谢。如果我在描述他的行为时弄错了逻辑,请告诉我!我想我理解它,但确认一下会更好:)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11718743

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档