[Hilfe] :D

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Septias
User
Beiträge: 80
Registriert: Freitag 24. Juni 2016, 19:15

Hallo, ich bin zurzeit daran mich mit dem Spieleprogrammieren mit pygame zu versuchen.
Nun habe ich mehrere Screen-funktionen um z.B den Mehrspieler oder Einzespieler screen zu zeigen. Da aber nur einer zur Zeit lufen soll habe ich eine Variabel, die immer aufgerufen wird, die dann ihren Wert auf die verschiedenen Funktionen ändern soll. Was aber nicht funktioniert.

Hier eine heruntergestockte Version meines Codes:

Code: Alles auswählen

import pygame

pygame.init()
screen = pygame.display.set_mode([100,50])
red = [255,0,0]
active = True
uhr = pygame.time.Clock()


def Button(function, size=[100, 50], position=[0,0]):
    cur = pygame.mouse.get_pos()
    cur_click = pygame.mouse.get_pressed()
    #-------------testet einfach, ob die Maus in dem Feld des Buttons ist und ober er geklickt wird.----------------------
    if cur_click[0]  > 0 and size[0] +position[0] > cur [0] > position[0] and position[1] + size[1] > cur[1] > position[1]:
        global menu
        print menu
        print function
        exec (function)

def Test():
	print "hi"

def Test2():
	print "ok"

menu = 	Test


while active:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            active = False

    uhr.tick(60)
    Button("menu = Test2")
    pygame.display.update()

pygame.quit()
Hat irgendwer ne Ahnung warum "exec" nicht richtig funktioniert ?
Zuletzt geändert von Anonymous am Samstag 25. Juni 2016, 22:05, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Für alle meine Codebeispiele gilt: Äußert bitte jegliche Art von Verbesserungsvorschlägen. Ich versuche immer meinen Stil zu verbessern und wenn man mir einfach sagt, was ich falsch machen, ist es um einiges einfacher, als wenn ich es mühselig selber herausfinden muss :-)
BlackJack

@Septias: Ja ich habe eine Ahnung. Die verrate ich allerdings nicht, denn am Ende verwendest Du dann tatsächlich ``exec``. Lass die Finger davon. Genau wie von ``global`` und der Idee das Hauptprogramm und Variablen auf Modulebene zu haben. Da gehört nur Code hin der Konstanten, Funktionen, und Klassen definiert. Letztere wirst Du sehr wahrscheinlich brauchen um das ganze sauber und ohne ``global`` hin zu bekommen.

Maus und deren Tasten würde ich nicht mit den Funktionen abfragen sondern die entsprechenden Ereignisse verarbeiten. Sonst kann es passieren das Du Mausklicks verpasst.

Die ``if``-Bedingung liesse sich wesentlich kompakter schreiben, wenn Du `Rect`-Objekte verwenden würdest. Man muss das Rad ja nicht neu erfinden. :-)
Septias
User
Beiträge: 80
Registriert: Freitag 24. Juni 2016, 19:15

@BlackJack

Danke für die Hilfe , auch wenn es mich nicht sehr viel weiter gebracht hat. :D
Wenn du also schon mein ganzes System auseinander reist und mich mit den einzelnen Stücken zurück läss...
kannst du mir dann sagn wie ich das ganze vllt. ohne "global" und "exec" machen kann ? Muss keinen extra Text sein, aber ein paar Denkanstöße wären cool...

Thx
Für alle meine Codebeispiele gilt: Äußert bitte jegliche Art von Verbesserungsvorschlägen. Ich versuche immer meinen Stil zu verbessern und wenn man mir einfach sagt, was ich falsch machen, ist es um einiges einfacher, als wenn ich es mühselig selber herausfinden muss :-)
BlackJack

@Septias: Naja, Klassen halt. Das schrob ich ja schon. Du kannst natürlich versuchen wie weit Du mit Funktionen kommst, aber das nimmt sich am Ende nichts von der Komplexität ob man nun Funktionen und Closures verwendet oder Klassen. Wobei Klassen in Python die ”natürlichere” Wahl sind.

Dein Beispiel kann man noch weiter eindampfen:

Code: Alles auswählen

import pygame

DISPLAY_SIZE = (100, 50)


def do_something():
    print 'hi'


def do_something_different():
    print 'ok'


