PYGame Mainmenu?

Hier werden alle anderen GUI-Toolkits sowie Spezial-Toolkits wie Spiele-Engines behandelt.
Antworten
Mr.Wolna
User
Beiträge: 93
Registriert: Dienstag 6. Oktober 2009, 17:43

simple frage.

wie kann ich ein mainmenu in pygames coden?

Und bitte verweist mich nicht auf die fertigen Scripts. ich kriege nicht mal deise in mein Programm.

Ich bin relativ neu mit python, kann mir wer Zeile per Zeile erklären, wie und was genau diese meint und wozu die da ist, anhand an einem simplen Beispiel?

Ich hoffe jemand nimmt sich die Zeit und hilft mir.

SO oder so, ich danke euch.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Was ist eim "mainmenu"?

Und wieso bekommst Du "fertige" Scripts nicht in Dein Programm? (Meinst Du Module?)

Und wieso befasst Du Dich mit pygame, wenn Du noch neu bist in Python? Imho keine gute Idee (s. auch Dein 2. Problem!)
Mr.Wolna
User
Beiträge: 93
Registriert: Dienstag 6. Oktober 2009, 17:43

Mainmenu? Da wo man Start, Fortsetzen und Beenden auswählen kann. ;)

Und ich habe alles im Griff außer eben den einzelnen Menüpunkten. Komme nicht ganz klar mit Listen. Und ich habe mich schon mal mit Python beschäftigt und würde das weiterhin auch, aber eben anhand von Python. Wie gesagt ich komme eigentlich ziemlich klar damit, aber das mit dem Menü klappt nicht. Hier mal mein bis jetziger Code, wobei noch vieles fehlt, weil in anderen Scripts.

Code: Alles auswählen

#!/usr/bin/env python 
# -*- coding: cp1252 -*-

import pygame
from pygame.locals import *

# optional
if not pygame.font: print 'Warning, no fonts'
if not pygame.mixer: print 'Warning, no sound'

pygame.init()
screen = pygame.display.set_mode((800, 600), FULLSCREEN)
#screen = pygame.display.set_mode((800, 600))
pygame.display.set_caption('MyGame 1.0')
pygame.mouse.set_visible(1)
#fuellt Bildschirm mit Farbe (RGB Code)
screen.fill((0, 0, 0))

mainmenu_background = pygame.image.load("data/art/mainmenu_background.png")
mainmenu_background.set_alpha(128)
screen.blit(mainmenu_background, (0, 0))


mainmenu_font = pygame.font.Font("data/fonts/DIRTY___.ttf", 130)
mainmenu_title = mainmenu_font.render("Briefe der Vergangenheit", 1, (255, 255, 255))
screen.blit(mainmenu_title, (50, 20))

#copyrightstring_font = pygame.font.Font(None, 15)
#mainmenu_copyrightstring = copyrightstring_font.render("©Phoenix Entertainment", 1, (255, 200, 20))
#screen.blit(mainmenu_copyrightstring, (5, 585))

versionstring_font = pygame.font.Font(None, 15)
mainmenu_versionstring = versionstring_font.render("1.0", 1, (255, 255, 255))
screen.blit(mainmenu_versionstring, (775, 585))

#pygame.draw.line(screen, (0, 0, 255), (0, 0), (200, 100))

pygame.display.flip()

mainmenu_music = pygame.mixer.music.load ("data/music/mainmenu_music.mp3")
pygame.mixer.music.play(-1)
Da fehlen noch Dinge, die ich raus gefunden habe aber noch nicht angewendet, wie z.B. andere Maus(aus Image) und die ganzen Events (Input). Momentan bin ich wie gesagt an dem einzelnen Menüpunkten.

Der Code ist nur dazu da euch zu zeigen, das ich durchaus bewusst bin WAS ich da mache und auf WAS ich mich in der Zukunft einlasse, und kein Troll bin der einfach fertige Codes haben will^^

Wie gesagt, eine Erklärung in deutscher Sprache ist das, was ich mir wünsche. Habe schon alles andere ausprobiert, und komme nicht ans Ziel, weil ich nicht genau verstehe wie die Mechanik dahinter funktioniert.

Hier mein erster besch***eidener Versuch:


