私は私のpygameゲームで同じことをしました。やりたいことは、すべてのオブジェクトが使用する移動機能を作成することです。すべてと呼ばれるレンダリング更新グループ内のスプライトを通過できなくなります。スプライトがすべての一部でない場合、衝突しません。これが関数です。これにより、衝突に対して一定量の抵抗が生じます。基本的に、オブジェクトを押すと、一定量押し戻されます。move関数を呼ばないものは押しても動かないので、そもそも動けるものしか押すことができず、壁などは押しても板をすべりません。
def moveRelative(self,other,speed): #This function is a function the one you need uses, which you may find useful. It is designed to move towards or a way from another sprite. Other is the other sprite, speed is an integer, where a negative value specifies moving away from the sprite, which is how many pixels it will move away from the target. This returns coordinates for the move_ip function to move to or away from the sprite, as a tuple
dx = other.rect.x - self.rect.x
dy = other.rect.y - self.rect.y
if abs(dx) > abs(dy):
# other is farther away in x than in y
if dx > 0:
return (+speed,0)
else:
return (-speed,0)
else:
if dy > 0:
return (0,+speed)
else:
return (0,-speed)
def move(self,dx,dy):
screen.fill((COLOR),self.rect) #covers over the sprite's rectangle with the background color, a constant in the program
collisions = pygame.sprite.spritecollide(self, everything, False)
for other in collisions:
if other != self:
(awayDx,awayDy) = self.moveRelative(other,-1) #moves away from the object it is colliding with
dx = dx + 9*(awayDx) #the number 9 here represents the object's resistance. When you push on an object, it will push with a force of nine back. If you make it too low, players can walk right through other objects. If you make it too high, players will bounce back from other objects violently upon contact. In this, if a player moves in a direction faster than a speed of nine, they will push through the other object (or simply push the other object back if they are also in motion)
dy = dy + 9*(awayDy)
self.rect.move_ip(dx,dy) #this finally implements the movement, with the new calculations being used
これは一種の大量のコードであり、目的に応じて変更したい場合がありますが、これは非常に良い方法です。跳ね返り機能をなくしたい場合は、オブジェクトに向かう動きをゼロに設定し、オブジェクトから離れる動きのみを許可することを検討できます。ただし、私のゲームではバウンスバック機能が便利でより正確であることがわかりました。