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

Maltrix

Frischling

  • »Maltrix« ist der Autor dieses Themas

Beiträge: 31

Wohnort: Hamburg

  • Private Nachricht senden

11

23.02.2018, 11:11

Zum besseren Verständnis, hier nochmal meine erstellte Klasse:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Avatar(pygame.sprite.Sprite): # Erschaffe Spriteklasse namens Avatar
    def __init__(self): # fülle die Klasse Avatar mit folgenden Daten
        pygame.sprite.Sprite.__init__(self) # initialisierung des Sprites (super wichtig!)
        self.image = pygame.image.load(os.path.join(img_folder, "Rahl_rechts.png")).convert() # lade Spriteimage aus Bilderordner
        self.image.set_colorkey(schwarz) # weise colorkey eine Farbe zu (diese Farbe wird daraufhin transparent wiedergegeben)
        self.rect = self.image.get_rect() # Erschaffe Quadrat um den Avatar so groß wie Avatar
        self.rect.center = (x, y) # setze die Startkoordinaten
        self.y_speed = 2 # 

    def update(self): 
        self.rect.x += 2 # Bewegungsgeschwindigkeit auf der X-Achse
        self.rect.y += self.y_speed # Bewegungsgeschwindigkeit auf der Y-Achse
        if self.rect.bottom > höhe - 20:
            self.y_speed = - 2
        if self.rect.top < 20:
            self.y_speed = 2
        if self.rect.left > breite:
            self.rect.right = 2


Die Variablen self.y_speed und self.rect.x beschreiben ja die Geschwindigkeit, mit der sich der Sprite bewegen soll und die Vorzeichen die Richtung.
Und da die Geschwindigkeit 1 immer noch recht zügig ist würde ich sie gerne auf einen Wert kleiner 1 setzen also z.B 0.5.
Wenn ich das mache interpretiert das Programm den Wert aber als 0 und die Bewegung wird nicht ausgeführt.

In einem anderen Programm hatte ich zur Steuerung folgendes geschrieben:

Quellcode

1
2
3
4
5
6
7
8
9
 pressedKeys = pygame.key.get_pressed() # Abfrage der Eingaben

    
    if pressedKeys[pygame.K_UP] == 1 and pressedKeys[pygame.K_RIGHT] == 1:
        x = x + 4.5
        y = y - 4.5
    elif pressedKeys[pygame.K_UP] == 1 and pressedKeys[pygame.K_LEFT] == 1:
        x = x - 4.5
        y = y - 4.5


Im ersten Code sind mit den Werten so wie ich es verstanden habe ja Pixel gemeint, die sich der Sprite fortbewegen soll weswegen ich es irgendwo nachvollziehen kann, dass man sich nicht einen halben Pixel voranbewegen kann. und 0.5 nicht funktioniert.

Die Variablen x und y im zweiten code beziehen sich allerdings auch auf Pixel, weswegen ich nicht verstehe, warum es in dem einen Fall geht und in dem anderen nicht.
Ich denke, ich verstehe hier etwas falsch, weiß aber nicht was.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Maltrix« (23.02.2018, 15:49)


Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

12

23.02.2018, 11:18

Deine Position muss selbst eine Kommazahl sein. Du setzt das Center von dem Rechteck am Anfang auf (x, y) wobei ich grad auf die schnelle nicht finde was x un y sind. Setz die mal vorher auf Kommawerte und guck was passiert.
„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.“

Maltrix

Frischling

  • »Maltrix« ist der Autor dieses Themas

Beiträge: 31

Wohnort: Hamburg

  • Private Nachricht senden

13

23.02.2018, 15:19

X und Y kannst du weiter oben in einem anderen meiner Kommentare nachlesen, da steht das ganze Programm.

Ich hatte die jetzt in Kommazahlen umgeschrieben und nochmal versucht aber es hat nichts funktioniert. er interpretiert z.B 0.5 immernoch als 0
Ich habe das gefühl, dass es in irgend einer Weise an der Klasse liegt, dass ich nicht kleiner als 1 gehen kann. In besagten anderen Programm habe ich ohne klasen gearbeitet und einfach nur ein Rechteck programmiert, das sich dann über den code, den ich vorhin angehängt hatte bewegen konnte (in dem code den ich geschickt hatte waren nur zwei bewegungsrichtungen abgebildet. die restlichen 5 sahen aber fast genau so aus)

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Maltrix« (23.02.2018, 15:37)


Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

14

23.02.2018, 16:48

Wie gesagt, wenn Python den Wert einer Variablen als Ganzzahl ansieht dann kannst du die zwar mit einer Kommazahl multiplizieren, das Ergebnis bleibt aber eine Ganzzahl. Möglicherweise kannst du mit typeof mal gucken was für einen Typ die Variable hat.
„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.“