Code: Alles auswählen

mainmenu_font = pygame.font.Font(None, 30)
Option1 = mainmenu_font.render("Neues Spiel", 1, (255, 255, 255))
Option2 = mainmenu_font.render("Fortsetzen", 1, (255, 255, 255))
Option3 = mainmenu_font.render("Optionen", 1, (255, 255, 255))
Option4 = mainmenu_font.render("Credits", 1, (255, 255, 255))
Option5 = mainmenu_font.render("Beenden", 1, (255, 255, 255))

screen.blit(Option1, (150, 220))
screen.blit(Option2, (150, 245))
screen.blit(Option3, (150, 270))
screen.blit(Option4, (150, 295))
screen.blit(Option5, (150, 320))

pygame.display.flip()
Damit hätte ich die einzelnen Textstrings auf meinen Mainscreen. Jetzt muss ich irgendwie den Ausgabewert(return) ansteuern können, so das ich mit KUP und KDOWN, durch die einzelnen Menüpunkte gehen, und diese eine andere Farbe oder Größe bekommen. ;)

MfG,

Mit Hoffnung auf Hilfe,

WOLNA
Mr.Wolna
User
Beiträge: 93
Registriert: Dienstag 6. Oktober 2009, 17:43

Entschuldigt den DP:

Folgendes, ich habe Netz das ganze in einer Liste, somit auch die Rückgabewerte.

Zwei fragen. Wie schaffe ich es das ganze mit einer Zeile auf den Surface zu zeichnen und was muss ich machen (+1 bzw. -1) bei den KeyUP/Down um die einzelnen Menüpunkte in ihrer Fontgröße oder Farbe anzuheben?


Code: Alles auswählen

mainmenu_font = pygame.font.Font(None, 30)

Option1 = mainmenu_font.render("Neues Spiel", 1, (255, 255, 255))
Option2 = mainmenu_font.render("Fortsetzen", 1, (255, 255, 255))
Option3 = mainmenu_font.render("Optionen", 1, (255, 255, 255))
Option4 = mainmenu_font.render("Credits", 1, (255, 255, 255))
Option5 = mainmenu_font.render("Beenden", 1, (255, 255, 255))

Options = [Option1, Option2, Option3, Option4, Option5]

screen.blit(Options[0], (150, 220)) #DA SOLLTE NUR EINE ZEILE STEHEN!
screen.blit(Options[1], (150, 245))
screen.blit(Options[2], (150, 270))
screen.blit(Options[3], (150, 295))
screen.blit(Options[4], (150, 320))
pygame.display.flip()

Und was bei den Inputs?

Code: Alles auswählen

if keyinput[pygame.K_DOWN]:
             print "Down"
            #Options[+1] == 1
            #print Options +1
            #print len(Options) #+1 es kommt 5 oder mit +1 6 raus (logisch^^)
            #print (Options[+1])
           

if keyinput[pygame.K_UP]:
            print "Up"
            

Wie ihr seht habe ich einiges schon versucht,leider ohne Erfolg. ^^

MfG,
Wolna
Mr.Wolna
User
Beiträge: 93
Registriert: Dienstag 6. Oktober 2009, 17:43

Hm, keiner ne Ahnung?

*sich wahrlich für den TP schäm*

:oops:
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Es hat halt niemand Lust sich durch unkommentierten Code zu wühlen (wobei Du nicht mal das Syntax-Highlighting benutzt). Deine Fragen sind zudem wenig präzise... und Du gibst kein lauffähigs Minimalbeispiel oder auch ein Screenshot bei solch grafischen Problemen. Ich kann mir immer noch nicht vorstellen, was jetzt nicht klappt. bzw. was anders sein sollte!
Mr.Wolna
User
Beiträge: 93
Registriert: Dienstag 6. Oktober 2009, 17:43

Ich habe kein Beispiel, aber ich meine so was hier.

So simple und verständlich wie möglich, möchte ich das nachbauen.

http://www.pygame.org/project/855/

MfG
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Mr.Wolna hat geschrieben:Ich habe kein Beispiel, aber ich meine so was hier.

So simple und verständlich wie möglich, möchte ich das nachbauen.

http://www.pygame.org/project/855/

