pygame.ransform.rotate

Hier werden alle anderen GUI-Toolkits sowie Spezial-Toolkits wie Spiele-Engines behandelt.
BlackJack

Freitag 9. Mai 2008, 05:52

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!?
sechsrad
User
Beiträge: 173
Registriert: Montag 31. März 2008, 17:09

Freitag 9. Mai 2008, 10:42

müsste das surface beim drehen eines quadrates nicht grösser werden
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.

pygame nimmt hier einem die arbeit ab.
fred.reichbier
User
Beiträge: 155
Registriert: Freitag 29. Dezember 2006, 18:27

Freitag 9. Mai 2008, 16:05

bzw. erzeugt pygame.transform.rotate ein neues Surface-Objekt.

Übrigens, sicher, dass dein Code funktioniert?
self.image = self.images
bedeutet nämlich, dass self.image und self.images dasselbe Objekt sind.
sea-live
User
Beiträge: 440
Registriert: Montag 18. Februar 2008, 12:24
Wohnort: RP

Freitag 9. Mai 2008, 19:03

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()
sechsrad
User
Beiträge: 173
Registriert: Montag 31. März 2008, 17:09

Freitag 9. Mai 2008, 20:47

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.
sea-live
User
Beiträge: 440
Registriert: Montag 18. Februar 2008, 12:24
Wohnort: RP

Dienstag 20. Mai 2008, 16:07

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
BildBild

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()

Antworten