Simple Bot in pygame

Hier werden alle anderen GUI-Toolkits sowie Spezial-Toolkits wie Spiele-Engines behandelt.
Antworten
PatBass
User
Beiträge: 3
Registriert: Freitag 31. Juli 2020, 08:47

Hallo liebes Forum,
ich schaue mir gerade dieses Tutorial an

https://www.youtube.com/watch?v=iaOKlxi ... 06jqsm6UY6

Da die SFML Bibo wohl nicht mehr für python 3.x zu erhalten ist wollte ich das im Tuorial beschribene Programm in ein pygame Programm umschreiben.
Ich komme nur bis
https://www.youtube.com/watch?v=KiwsYpf ... Y6&index=5
Minute 7:57

UNd bekomme dieses UpdateBots unter pygame nicht zum laufen. Mit sicherheit habe ich da einen mächtigen Denkfehler drin oder kann einfach nicht weit genug um die Eckedenken. Vielleicht hat eine/r von euch ja einen Hinweis wie ich das beschriebene Tutorial in pygame umschreien kann und über diese Gedankenhürde grad drüber komme?

Hier das Main

Code: Alles auswählen

import pygame

from Robot_Manager import RobotManager
from Robot import Roboter

if not pygame.font: print('Fehler pygame.font Modul konnte nicht geladen werden!')
if not pygame.mixer: print('Fehler pygame.mixer Modul konnte nicht geladen werden!')


def main():
    pygame.init()
    Bilschirm = (800, 800)
    screen = pygame.display.set_mode(Bilschirm)
    pygame.display.set_caption("EA_Roboter_Scheiß")
    pygame.mouse.set_visible(1)
    pygame.key.set_repeat(1, 30)
    clock = pygame.time.Clock()


    robot_manager = RobotManager(screen)
    robot_manager.Roboter_hinzufügen(13)
    robot = Roboter(300, 300, screen, 10)

    # Die Schleife, und damit unser Spiel, läuft solange running == True.
    running = True
    while running:
        # Framerate auf 30 Frames pro Sekunde beschränken.
        # Pygame wartet, falls das Programm schneller läuft.
        clock.tick(30)
        # screen-Surface mit Schwarz (RGB = 0, 0, 0) füllen.
        screen.fill((0, 0, 0))

        # Alle aufgelaufenen Events holen und abarbeiten.
        for event in pygame.event.get():
            # Spiel beenden, wenn wir ein QUIT-Event finden.
            if event.type == pygame.QUIT:
                running = False
            # Wir interessieren uns auch für "Taste gedrückt"-Events.
            if event.type == pygame.KEYDOWN:
                # Wenn Escape gedrückt wird, posten wir ein QUIT-Event in Pygames Event-Warteschlange.
                if event.key == pygame.K_ESCAPE:
                    pygame.event.post(pygame.event.Event(pygame.QUIT))

        # Inhalt von screen anzeigen.
        #robot.update_bewegung(screen) #WENN ich hier auskommentiere und zeile 46 drin lasse wird nicht gezeichnet
        robot_manager.zeichne_Roboter(screen)# Wenn ich hier auskommentiere und Zeile 45 drin lasse wird einer gezeichnet
        # Wenn ich beide Zeilen (45 und 46) drin lasse , wird irgenwas komisches verspiegeltes gezeichnet


        pygame.display.flip()


# Überprüfen, ob dieses Modul als Programm läuft und nicht in einem anderen Modul importiert wird.
if __name__ == '__main__':
    # Unsere Main-Funktion aufrufen.
    main()

Hier mein Roboter

Code: Alles auswählen

import pygame
from random import randint
from math import sqrt

