Oops. I realize I missed the line where you are updating self.rect after
calling transform. I shouldn't have put it in there again. The bit I posted
from the update method should only have read:

                #move the car
                self.x += speedx
                self.y += speedy

                #rotate the car
                self.sprite = pygame.transform.rotate(self.original,
self.angle * -1)
                self.rect = self.sprite.get_rect(center = (self.x, self.y))

Sorry for the confusion!

-Christopher

On Tue, Aug 30, 2011 at 10:22 AM, Christopher Night
<[email protected]>wrote:

> Three things you can do to make this more realistic.
>
> 1. use self.angle as the argument to pygame.transform.rotate instead of
> a_deg, as Joe suggested.
>
> 2. use separate variables to keep the car's position. Don't store it in
> self.rect.center. This is because rect positions are coerced to ints, so if
> your car should be moving 0.5 pixels per frame to the right, this will be
> rounded down to 0.
>
> 3. update self.rect after you transform. This is because the rotated image
> doesn't have the same size as the original image, so its center will be
> offset. Also, your second argument to screen.blit should be self.rect, not
> self.rect.center. (If you pass it a position like self.rect.center, it will
> use that as the upper-left position of the blitted rect.
>
> I modified your file to have this in your init method:
>
>                 self.x, self.y = SCREEN_SIZE_X/2, SCREEN_SIZE_Y -
> self.rect.height * 2
>
> this in your update:
>
>                 #rotate the car
>                 self.sprite = pygame.transform.rotate(self.original,
> self.angle * -1)
>                 self.rect = self.sprite.get_rect(center = self.rect.center)
>
>
>                 #move the car
>                 self.x += speedx
>                 self.y += speedy
>
>                 self.rect = self.sprite.get_rect()
>                 self.rect.center = self.x, self.y
>
> and this in your draw:
>
>                 screen.blit(self.sprite, self.rect)
>
> And it looked much better to me. Let me know what you think.
>
> -Christopher
>
>
> On Tue, Aug 30, 2011 at 5:46 AM, Nathan BIAGINI <[email protected]>wrote:
>
>> Hi,
>>
>> i'm trying to write a car game and i have decided to start by the movement
>> part. I calculate the X and Y components of the car and update his position
>> by increasing the current one with the two new components. The two
>> components depend of the orientation of the car, managed by the right and
>> left arrow :
>>
>>
>> speedx = math.sin(self.angle * (math.pi/180)) * SPEED
>>> speedy = math.cos(self.angle * (math.pi/180)) * SPEED * -1
>>>
>>
>> Where SPEED is a constant and self.angle a int representing the
>> orientation. I don't know if this is the best way because, the car speed
>> depends of his orientation. Increasing the self.angle value will increase
>> the components, this is not suitable for a car game i think.
>>
>> I have another problem with the car movement. Each time the orientation
>> change, i would like to rotate the car in the right direction. I thought to
>> do something like that :
>>
>> a_rad = math.asin(speedx/SPEED)
>>> a_deg = math.degrees(a_rad)
>>
>> self.sprite = pygame.transform.rotate(self.original, a_deg * -1)
>>> self.rect = self.sprite.get_rect(center = self.rect.center)
>>>
>>
>> It does not work properly, this way, my car can't rotate over 90° because
>> of the speedx values.
>>
>> Here is my code :
>>
>> http://pastebin.com/VJgQRtYq
>>
>> and the sprite i use for the car is joined.
>>
>> Thanks for reading me.
>>
>
>

Reply via email to