5

私は基本的に、pygame を使用して「ソリッド」オブジェクトを作成しようとしています。目標は、プレイヤーが接触したときにプレイヤーを撃退することです。私が現在使用しているもの(ただし、正しく動作しません)は次のとおりです。

keys_pressed = pygame.key.get_pressed()
if 1 in keys_pressed:
    if keys_pressed[K_w]:
        self.player_l[1] += -2
        if self.player_r.colliderect(self.tower_r): self.player_l[1] -= -2
    if keys_pressed[K_a]:
        self.player_l[0] += -2
        if self.player_r.colliderect(self.tower_r): self.player_l[0] -= -2
    if keys_pressed[K_s]:
        self.player_l[1] += 2
        if self.player_r.colliderect(self.tower_r): self.player_l[1] -= 2
    if keys_pressed[K_d]:
        self.player_l[0] += 2
        if self.player_r.colliderect(self.tower_r): self.player_l[0] -= 2

これの問題は、衝突が開始される前の場所に戻ったにもかかわらず、プレイヤーがタワーの Rect 内で「立ち往生」し、プレイヤーの Rect が常にタワーに引き戻され、衝突が継続することです。引き金。最初にタワーの Rect に触れた後、プレイヤーはどの方向にも移動できなくなります。

4

1 に答える 1

3

私は私の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

これは一種の大量のコードであり、目的に応じて変更したい場合がありますが、これは非常に良い方法です。跳ね返り機能をなくしたい場合は、オブジェクトに向かう動きをゼロに設定し、オブジェクトから離れる動きのみを許可することを検討できます。ただし、私のゲームではバウンスバック機能が便利でより正確であることがわかりました。

于 2013-11-23T04:50:00.983 に答える