Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Caphoras

Frischling

  • »Caphoras« ist der Autor dieses Themas

Beiträge: 23

Wohnort: Kaiserslautern

Beruf: Praktikant

  • Private Nachricht senden

1

28.02.2013, 14:07

Rotation von Bildern

Hey leute ich brauch dringends eure hilfe Ich häng da schon ne weile dran und find einfach keine Lösung:

Folgendes Problem Ich mach ein Atari clon Asteroids und naja Ich bin auch Ziemlich weit nur hab ich einfach keien Lösung für die Rotation von Bildern gefunden Ich komm auch unter http://www.pygame.org/docs/ref/transform…ransform.rotate nicht wirklich zu einem Sinvollen weg das zu Implementiern.

Im Grunde habe Ich folgenden vorgang:

ShipClass hat eine Methode Draw & Update in welcher das Schiff angezeigt wird.
hier kurz zu sehn im ersten screenshot


In der Hauptschleife des Spiels wird die aufgerufen ( My_Ship.Draw) und somit gewährleistet das es auch permanent aufm Screen bleibt.
Dort befinden sich auch die Eventhandler für Tasteneingaben und wenn Ich nun den Linken Arrow Key drücke sollte das schiff nach links beim rechten nach rechts Schwenken.
Sobald ich die Tasten los lasse soll die beschleunigung wieder = 0 (d.h. solang gedrückt ist dreht das schiff mit ner bestimmten schwenk geschwindigkeit)

soweit die Theorie.

in der Praxis schaut das wie folgt aus:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
Shipclass:
    .....
    def update(self):
        ....
        # update angle
        self.angle += self.angle_vel
        #apply the angle to the images with the method rotate
        self.unthrust_image = self.rotate(self.unthrust_image,self.angle)
        self.thrust_image = self.rotate(self.thrust_image,self.angle)


jetzt kommt aber das lustige nämlich die Rotations Funktion und da hab ich schon etliches ausprobiert >.>:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 def rotate(self,image,angle):
        '''should rotate the image'''
        rect = image.get_rect()
        angle = angle
        original_image = image
        
        old_self_rect_center = rect.center
        old_image_rect_center = image.get_rect().center
        rotated_image =  pygame.transform.rotate(original_image,angle)
        new_image_rect_center = rotated_image.get_rect().center
        rect.center = (old_self_rect_center[0] + (old_image_rect_center[0] - new_image_rect_center[0]), 
                             old_self_rect_center[1] + (old_image_rect_center[1] - new_image_rect_center[1]))
        image = rotated_image
        
        return image



jetzt läuft die geschichte aber wie in den Screenshots ab und Ich weis echt nichtmehr weiter auser das Rotation von Bildern in Pygame anscheinend ne Knifflige angelegenheit ist.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Caphoras« (28.02.2013, 14:39)


Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

2

01.03.2013, 15:58

Du machst da allgemein sehr sehr viel um ein Bild zu drehen. Im Prinzip gibt die Rotate Funktion ja ein gedrehtes Bild zurück. Von daher könntest du das aktuelle Bild ja mit dem gedrehten überschreiben.

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
Surface image;
float winkelgeschwindigkeit;

// Hier ist die Drehfunktion:
if (Taste Links gedrückt)
{
    image = image.Rotate(image, winkelgeschwindigkeit);
}
if(Taste Rechts gedrückt)
{
    image = image.Rotate(image, -winkelgeschwindigkeit);
}


Würde das nicht reichen? Und in deiner Rendermethode renderst du dann halt einfach image.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

Caphoras

Frischling

  • »Caphoras« ist der Autor dieses Themas

Beiträge: 23

Wohnort: Kaiserslautern

Beruf: Praktikant

  • Private Nachricht senden

3

01.03.2013, 23:17

Naja zwei dinge zu deiner sache:
1. Würde Ich, wenn ich die Bilder (2 stück weil 2 Darstellungen des Schiffs) im Eventhandler rotieren lassen, würden Diese nur eine Rotation machen (außer ich würde diese in ne Schleife Packen was aber den Spielfluss während dem Tastendruck unterbrechen würde)

2. Würde Ich es bevorzugen sämtliche mögliche Interaktionen des Schiffes in dessen Klasse zu definieren da Ich z.B. bei späteren Versionen eine Mehrspieler Option hinzufügen möchte (ne art high score jagd) und da wäre es sinnvoll wenn ich den tasten nur sagen müsste Ship1.move_left / move_right und ship2.move_left /move_right.

Ich glaube ich habe aber ine Idee welche Ich morgen mal ausprobier, Ich freu mich schon drauf das fertige spiel zu präsentieren :D

Caphoras

Frischling

  • »Caphoras« ist der Autor dieses Themas

Beiträge: 23

Wohnort: Kaiserslautern

Beruf: Praktikant

  • Private Nachricht senden

4

04.03.2013, 14:45

Habs gelöst !!!
Ich hab die Funktion tatsächlich gelöscht und alles in Draw() gemacht.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    def draw(self,screen):
        where = self.pos[0], self.pos[1]
        if self.thrust:
            surf =  self.thrust_image
            oldCenter = where
            rotatedSurf =  pygame.transform.rotate(surf, self.angle)
            rotRect = rotatedSurf.get_rect()
            rotRect.center = oldCenter
            screen.blit(rotatedSurf, rotRect)
            
        else:
            surf =  self.unthrust_image
            oldCenter = where
            rotatedSurf =  pygame.transform.rotate(surf, self.angle)
            rotRect = rotatedSurf.get_rect()
            rotRect.center = oldCenter
            screen.blit(rotatedSurf, rotRect)


Problem lag daran das Ich in meiner Funktion nur das Bild und nicht deren Eigenschaften ( Sprich wo ist der Mittelpunkt und so weiter ) weiter geben habe aber diese benötige um das Veränderte Bild an der richtigen stelle wiederzu geben. :thinking:

Werbeanzeige

Ähnliche Themen