Pygame - 使精灵朝着它所面对的方向移动 [英] Pygame - making a sprite move in the direction it is facing

查看:106
本文介绍了Pygame - 使精灵朝着它所面对的方向移动的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在制作一个自上而下的赛车游戏,我想让汽车在按下左右键时旋转(我已经完成了那部分),精灵的旋转以度数形式存储在变量中.我希望能够让它根据它所面对的方向的加速度移动.我可以自己弄清楚加速部分,它只是弄清楚那个方向上的像素到底是什么.谁能给我一些简单的代码来帮助我解决这个问题?

I'm making a top down car racing game and I want to make the car rotate when you press the left and right keys (I’ve already done that part), the sprite's rotation is stored in a variable as degrees. I'd like to be able to make it move according to acceleration in the direction it is facing. I can figure out the acceleration part myself, it's just figuring out what pixel exactly is in that direction. Can anyone give me some simple code to help with this?

以下是相关课程的内容:

Here are the contents of the class that are relevant:

def __init__(self, groups):
    super(Car, self).__init__(groups)
    self.originalImage = pygame.image.load(os.path.join("Data", "Images", "Car.png")) #TODO Make dynamic
    self.originalImage.set_colorkey((0,255,0))
    self.image = self.originalImage.copy() # The variable that is changed whenever the car is rotated.

    self.originalRect = self.originalImage.get_rect() # This rect is ONLY for width and height, the x and y NEVER change from 0!
    self.rect = self.originalRect.copy() # This is the rect used to represent the actual rect of the image, it is used for the x and y of the image that is blitted.

    self.velocity = 0 # Current velocity in pixels per second
    self.acceleration = 1 # Pixels per second (Also applies as so called deceleration AKA friction)
    self.topSpeed = 30 # Max speed in pixels per second
    self.rotation = 0 # In degrees
    self.turnRate = 5 # In degrees per second

    self.moving = 0 # If 1: moving forward, if 0: stopping, if -1: moving backward


    self.centerRect = None

def update(self, lastFrame):
    if self.rotation >= 360: self.rotation = 0
    elif self.rotation < 0: self.rotation += 360

    if self.rotation > 0:
        self.image = pygame.transform.rotate(self.originalImage.copy(), self.rotation)
        self.rect.size = self.image.get_rect().size
        self.center() # Attempt to center on the last used rect

    if self.moving == 1:
        self.velocity += self.acceleration #TODO make time based

    if self.velocity > self.topSpeed: self.velocity = self.topSpeed # Cap the velocity

推荐答案

三角:获取坐标的公式是:

# cos and sin require radians
x = cos(radians) * offset
y = sin(radians) * offset

您使用速度来抵消.(这意味着负速度将向后驱动).

You use velocity for offset. (This means a negative velocity will drive backwards).

所以:

def rad_to_offset(radians, offset): # insert better func name.
    x = cos(radians) * offset
    y = sin(radians) * offset
    return [x, y]

loop_update 类似于:

loop_update is something like:

# vel += accel
# pos += rad_to_offset( self.rotation, vel )

math.cos, math.sin:使用弧度,所以

将旋转存储为弧度更简单.如果您想将速度等定义为度数,您仍然可以.

math.cos, math.sin: uses radians, so

storing rotations as radians is simpler. If you want to define speed / etc as degrees, you still can.

# store radians, but define as degrees
car.rotation_accel = radians(45)
car.rotation_max_accel = radians(90)

这篇关于Pygame - 使精灵朝着它所面对的方向移动的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