Maltrix

Frischling

  • »Maltrix« ist der Autor dieses Themas

Beiträge: 31

Wohnort: Hamburg

  • Private Nachricht senden

15

23.02.2018, 17:19

Hatte ich jetzt gerade schon gemacht. Scheint tatsächlich ein int zu sein aber irgendwie muss ich das doch langsamer kriegen.
Um mal aufs Kernproblem zurück zu kommen (das Ruckeln), mir ist mal aufgefallen, dass der Sprite in dem Turtorial-Video ebenfalls ruckelt. Der Moderator geht darauf aber nicht ein.
In einem viel späteren Video, wenn er bereits Tilemaps und Gegner und andere Sprites hinzugefügt hat, scheint es nicht mehr zu ruckeln. Also vielleicht muss ich mir nur die anderen Turtorials ansehen und durchziehen um dieses Problem zu lösen. Ich bin dann wohl einfach noch nicht so weit.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

16

23.02.2018, 17:32

Wie gesagt, wenn Python den Wert einer Variablen als Ganzzahl ansieht dann kannst du die zwar mit einer Kommazahl multiplizieren, das Ergebnis bleibt aber eine Ganzzahl. Möglicherweise kannst du mit typeof mal gucken was für einen Typ die Variable hat.

Das ist falsch. Ein Integer multipliziert mit einem Float ergibt einen Float. Und nicht vergessen, dass Python dynamisch typisiert ist, d. h. dass Variablen ihren Typ ändern können:

Quellcode

1
2
x = 5 # x ist Integer
x *= 1.5 # x ist jetzt Float und hat den Wert 7.5

Es kann natürlich sein, dass Pygame intern wieder zu Integer castet. Aber das liegt dann an Pygame, nicht an Python.

Maltrix

Frischling

  • »Maltrix« ist der Autor dieses Themas

Beiträge: 31

Wohnort: Hamburg

  • Private Nachricht senden

17

23.02.2018, 17:44

oh... :hmm:

Aber dann verstehe ich echt nicht, warum ich nicht mit Kommazahlen arbeiten kann.

Ich hatte auch versucht, die Steuerung, die ich in dem anderen Programm programmiert hatte in die def sektion der Klasse zu schreiben und habe sie dahingehend abgeändert.
Erstens konnte ich auch hier nicht mit Kommazahlen arbeiten und zweitens (was mich noch viel mehr verwirrt hatte)
Hat er nur die zahlen mit negativen vorzeichen gefressen. also z.B:

Quellcode

1
2
3
elif pressedKeys[pygame.K_UP] == 1 and pressedKeys[pygame.K_LEFT] == 1:
        self.rect.x = self.rect.x - 1
        self.rect.y = self.rect.y - 1


funktionierte, während:

Quellcode

1
2
3
if pressedKeys[pygame.K_DOWN] == 1 and pressedKeys[pygame.K_RIGHT] == 1:
        self.rect.x =  self.rect.x + 1
        self.rect.y = self.rect.y + 1


nicht funktionierte.... Ich checks echt nicht XD

Da muss ich wohl erst noch weiter die imaginäre Schulbank drücken....

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

18

23.02.2018, 17:46

Wahrscheinlich verwandelt Pygame deine Werte in Integer, wenn du sie in ein Rect einsetzt. Dann musst du die Position separat im jeweiligen Objekt speichern (als Float) und die Werte des Rects immer entsprechend anpassen. Also wenn du dein Objekt bewegen willst, dann änderst du nicht direkt das Rect, sondern erstmal die im Objekt gespeicherte Position. Beim Zeichnen bzw. beim Update setzt du dann basierend auf dieser Position die Werte des Rects.

Nachtrag: Ja, mein Verdacht war korrekt:
https://www.reddit.com/r/pygame/comments…game_will_only/

Maltrix

Frischling

  • »Maltrix« ist der Autor dieses Themas

Beiträge: 31

Wohnort: Hamburg

  • Private Nachricht senden

19

23.02.2018, 18:29

Ich habe nie daran gezweifelt. Danke, das hilft mir weiter denke ich. Ich grabe mich dann mal in die Thematik ein und versuche es zu lösen.

Danke auch für den Link. Ich schau mal was ich draus mache.

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

20

23.02.2018, 18:38

Das ist falsch. Ein Integer multipliziert mit einem Float ergibt einen Float. Und nicht vergessen, dass Python dynamisch typisiert ist, d. h. dass Variablen ihren Typ ändern können:

Das ist natürlich richtig. Bei der Division vom Integer fällt lediglich der Rest weg, was hier ja überhaupt nicht Thema war. Ich war mit dem Kopf woanders.
„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.“

Werbeanzeige