pygame.ransform.rotate
Was ist denn das für eine haarsträubende API!? Man kann nur um zwei Grad drehen, aber nicht bewegen wenn gedreht wird, wobei die "keine Drehung" durch alles ausser dem Wert 2 für die beiden "Drehargumente" angezeigt wird? Und je ein Argument für links und rechts drehen statt *einem* was dann halt auch negativ sein kann!?
ist bei pygame total überflüssig, weil es intern von pygame durchgeführt wird. wenn du mein viereck drehst und vorher die transparens ausgeschaltest, ist es beim drehen gut sichtbar, wie die hintergrundfläche angepasst wird.müsste das surface beim drehen eines quadrates nicht grösser werden
pygame nimmt hier einem die arbeit ab.
-
- User
- Beiträge: 155
- Registriert: Freitag 29. Dezember 2006, 18:27
bzw. erzeugt pygame.transform.rotate ein neues Surface-Objekt.
Übrigens, sicher, dass dein Code funktioniert?
Übrigens, sicher, dass dein Code funktioniert?
bedeutet nämlich, dass self.image und self.images dasselbe Objekt sind.self.image = self.images
es läuft einfach nicht move left right top bottem geht aber rotieren nicht
Code: Alles auswählen
import pygame
from pygame.locals import *
SCREENRECT = Rect(0, 0, 320, 240)
class Rechteck(pygame.sprite.Sprite):
speed = 5
angle = 90
def __init__(self):
pygame.sprite.Sprite.__init__(self,self.containers)
self.image = pygame.Surface([50,50])
self.image.fill([255,0,255])
self.original = pygame.Surface([50,50])
self.original.fill([255,0,255])
self.rect = self.image.get_rect(center=(160,120))
self.speed = 5
self.angle = 90
def update(self):
keystate = pygame.key.get_pressed()
moving_vertical = keystate[K_DOWN] - keystate[K_UP]
moving_horizontal = keystate[K_RIGHT] - keystate[K_LEFT]
rotate_left = keystate[K_DOWN] + keystate[K_LEFT]
rotate_right = keystate[K_DOWN] + keystate[K_RIGHT]
if moving_vertical and rotate_left != 2 and rotate_right != 2:
self.rect[1] += moving_vertical*self.speed
self.rect = self.rect.clamp(SCREENRECT)
if moving_horizontal and rotate_left != 2 and rotate_right != 2:
self.rect[0] += moving_horizontal*self.speed
self.rect = self.rect.clamp(SCREENRECT)
if rotate_left == 2:
self.oldCenter = self.rect.center
self.angle += 5
if self.angle == 180:
self.angle = 90
self.image = pygame.transform.rotate(self.original, self.angle)
self.rect = self.image.get_rect()
self.rect.center = self.oldCenter
if rotate_right == 2:
self.oldCenter = self.rect.center
self.angle -= 5
if self.angle == 0:
self.angle = 90
self.image = pygame.transform.rotate(self.original, self.angle)
self.rect = self.image.get_rect()
self.rect.center = self.oldCenter
def main():
pygame.init()
try:
os.environ['SDL_VIDEO_CENTERED'] = '1'
except:
pass
#pygame.display.set_icon(pygame.image.load(os.path.join('data', 'icones1.gif')))
pygame.display.set_caption('RECHTECK move')
pygame.mouse.set_visible(0)
screen = pygame.display.set_mode(SCREENRECT.size)
background = pygame.Surface(screen.get_size())
background.fill([255,255,0])
clock = pygame.time.Clock()
all = pygame.sprite.RenderUpdates()
Rechteck.containers = all
rechteck = Rechteck()
weiter = True
while weiter:
clock.tick(60)
event = pygame.event.poll()
if event.type == QUIT or \
(event.type == KEYDOWN and event.key == K_q):
break
if event.type == KEYDOWN and event.key == K_ESCAPE:
break
screen.blit(background, (0, 0))
all.draw(screen)
all.update()
pygame.display.flip()
pygame.time.wait(50)
pygame.quit()
if __name__ == '__main__': main()
wenn du dieses änderst: "if rotate_left == 2"
in : "if rotate_left " dann geht es und du siehst deutlich wie der hintergrund sich dem drehenden viereck anpasst bzw grösser und kleiner wird.
du musst dem surface noch einen andere farbe geben , damit sich dein viereck und das surface unterscheiden , du siehst ja nicht die drehung.
in : "if rotate_left " dann geht es und du siehst deutlich wie der hintergrund sich dem drehenden viereck anpasst bzw grösser und kleiner wird.
du musst dem surface noch einen andere farbe geben , damit sich dein viereck und das surface unterscheiden , du siehst ja nicht die drehung.
so ich hab das ganze mal animiert und in eine klasse gepackt
der Panzer springt noch etwas beim 90grad übergang
oder eine bessere idee
image
Panz.png Panza
der Panzer springt noch etwas beim 90grad übergang
oder eine bessere idee
image
Panz.png Panza
Code: Alles auswählen
import sys, os
import pygame
from pygame.locals import *
SCREENRECT = Rect(0, 0, 320, 240)
class Panzer(pygame.sprite.Sprite):
speed = 10
images = []
animcycle = 3
frame = 0
angle = 0
def __init__(self):
pygame.sprite.Sprite.__init__(self,self.containers)
self.images.append(pygame.image.load('Panz.png').convert_alpha())
self.images.append(pygame.image.load('Panza.png').convert_alpha())
self.original_a = pygame.image.load('Panz.png').convert_alpha()
self.original_b = pygame.image.load('Panza.png').convert_alpha()
self.image = self.images[0]
self.rect = self.image.get_rect(midleft=SCREENRECT.midleft)
self.rect = self.image.get_rect(center = (SCREENRECT.centerx,SCREENRECT.centery))
def move_vertical(self, moving_vertical):
self.rect.move_ip(0 ,moving_vertical*self.speed)
self.rect = self.rect.clamp(SCREENRECT)
self.frame += 1
self.imind = self.frame/self.animcycle%2
self.image = self.images[self.imind]
def move_horizontal(self, moving_horizontal):
self.rect.move_ip(moving_horizontal*self.speed, 0)
self.rect = self.rect.clamp(SCREENRECT)
def rotate(self,rotate_left,rotate_right):
center = self.rect.center
if rotate_left == 2:
self.angle += 5
if rotate_right == 2:
self.angle -= 5
if self.angle == 360 or self.angle == 0:angle = 0
self.images[0] = pygame.transform.rotate(self.original_a,self.angle)
self.images[1] = pygame.transform.rotate(self.original_b,self.angle)
self.rect = self.images[0].get_rect()
self.rect.center = center
def main():
pygame.init()
pygame.display.set_caption('Panzer move')
pygame.mouse.set_visible(0)
screen = pygame.display.set_mode(SCREENRECT.size)
background = pygame.Surface(screen.get_size())
background.fill([0,0,255])
clock = pygame.time.Clock()
all = pygame.sprite.RenderUpdates()
panzer = pygame.sprite.Group()
Panzer.containers = all
player = Panzer()
while True:
clock.tick(60)
all.clear(screen, background)
all.update()
event = pygame.event.poll()
if event.type == QUIT or \
(event.type == KEYDOWN and event.key == K_q):
break
if event.type == KEYDOWN and event.key == K_ESCAPE:
break
keystate = pygame.key.get_pressed()
moving_vertical = keystate[K_DOWN] - keystate[K_UP]
moving_horizontal = keystate[K_RIGHT] - keystate[K_LEFT]
rotate_left = keystate[K_DOWN] + keystate[K_UP]
rotate_right = keystate[K_RIGHT] + keystate[K_LEFT]
player.move_vertical(moving_vertical)
player.move_horizontal(moving_horizontal)
player.rotate(rotate_left,rotate_right)
screen.blit(background, (0, 0))
dirty = all.draw(screen)
pygame.display.update(dirty)
pygame.display.flip()
pygame.time.wait(50)
pygame.quit()
if __name__ == '__main__': main()