MfG
Und was hast Du bereits und was noch nicht bzw. was bekommst Du nicht hin?
Mr.Wolna
User
Beiträge: 93
Registriert: Dienstag 6. Oktober 2009, 17:43

siehe meinen code, ich habe die texte im mainmenu, aber ich kann nicht mit den inputs/keys runter udn raufscrollen.

ich blick da einfach nicht durch.


ich würde gerne mit Up bzw. Down die menuliste runter udn rüberscrollen, webe ich das visuelle entweder wie im besiegel per Farbe oder per fontgröße darstellen will.

MfG
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Ok, jetzt hab ich es...

... also:

Du brauchst:
- eine Datenstruktur, in der Du dir sowohl den hervorgehobenen Text als auch den normalen Text merkst.
- einen Index auf das jeweils aktuelle Element.
- mehr Ahnung von Python ;-) (SCNR)

So wie Du die Datenstrukturen aufbaust sieht das häßlich aus. Das ist alles copy-and-paste Programmierung.

Naja, auf jeden Fall passt Du nach jedem Druck den Index an. Dann malst Du eben alle Menüpunkte neu hin und den aktuellen (anhand des Indizes) eben in der anderen Farbe. Wo ist jetzt das Problem gewesen?
Mr.Wolna
User
Beiträge: 93
Registriert: Dienstag 6. Oktober 2009, 17:43

Das Problem ist das ich mehr Ahnung von Python brauch^^


Wäre es zu viel verlangt, wenn du ein Beispiel(kommentierten) Code schreiben würdest. Aber bitte,so simple wie möglich, ohne unnötig variablen und so. Klar ist bedienugsfreudiger mit Vars und Abkürzungen ,aber das werde ich dann schon selber herausfinden, ich brauche erstmal nur das simpelste aller simplen Grundgerüste. Damit ich einfach den Ablauf, die Mechanik dahinter nachvollziehen kann.

Und bitte nicht denken, dass ich nur ein Code haben will, sonst würde ich eben das oben gepostete Modul nehmen, ich will das schon lernen und für die Zukunft kapieren.
Und ja noch einmal, mir ist klar das ich meine grundlegenden Programmierkenntnisse über Python stark verbessern muss. Aber ich will das soweit natürlich möglich den Lernprozess mit PYGAME zu kombinieren.

Wie gesagt, ich wäre über ein kurzes,knappes Beispiel (nur mit den Grundfunktionen) sehr erfreut.

natürlich gilt es auch für andere User, die sich gerne an meinen Problem beteiligen können. ;)

MfG,
Wolna
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Ich muss heute noch 4 Stunden Bahnfahren... da werd ich mich mal drum kümmern ;-)

Aber posten kann ich 's dann erst wohl Samstag Nachmittag. Also Geduldig sein - oder sich in der Zeit mal grundlegende Dinge aneignen ;-)
Mr.Wolna
User
Beiträge: 93
Registriert: Dienstag 6. Oktober 2009, 17:43

Hyperion hat geschrieben:oder sich in der Zeit mal grundlegende Dinge aneignen ;-)
Jo, das wäre wohl nicht verkehrt.

Und ich danke für dein Engagement. Tolle Sache! :)

MfG
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

So, habe mal was zusammen gebastelt. Ist noch nicht perfekt kommentiert und dokumentiert, aber ich hoffe Du kannst daraus was ableiten:

http://bitbucket.org/hyperion/simplemenu/src/
Mr.Wolna
User
Beiträge: 93
Registriert: Dienstag 6. Oktober 2009, 17:43

um , mehrere scripte?

hm, könntest du das als ne rar alles uplaoden?

Mfg

edir: hm. habs grade angeschaut. Alles viel zu schwer. WEnn ich schon das aller simpelste nicht hinkrieg, dann das sicherlich nicht. Aber ich mach mir Mühe, das zu verstehen.
philistion
User
Beiträge: 108
Registriert: Sonntag 7. Februar 2010, 14:16

Da schreibt dir jemand eh schon ein auf dein Problem zugeschnittenes Beispielprogramm, lädt es auf Bitbucket rauf und du verlangst ne Rar-Datei?

Bitte lies erstmal das: http://tutorial.pocoo.org/