def main():
    pygame.init()
    _screen = pygame.display.set_mode(DISPLAY_SIZE)
    uhr = pygame.time.Clock()
    button_rect = pygame.Rect((0, 0) + DISPLAY_SIZE)
    menu = do_something
    active = True
    while active:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                active = False
            elif event.type == pygame.MOUSEBUTTONUP:
                if button_rect.collidepoint(event.pos):
                    menu = do_something_different

        uhr.tick(60)
        menu()
        pygame.display.update()
     
    pygame.quit()


if __name__ == '__main__':
    main()
Septias
User
Beiträge: 80
Registriert: Freitag 24. Juni 2016, 19:15

@BlackJack

Tut mir leid wenn ich da jetzt falsch liege aber da sind doch eigentlich keiner Klassen, oder ? Wel eigentlich brenutzt man doch "class" oder nicht ?

Un da ich jetzt warscheinlich eh sehr viel umbaue, kann ich ja auch noch meine engien wechseln.
Nur mal so ist OpenGL besser als pygame ? Oder generall was ist das beste dafür ?
Für alle meine Codebeispiele gilt: Äußert bitte jegliche Art von Verbesserungsvorschlägen. Ich versuche immer meinen Stil zu verbessern und wenn man mir einfach sagt, was ich falsch machen, ist es um einiges einfacher, als wenn ich es mühselig selber herausfinden muss :-)
BlackJack

@Septias: Stimmt da ist jetzt keine Klasse, aber da ist ja auch keine nötig. Wenn man etwas sauber und übersichtlich ohne Klasse schreiben kann, dann muss man das ja nicht unnötig kompliziert machen. Ich hatte da jetzt einfach mal so einfach wie möglich das Problem, so wie ich es verstanden hatte, gelöst. Und zwar ohne globale Variablen.

Klassen könnten Sinn machen wenn man anfängt mehrere Schaltflächen zu programmieren. Für die auch etwas gezeichnet wird. Denn dann böte es sich sehr wahrscheinlich an von der `Sprite`-Klasse zu erben, die von Pygame zur Verfügung gestellt wird.

Und man wird ja auch irgendeine Programmlogik haben, die dann einen Zustand hat. Auch das wäre dann sehr wahrscheinlich sinnvoll in einer Klasse aufgehoben.

OpenGL und Pygame sind nicht so wirklich Gegensätze. Wenn Du OpenGL programmieren möchtest, dann brauchst Du eine Bibliothek die Dir einen OpenGL-Kontext und ein Fenster zur Verfügung stellt. Pygame wäre eine solche Bibliothek. OpenGL hat gegenüber ”normalem” Pygame den Vorteil das man damit auch 3D-Grafik programmieren kann, es hat aber den Nachteil, dass das noch ”primitiver” zu programmieren ist als die 2D-Grafik mit Pygame.

Falls Du 2D mit OpenGL machen möchtest, dann würde ich so etwas wie Pyglet empfehlen, statt wirklich selber alles in reinem OpenGL zu schreiben.
Septias
User
Beiträge: 80
Registriert: Freitag 24. Juni 2016, 19:15

@BlackJack


Danke ^^
Für alle meine Codebeispiele gilt: Äußert bitte jegliche Art von Verbesserungsvorschlägen. Ich versuche immer meinen Stil zu verbessern und wenn man mir einfach sagt, was ich falsch machen, ist es um einiges einfacher, als wenn ich es mühselig selber herausfinden muss :-)
Septias
User
Beiträge: 80
Registriert: Freitag 24. Juni 2016, 19:15

So, ich habe jetzt ne Zeit lang versucht keine golabel Variablen zu verändern. Aber jetzt muss ich ne Variable in ner anderen Funktionen verändern.
(Ich habe in meiner Main()-funktion die variable angelegt. Nun wird eine andere Funktion ausgeführt, die diese verändern soll.)

Wie soll ich das dann ohne "Global" machen ohne immer die Variable im call der Funktion mitzugeben.
Für alle meine Codebeispiele gilt: Äußert bitte jegliche Art von Verbesserungsvorschlägen. Ich versuche immer meinen Stil zu verbessern und wenn man mir einfach sagt, was ich falsch machen, ist es um einiges einfacher, als wenn ich es mühselig selber herausfinden muss :-)
BlackJack

@Septias: Eben genau so: Mitgeben. Funktionen und Methoden sollten keine Werte verwenden (ausser Konstanten), die nicht als Argument übergeben wurden. Sonst hat man ganz schnell einen Wust von unübersichtlichen Abhängigkeiten.
Antworten