Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 当一个对象与另一个对象碰撞时从矩阵中减去值_Python_Arrays_Matrix_Pygame - Fatal编程技术网

Python 当一个对象与另一个对象碰撞时从矩阵中减去值

Python 当一个对象与另一个对象碰撞时从矩阵中减去值,python,arrays,matrix,pygame,Python,Arrays,Matrix,Pygame,现在,我有一个类可以创建网格,将对象与网格对齐,然后当对象在网格上移动时,它计算对象与特定单元重叠的次数 我的目标是,不是计算重叠的数量,而是从N值中减去重叠的数量。例如,当hitGrid中的值为10时,程序将从10中减去,并在hitGrid为0时结束,而不是结束程序 这是我的密码: 宽度、高度、边距=10,10,1 对象=[[1]] 类GridObject(pg.sprite.sprite): 定义初始化(自身、位置、网格、*组): 超级()。\uuuu初始化\uuuuu(组) #从网格创建图

现在,我有一个类可以创建网格,将对象与网格对齐,然后当对象在网格上移动时,它计算对象与特定单元重叠的次数

我的目标是,不是计算重叠的数量,而是从N值中减去重叠的数量。例如,当hitGrid中的值为10时,程序将从10中减去,并在hitGrid为0时结束,而不是结束程序

这是我的密码:

宽度、高度、边距=10,10,1
对象=[[1]]
类GridObject(pg.sprite.sprite):
定义初始化(自身、位置、网格、*组):
超级()。\uuuu初始化\uuuuu(组)
#从网格创建图像
self.grid=grid
self.gridsize=(len(网格[0]),len(网格))
imgsize=self.gridsize[0]*(宽度+边距),self.gridsize[1]*(高度+边距)
self.image=pg.Surface(imgsize,flags=pg.SRCALPHA)
self.image.fill((0,0,0,0))
颜色=黑色
对于范围内的c(self.gridsize[0]):
对于范围内的r(self.gridsize[1]):
如果自网格[r][c]==1:
矩形=[(边距+宽度)*c+边距,(边距+高度)*r+边距,宽度,高度]
pg.draw.rect(self.image,col,rect)
self.rect=self.image.get_rect(中心=pos)
self.vel=pg.math.Vector2(8,0).旋转(随机范围(360))
self.pos=pg.math.Vector2(pos)
def更新(self、boundrect、hitGrid、hitList):
self.pos+=self.vel
self.rect.center=self.pos
如果self.rect.left=boundrect.right:
自我等级x*=-1
如果self.rect.top=boundrect.bottom:
自我水平y*=-1
#将矩形与网格对齐
gridpos=圆形(自校正x/(宽度+边距)),圆形(自校正y/(高度+边距))
self.rect.topleft=gridpos[0]*(宽度+边距),gridpos[1]*(高度+边距)
#增量接触填充
全球最大命中率
最大命中率=0
oldHitList=hitList[:]
hitList.clear()
对于范围内的c(self.gridsize[0]):
对于范围内的r(self.gridsize[1]):
p=gridpos[1]+r,gridpos[0]+c
如果oldHitList中有p:
hitList.append(p)
elif自网格[r][c]==1:
如果p[0]
这里并不完全清楚您的意图是什么,因为上面的代码在一些方面是不完整的。。。也就是说,你应该考虑一些策略。现在,您正在尝试计算的代码块将获得“年度丑陋代码块”奖,所以我们需要做点什么

有几件事需要考虑

  • 您希望如何处理对象在多个时间步长内保持在同一网格正方形中的情况?也许您需要跟踪“最后一个网格方块”,并且只在发生更改时进行更新
  • 在伪代码中

    old_gridpos = None  <- set at start of game
    
    # compute new pos in update()
    if current_gridpos != old_gridpos:
        check for grid square usage (see below)
        old_gridpos = current_gridpos
        
    

    您可以创建一个类似的函数,并在计算完
    gridpos

    之后,从
    update
    函数调用它。您能举一个Numpy的例子吗?我想看看会是什么样子。这似乎很有趣
    In [12]: grid_count = {}                                                        
    
    In [13]: max_hits = 3                                                           
    
    In [14]: def check_max_hits(position): 
        ...:     grid_count[position] = grid_count.get(position, 0) + 1 
        ...:     if grid_count[position] >= max_hits: 
        ...:         return True 
        ...:     return False 
        ...:      
        ...:                                                                        
    
    In [15]: check_max_hits((1,2))                                                  
    Out[15]: False
    
    In [16]: check_max_hits((2,4))                                                  
    Out[16]: False
    
    In [17]: check_max_hits((1,2))                                                  
    Out[17]: False
    
    In [18]: grid_count                                                             
    Out[18]: {(1, 2): 2, (2, 4): 1}
    
    In [19]: check_max_hits((1,2))                                                  
    Out[19]: True