pygame学习(2) 位置移动

我们把所有的精灵单独写在一个sprites.py的文件中,在这个测试的项目中是一个Player类:

class Player(pg.sprite.Sprite):
    def __init__(self):
        pg.sprite.Sprite.__init__(self)
        self.image = pg.Surface((30,40))
        self.image.fill(GREEN)
        self.rect = self.image.get_rect()
        self.rect.center = (WIDTH/2 , HEIGHT/2)
        self.pos = vec(WIDTH/2,HEIGHT/2)
        self.vel = vec(0,0)
        self.acc = vec(0,0)

    def update(self):
        self.acc = vec(0,0)
        keys = pg.key.get_pressed()
        if keys[pg.K_LEFT]:
            self.acc.x = -PLAYER_ACC
        if keys[pg.K_RIGHT]:
            self.acc.x = PLAYER_ACC

        self.acc += self.vel * PLAYER_FRICTION
        self.vel += self.acc
        self.pos += self.vel + 0.5*self.acc +0.1*vec(self.vel.x**3,self.vel.y**3)
        self.rect.center = self.pos

  这里面我们使用了一个math中的vector来定义坐标内容,所以前面要声明一下:

vec = pg.math.Vector2

  我们希望能够让这个精灵类移动起来,pos中是我们玩家的真实坐标,vel则是速度,acc为加速度,这样一来我们就可以模拟出真实的物理移动。

  可以看到:

self.acc += self.vel * PLAYER_FRICTION

  加速度每次都要加上当前速度乘以一个阻力系数(负数-0.2),这里就可以实现当玩家松开移动的时候,玩家会逐渐减速然后停下来。这些系数、加速度一类的写死的数值都要放在我们的setting文件中统一管理。

  键盘按钮触发是写在update中的,通过pygame.key.get_pressed()来获取到玩家按的什么键位。

posted @ 2020-06-11 20:09  灰人  阅读(508)  评论(0)    收藏  举报