there were 3 problems with the thing above
---
the major problem was that sin & cos work in a space where +y is up,
pygame in a space where +y is down
a minor problem was that the four corners will never be visible at all
(think about the surface rotate produces - the bounds go through the
four corners of the rotated image)
a problem that actually isn't a problem (once it was tiling okay) was
that it kept drawing over itself (rotsurf.blit(rotsruf))
also as a note, you can tile a rotated image on a rotated grid (as
this code demonstrates) but their are complexities with filtering (as
I mentioned earlier)
but if you want to make a rectangular tile that tiles on a rectangular
grid from your rotated image, then that is more complicated (unless
the rotation is 45 and the original image square - which is what Aaron
was talking about), but I would guess it can be done, but may result
in a disgustingly large tile (you'd have to keep tiling the image on
the rotated grid until the edge lines line up and cut a rect at that
point)
anyways, here's the corrected code
----
import pygame
import math
filename=r"MockUpMemory.png"
SCREENWIDTH = 800
SCREENHEIGHT = 600
def Rotated(surf, degrees = 0):
# rotate surface
print 'Rotated ', degrees, ' degrees.'
rotsurf = pygame.transform.rotate(surf, degrees)
# compute the offsets needed
c = math.cos(math.radians(degrees))
s = math.sin(math.radians(degrees))
widthx = (surf.get_width() - 1) * c
widthy = (surf.get_width() - 1) * s
heightx = (surf.get_height() - 1) * s
heighty = (surf.get_height() - 1) * c
# the 8 positions, corners first
positions = [
# (widthx + heightx, widthy + heighty),
# (widthx - heightx, widthy - heighty),
# (-widthx + heightx, -widthy + heighty),
# (-widthx - heightx, -widthy - heighty),
# (widthx, widthy),
(widthx, -widthy),
# (-widthx, -widthy),
(-widthx, widthy),
# (heightx, heighty),
(heightx, heighty),
# (-heightx, -heighty),
(-heightx, -heighty),
]
rot_copy = rotsurf.copy()
# apply the blits
for pos in positions:
rotsurf.blit(rot_copy, pos)
return rotsurf
def main():
pygame.init()
bg = pygame.display.set_mode((SCREENWIDTH, SCREENHEIGHT), 0, 32)
quit = 0
pic = pygame.image.load(filename).convert_alpha()
pic2 = pic
while not quit:
bg.fill((255, 0, 0, 255))
bg.blit(pic2, (0, 0))
pygame.display.flip()
for e in pygame.event.get():
if e.type == pygame.QUIT:
quit = 1
break
elif e.type == pygame.MOUSEMOTION:
pic2 = Rotated(pic, e.pos[0])
pygame.quit()
main()