class Roboter:


    def __init__(self, x, y, window, durchmesser):

        self.x = x
        self.y = y
        self.delta_x = 0
        self.delta_y = 0
        self.bewegungs_sequenz_laenge = randint(1, 100)
        self.maximum_distanz = randint(1, 100)
        self.bewegungs_sequenz_zaehler = 0
        self.ziel_x = 0
        self.ziel_y = 0
        self.geschwindigkeit = 2.4
        self.durchmesser = durchmesser
        self.Roboter_Kreis = pygame.draw.circle(window,[255, 0, 0], (self.x, self.y), 20, 0)
        self.kreiere_bewegungs_sequenz()


    def update_bewegung(self, window):
        self.update_richtung(window)
        self.x += self.delta_x
        self.y += self.delta_y
        self.Roboter_Kreis = pygame.draw.circle(window,[255, 0, 0], (self.ziel_x, self.ziel_y), 20, 0)

    def kreiere_bewegungs_sequenz(self):
        self.bewegungs_sequenz = []
        count = 0
        while count < self.bewegungs_sequenz_laenge:
            delta_x = randint(-self.maximum_distanz, self.maximum_distanz)
            delta_y = randint(-self.maximum_distanz, self.maximum_distanz)
            if delta_x != 0 or delta_y != 0:
                self.bewegungs_sequenz.append((delta_x, delta_y))
                count += 1
        print(self.bewegungs_sequenz)
    def update_ziel(self):
        if self.bewegungs_sequenz_zaehler == len(self.bewegungs_sequenz) - 1:
            self.bewegungs_sequenz_zaehler = 0
        else:
            self.bewegungs_sequenz_zaehler += 1
        self.update_richtung()

    def update_richtung(self,window):
        delta_x, delta_y = self.bewegungs_sequenz[self.bewegungs_sequenz_zaehler]
        self.ziel_x = int(self.x + delta_x)
        self.ziel_y = int(self.y + delta_y)
        hypotenuse = sqrt(delta_x**2 + delta_y**2)
        self.delta_x = ((delta_x / hypotenuse) * self.geschwindigkeit)
        self.delta_y = ((delta_y / hypotenuse) * self.geschwindigkeit)



Und hier der Bot Manager

Code: Alles auswählen

import pygame
from Robot import Roboter
from random import randint


class RobotManager():
    def __init__(self, window):
        self.Roboter_alle = []
        self.window = window
        print(window)

    def Roboter_hinzufügen(self, anzahl=1, Roboter_Duchmesser=10):
        for i in range(0, anzahl):
            self.Roboter_alle.append(Roboter(randint(Roboter_Duchmesser, 800 - Roboter_Duchmesser),
                                             randint(Roboter_Duchmesser, 800 - Roboter_Duchmesser),
                                             self.window,
                                             Roboter_Duchmesser))

    def zeichne_Roboter(self, window):
        for Robot in self.Roboter_alle:
            window.blit(window, Robot.Roboter_Kreis)
Benutzeravatar
ThomasL
User
Beiträge: 1367
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Ohne hier auf grundlegende Dinge einzugehen (das können andere besser) liegt dein Problem darin,
dass du die Funktion surface.blit() falsch verwendest.
Schau hier mal nach: https://stackoverflow.com/questions/378 ... es-it-work
Ich habe das Handling der Ausgabe mal verändert.

Code: Alles auswählen

import pygame
from random import randint
from math import sqrt