Und dann geht's hier weiter: http://www.pygame.org/docs/
Mr.Wolna
User
Beiträge: 93
Registriert: Dienstag 6. Oktober 2009, 17:43

der erste link sieht versprengend aus.

mit dem zweiten, beschäftige ich mich schon tagelang. ;)
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Mr.Wolna hat geschrieben:der erste link sieht versprengend aus.
BUMM!
Mr.Wolna hat geschrieben:mit dem zweiten, beschäftige ich mich schon tagelang. ;)
Es nützt dir nur nichts wenn du versuchst Spezialwissen zu erlangen wenn dir Grundwissen fehlt. Fang mit dem allgemeinen Python-Tutorial an.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

philistion hat geschrieben:Da schreibt dir jemand eh schon ein auf dein Problem zugeschnittenes Beispielprogramm, lädt es auf Bitbucket rauf und du verlangst ne Rar-Datei?
Hehe, naja, zu seiner "Eherenrettung" muss man sagen, dass Mercurial ja nicht jedermans Sache ist. Dennoch würde ich wenn nur ein zip oder bzip2 codiertes Tar-Archiv irgend wo anbieten und kein rar. Ich hasse rar und: es ist imho obsolet :-)
Mr.Wolna hat geschrieben:um , mehrere scripte?
Nee, mehrere Dateien. Die menu.py ist eher als reine Lib anzusehen, da sie nicht mal eine "main"-Funktion besitzt. Theoretisch hätte ich die Testroutine auch da rein posten können - aber dann würde der kleine Trick mit den Callbacks nicht funzen (zumindest habe ich keine Idee, wie ich das innerhalb eines Moduls hinbekommen könnte).
Mr.Wolna hat geschrieben: edir: hm. habs grade angeschaut. Alles viel zu schwer. WEnn ich schon das aller simpelste nicht hinkrieg, dann das sicherlich nicht. Aber ich mach mir Mühe, das zu verstehen.
Hm... ja, ist vom Code schon sehr groß geworden. Allerdings ist das Kernkonzept nicht so unterschiedlich zu meiner ersten Intention: Man muss sich eine geeignete Datenstruktur für das Menü und seine Einträge ausdenken. Ich habe mich für die Kombi aus Klasse (Menü) und Dictionary (Menüitems) entschieden.

Zusätzlich hat es mich dann ein wenig "gepackt" und ich dachte, mensch, lagere doch die Menüinfos in eine Datei aus (JSON-Format), damit das ganze noch dynamischer wird. Somit kannst Du für Dein Spiel sehr einfach Menüs erstellen, ohne auch nur eine zeile Python-Code erstellen zu müssen (von den Funktionen, die durch eine Auswahl aufgerufen werden sollen mal abgesehen). Als letztes habe ich eben noch ermöglicht, dass man in der Menüdefinition schon auf eine Funktion in einem Modul verweisen kann und diese Funktion als Objekt bei der Auswahl eines Items übergeben bekommt. Das kann man natürlich auch weglassen und dieses Mapping selber in seinem Script definieren.

Da ist noch viel Luft zum Optimieren drin (alleine die Doku ist noch erbärmlich ;-) ), aber generell zeigt mein Beispiel imho schon einige nette Ideen und Konzepte in Python:

- Dictionaries
- Listen
- Persitenz (Ablegen von Daten) per JSON
- "alles ist ein Objekt" (Aufurf von action() in demo.py)

Nuja, schon ziemlich viel drin, das man auch hätte anders lösen können. Aber das ist bei komplexeren Problemen ja fast immer so :-)

Aber mittlerweile hast Du ja selber eingesehen, dass Du erst einmal die Grundlagen kapieren musst :-)
Mr.Wolna
User
Beiträge: 93
Registriert: Dienstag 6. Oktober 2009, 17:43

Ja, bin kräftig an Tuts anschauen/lesen.

Wir werden sehen wie weit ich komme. :lol:

Jedenfalls danke ich dich für dein Engagement, ich werde hoffentlich wieder darauf zugreifen klönen, wenn ich die Struktur und Mechanik dahinter nachvollziehen kann. Momentan ist es für mich so, als ob ich mongolisch lesen würde. *lacht*

MfG
Antworten