<p>在评估碰撞之前,更改玩家的位置。
如果播放器发生冲突,则必须更新<code>self.rect</code>,并且必须将<code>self.pos</code>同步到<code>self.rect.center</code>。对于Instance:</p>
<pre class="lang-py prettyprint-override"><code>if self.val.x > 0:
self.rect.right=wall.rect.left
self.vel.x=0
self.pos = vec(self.rect.center)
</code></pre>
<p>通过测试玩家是否会与墙相交(如果他位于下方1个像素处),评估玩家是否停留在地面上:</p>
<pre class="lang-py prettyprint-override"><code>test_rect = pygame.Rect(self.rect.x, self.rect.y+1, self.rect.width, self.rect.height)
if test_rect.colliderect(wall.rect):
on_ground = True
</code></pre>
<p>根据状态设置y方向上的加速度<code>on_ground</code>:</p>
<pre class="lang-py prettyprint-override"><code>if on_ground:
self.acc.y = 0
elif self.acc.y == 0:
self.acc.y = 0.5
</code></pre>
<p>方法<code>update</code>:</p>
<pre class="lang-py prettyprint-override"><code>class player(pygame.sprite.Sprite):
# [...]
def update(self):
user_input=pygame.key.get_pressed()
self.acc.x = 0
if user_input[pygame.K_d]:
self.acc.x=player_acc
if user_input[pygame.K_a]:
self.acc.x=-player_acc
self.vel.x = self.vel.x * 0.95 + self.acc.x
self.vel.y += self.acc.y
self.pos += self.vel
self.rect.center = self.pos
on_ground = False
for wall in walls:
if self.rect.colliderect(wall.rect)==True:
if self.vel.x > 0:
self.rect.right=wall.rect.left
self.vel.x=0
self.pos = vec(self.rect.center)
if self.vel.x < 0:
self.rect.left=wall.rect.right
self.vel.x=0
self.pos = vec(self.rect.center)
if self.vel.y > 0:
self.rect.bottom=wall.rect.top
self.vel.y=0
self.pos = vec(self.rect.center)
if self.vel.y < 0:
self.rect.top=wall.rect.bottom
self.vel.y=0
self.pos = vec(self.rect.center)
test_rect = pygame.Rect(self.rect.x, self.rect.y+1, self.rect.width, self.rect.height)
if test_rect.colliderect(wall.rect):
on_ground = True
if on_ground:
self.acc.y = 0
elif self.acc.y == 0:
self.acc.y = 0.5
</code></pre>