class Roboter:
    def __init__(self, x, y, window, durchmesser):
        self.x = x
        self.y = y
        self.delta_x = 0
        self.delta_y = 0
        self.bewegungs_sequenz_laenge = randint(1, 100)
        self.maximum_distanz = randint(1, 100)
        self.bewegungs_sequenz_zaehler = 0
        self.ziel_x = 0
        self.ziel_y = 0
        self.geschwindigkeit = 2.4
        self.durchmesser = durchmesser
        
        # Das lassen wir mal weg
        # self.Roboter_Kreis = pygame.draw.circle(window,[255, 0, 0], (self.x, self.y), 20, 0)
        
        self.kreiere_bewegungs_sequenz()


    def update_bewegung(self):
        self.update_richtung()
        self.x += self.delta_x
        self.y += self.delta_y
        # Das lassen wir mal weg
        # self.Roboter_Kreis = pygame.draw.circle(window,[255, 0, 0], (self.ziel_x, self.ziel_y), 20, 0)

        
    def kreiere_bewegungs_sequenz(self):
        self.bewegungs_sequenz = []
        count = 0
        while count < self.bewegungs_sequenz_laenge:
            delta_x = randint(-self.maximum_distanz, self.maximum_distanz)
            delta_y = randint(-self.maximum_distanz, self.maximum_distanz)
            if delta_x != 0 or delta_y != 0:
                self.bewegungs_sequenz.append((delta_x, delta_y))
                count += 1
        # print(self.bewegungs_sequenz)
        
    def update_ziel(self):
        if self.bewegungs_sequenz_zaehler == len(self.bewegungs_sequenz) - 1:
            self.bewegungs_sequenz_zaehler = 0
        else:
            self.bewegungs_sequenz_zaehler += 1
        self.update_richtung()

    def update_richtung(self):
        delta_x, delta_y = self.bewegungs_sequenz[self.bewegungs_sequenz_zaehler]
        self.ziel_x = int(self.x + delta_x)
        self.ziel_y = int(self.y + delta_y)
        hypotenuse = sqrt(delta_x**2 + delta_y**2)
        self.delta_x = ((delta_x / hypotenuse) * self.geschwindigkeit)
        self.delta_y = ((delta_y / hypotenuse) * self.geschwindigkeit)


class RobotManager():
    def __init__(self, window):
        self.Roboter_alle = []
        self.window = window
        # print(window)

    def Roboter_hinzufügen(self, anzahl=1, Roboter_Duchmesser=10):
        for i in range(0, anzahl):
            self.Roboter_alle.append(Roboter(randint(Roboter_Duchmesser, 800 - Roboter_Duchmesser),
                                             randint(Roboter_Duchmesser, 800 - Roboter_Duchmesser),
                                             self.window,
                                             Roboter_Duchmesser))

    def update_bewegung(self):
        for Robot in self.Roboter_alle:
            Robot.update_bewegung()
    
    def zeichne_Roboter(self):
        for Robot in self.Roboter_alle:
            
            # Das lassen wir mal weg
            # window.blit(window, Robot.Roboter_Kreis)
            
            # und rufen die draw Funktion direkt auf
            pygame.draw.circle(self.window, [255, 0, 0], (int(Robot.x), int(Robot.y)), 20, 0)



def main():
    pygame.init()
    Bildschirm = (800, 800)
    screen = pygame.display.set_mode(Bildschirm)
    pygame.display.set_caption("EA_Roboter_Scheiß")
    pygame.mouse.set_visible(1)
    pygame.key.set_repeat(1, 30)
    clock = pygame.time.Clock()


    robot_manager = RobotManager(screen)
    robot_manager.Roboter_hinzufügen(10)
    # robot = Roboter(300, 300, screen, 10)

    # Die Schleife, und damit unser Spiel, läuft solange running == True.
    running = True
    while running:
        # Framerate auf 30 Frames pro Sekunde beschränken.
        # Pygame wartet, falls das Programm schneller läuft.
        clock.tick(30)
        
        # screen-Surface mit Schwarz (RGB = 0, 0, 0) füllen.
        screen.fill((0, 0, 0))

        # Alle aufgelaufenen Events holen und abarbeiten.
        for event in pygame.event.get():
            # Spiel beenden, wenn wir ein QUIT-Event finden.
            if event.type == pygame.QUIT:
                running = False
                break
            # Wir interessieren uns auch für "Taste gedrückt"-Events.
            if event.type == pygame.KEYDOWN:
                # Wenn Escape gedrückt wird, posten wir ein QUIT-Event in Pygames Event-Warteschlange.
                if event.key == pygame.K_ESCAPE:
                    pygame.event.post(pygame.event.Event(pygame.QUIT))
        
        if running:
            robot_manager.update_bewegung()
            robot_manager.zeichne_Roboter()
            pygame.display.flip()
    
    pygame.quit()

if __name__ == '__main__':
    main()
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Antworten