Event-Häufung

Hier werden alle anderen GUI-Toolkits sowie Spezial-Toolkits wie Spiele-Engines behandelt.
Antworten
Neo_Junior
User
Beiträge: 49
Registriert: Samstag 6. August 2011, 18:52

hi,
es kann sein, dass es so eine frage schon gibt, aber ich wüsste nicht was dafür ein geeignetes stichwort wäre:
ich habe eine art pong für multiplayer (links und rechts je einer) und mit hoch und runter und w und s kann man seinen schläger steuern.
ich habe außerdem für das gedrückthalten (und dadurch schneller bewegen) dieses stück code verwendet:

Code: Alles auswählen

delay = 100
interval = 50
pygame.key.set_repeat(delay, interval)
das problem ist, dass wenn ein spieler die taste gedrückt hält und der andere auch nur ein mal seine taste drückt, wird das schnelle hoch- und runterfahren unterbrochen...was ja eigentlich nicht so sein sollte...
bitte um hilfe

danke :D
Auf den Wunsch, Computer und Software zu verstehen folgt mit (nicht unbedingt kompletter Logik) der Drang nach Wissen im Programmieren.
deets

So macht man das nicht. Im Gegenteil, das repeat stoert nur.

Du bekommst von pygame key-pressed & key-released events. Und genau auf die musst du hoeren. Wenn der spieler "w" drueckt, faengst du an, so lange nach oben zu gehen, bis "w" losgelassen wird. Obacht geben, wenn "s" gedrueckt wird, aber "w" noch nicht losgelassen wurde: dann musst du natuerlich trotzdem so tun, als ob "w" losgelassen wurde.

Analog natuerlich fuer die Pfeiltasten.
Neo_Junior
User
Beiträge: 49
Registriert: Samstag 6. August 2011, 18:52

cooooooooolioo

das stück code stammte aus dem buch "Hello World", aber für ein single player pong...

kannst du pls ma den code für deine events oder eben deren erkennung reinschreiben?

thx
Auf den Wunsch, Computer und Software zu verstehen folgt mit (nicht unbedingt kompletter Logik) der Drang nach Wissen im Programmieren.
deets

Noeeeeeeeee, kann ich nicht, denn ich bin nicht dazu daaaaaaaa, dir mal eben so zu dein Arbeit zu machen. Sondern dir zu Hinweise zu geben, wie du das gaaaaaanz selbst loesen kannst. Sonst hast du doch gar keinen Spass daran. Und ich auch nicht...
Neo_Junior
User
Beiträge: 49
Registriert: Samstag 6. August 2011, 18:52

so,
ich glaube, ich habe das problem nicht ausreichend beleuchtet deswegen erstmal hier der code, er ist noch nicht fertig, denn ich möchte erst die events hinbekommen

Code: Alles auswählen

# -*- coding: iso-8859-1 -*-
import pygame,sys
from pygame.locals import *
class BallKlasse(pygame.sprite.Sprite):
    def __init__(self,bild,geschwindigkeit,ort):
        pygame.sprite.Sprite.__init__(self)
        self.image=pygame.image.load(bild)
        self.rect=self.image.get_rect()
        self.rect.left,self.rect.top=ort
        self.geschwindigkeit=geschwindigkeit
        
    def bewegen(self):
        global rechts
        self.rect = self.rect.move(self.geschwindigkeit)
        if self.rect.left<0: 
            rechts+=rechts
            self.geschwindigkeit[0]=-self.geschwindigkeit[0]
   
        if self.rect.right > 800:
            global links
            links+=links
            self.geschwindigkeit[0]=-self.geschwindigkeit[0]        
    
        if self.rect.top<=0:
            self.geschwindigkeit[1]=-self.geschwindigkeit[1]
        
        if self.rect.bottom>600:
            self.geschwindigkeit[1]=-self.geschwindigkeit[1]
class SchlaegerKlasse(pygame.sprite.Sprite):
    def __init__(self,ort=[0,0]):
        pygame.sprite.Sprite.__init__(self)
        image_surface = pygame.surface.Surface([5, 100],1)                 
        image_surface.fill([20,30,120])                                       
        self.image = image_surface.convert()                               
        self.rect = self.image.get_rect()                                 
        self.rect.left, self.rect.top = ort

pygame.init()
delay=50
interval=5
pygame.key.set_repeat(delay,interval)
screen=pygame.display.set_mode([800,600],1)
uhr=pygame.time.Clock()
ball_geschwindigkeit=[7.5,7.5]
ball=BallKlasse('G1-Kugel.png',ball_geschwindigkeit, [50, 50])
ballGruppe=pygame.sprite.Group(ball)
schlaeger1=SchlaegerKlasse([750,300])
schlaeger2=SchlaegerKlasse([50,300])




links=0
rechts=0
while 1:
    uhr.tick(40)
    pygame.display.set_caption("Multipong v1.1")
    screen.fill([255,255,255])
    for ereignis in pygame.event.get():                                     
        if ereignis.type == QUIT:                                           
            sys.exit()                                                   
        elif ereignis.type == KEYDOWN:
            if ereignis.key == K_DOWN:
                schlaeger1.rect.top=schlaeger1.rect.top+5
                   
            elif ereignis.key == K_UP:
                schlaeger1.rect.top=schlaeger1.rect.top-5
                   
            elif ereignis.key == K_s:
                schlaeger2.rect.top=schlaeger2.rect.top+5
                    
                    
            elif ereignis.key == K_w:
                schlaeger2.rect.top=schlaeger2.rect.top-5
                    
    
    
            
            
      
    if pygame.sprite.spritecollide(schlaeger1, ballGruppe, False):            
        
        ball.geschwindigkeit[0] = -ball.geschwindigkeit[0]
        
    if pygame.sprite.spritecollide(schlaeger2, ballGruppe, False):            
       
        ball.geschwindigkeit[0] = -ball.geschwindigkeit[0]      
    
    ball.bewegen()                                                        
    screen.blit(ball.image, ball.rect)                               
    screen.blit(schlaeger1.image, schlaeger1.rect)
    screen.blit(schlaeger2.image, schlaeger2.rect)                               
    pygame.display.flip()
in zeile 62 geht die event-schleife los.
ich glaube, das problem ist, dass ereignis immer nur mit einem wert also einem event belegen kann

so ich bitte dich und alle anderen, die mir helfen können, eine möglichst einfache, verständliche und wirkungsvolle lösung abzugeben, denn wenn du nur eine zeile schreibst, die mir nichts nützt, weil ich sie nicht verstehe, dann ist das doch eher sinnlos und ich traue dir ma zu, einen so sprechenden code-schnipsel zu liefern, dass ich ihn verstehe
-danke
Zuletzt geändert von Anonymous am Sonntag 4. September 2011, 21:26, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
Auf den Wunsch, Computer und Software zu verstehen folgt mit (nicht unbedingt kompletter Logik) der Drang nach Wissen im Programmieren.
Neo_Junior
User
Beiträge: 49
Registriert: Samstag 6. August 2011, 18:52

ey kommt schon helft mir pls ma alle

PS: was hat der moderator gemacht?
Zuletzt geändert von Neo_Junior am Mittwoch 7. September 2011, 14:00, insgesamt 1-mal geändert.
Auf den Wunsch, Computer und Software zu verstehen folgt mit (nicht unbedingt kompletter Logik) der Drang nach Wissen im Programmieren.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Neo_Junior hat geschrieben:ey kommt schon helft mir pls ma alle
Dann formuliere doch mal Deine Frage anschaulich! ggf. mit einem kleinen Bild oder einer ASCII Zeichnung, die verdeutlicht, was Du erreichen willst.
Neo_Junior hat geschrieben: PS: was hat der oderator gemacht?
Ich erkläre es Dir:
Quelltext in Python-Code-Tags gesetzt.
:-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Neo_Junior
User
Beiträge: 49
Registriert: Samstag 6. August 2011, 18:52

es ist eigentlich ganz einfach:

in der event-schleife sieht man, dass sich nach dem druck auf w,s,oben,unten die schläger 5 pixel nach oben oder unten bewegen
so.

Code: Alles auswählen

pygame.init()
delay=50
interval=5
pygame.key.set_repeat(delay,interval)
screen=pygame.display.set_mode([800,600],1)
uhr=pygame.time.Clock()
ball_geschwindigkeit=[7.5,7.5]
ball=BallKlasse('G1-Kugel.png',ball_geschwindigkeit, [50, 50])
ballGruppe=pygame.sprite.Group(ball)
schlaeger1=SchlaegerKlasse([750,300])
schlaeger2=SchlaegerKlasse([50,300])
hier ist das mit

delay=50
interval=5
pygame.key.set_repeat(delay,interval)

so und wenn nun eine der oben genannten tasten 50 milisekunden gedrückt gehalten wird, bewegen sich die schläger aller 5 millisekunden 5 pixel in die jeweilige richtung.
und wenn nun ein spieler eine taste gedrückt hält, und der andere gleich danach auch eine seiner tasten, dann stoppt der schläger des spielers, der seine taste als erstes gedrückt gehalten hatte, ich denke das liegt daran, dass in der event schleife immer nur ein event vorgesehen ist

und meine frage ist, wie man das beheben kann.


PS: das mit dem moderator hab ich selbst gelesen ich hab das nur nicht verstanden....

PS 2: ein 2. problem ist mir übrigens auch aufgefallen: wenn die ober-oder unterseite eines schlägers mit dem ball kollidiert, geht der ball in den schläger hinein, was kann man denn hier tun???
Auf den Wunsch, Computer und Software zu verstehen folgt mit (nicht unbedingt kompletter Logik) der Drang nach Wissen im Programmieren.
Neo_Junior
User
Beiträge: 49
Registriert: Samstag 6. August 2011, 18:52

BITTEEE helft mir!!!!!!
Auf den Wunsch, Computer und Software zu verstehen folgt mit (nicht unbedingt kompletter Logik) der Drang nach Wissen im Programmieren.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Neo_Junior hat geschrieben:BITTEEE helft mir!!!!!!
deets hat doch alles Passende geschrieben. Ich zitiere noch mal:
"Du bekommst von pygame key-pressed & key-released events. Und genau auf die musst du hoeren. Wenn der spieler "w" drueckt, faengst du an, so lange nach oben zu gehen, bis "w" losgelassen wird. Obacht geben, wenn "s" gedrueckt wird, aber "w" noch nicht losgelassen wurde: dann musst du natuerlich trotzdem so tun, als ob "w" losgelassen wurde.

Analog natuerlich fuer die Pfeiltasten."

Vielleicht mal etwas klarer: Du solltest die Bewegung nicht im Keydown-Event durchführen, sondern dir dort nur für jeden Spieler individuell merken, welche Taste er gedrückt hat.
Neo_Junior
User
Beiträge: 49
Registriert: Samstag 6. August 2011, 18:52

DAS hab ich verstanden danke habs schon ausprobiert und da ist eine Sache die mir einfach nicht in den mund passt:

Code: Alles auswählen

x=0
f=0
import pygame,sys

screen=pygame.display.set_mode([800,600],1)
while 1:
    if x==f:
           print 1
    for ereignis in pygame.event.get():

        if ereignis.type==pygame.KEYDOWN:
            if ereignis.key==pygame.K_f:
                x=f
                print 1
        if ereignis.type == pygame.QUIT:
            sys.exit()
so das ist mein test code wie genau schreibt man denn key-pressed oder key-released?
alles groß? und auch wohin besonders toll wäre es, wenn du meinen code entsprechend ergänzen würdest, denn sprechender code ist einfach leichter zu verstehen als erklärungen
und ich weis, dass es schwer ist, mir das alles mundgerecht zu machen aber ich bin 14 und kein profi nur eben mit dem allerbesten Willen einer zu werden ;-))
also danke schonmal...
Auf den Wunsch, Computer und Software zu verstehen folgt mit (nicht unbedingt kompletter Logik) der Drang nach Wissen im Programmieren.
BlackJack

@Neo_Junior: „key-pressed” oder „ley-released” schreibst Du gar nirgends hin. Das ist eine natürlichsprachliche Beschreibung der Ereignisse. Die Konstanten in Pygame heissen `pygame.KEYDOWN` und `pygame.KEYUP`.
deets

@Neo_Junior

Tut mir leid, aber dein permanentes insistieren, laeuffaehigen Code zu bekommen ist hart an der Grenze (wenn nicht drueber) zur Unverschaemtheit. Du zeigst nicht, das du dich systematisch mit der Programmierung beschaeftigst, sondern einfach immer nur cargo-cultige Versatzstuecke aus irgendwelchen Tutorien oder aehnlichem - in der Hoffnung, wir schreiben dir den Rest dazu.

Und da muss ich dich enttaeuschen: selbst wenn dir hier der beschriebene Code frei Haus geliefert wird - es wird immer nur Stueckwerk sein, und dein Traum vom grossen Spiel wird sich so nicht erfuellen. Du musst da schon selbst ran, und es wirklich *lernen*.
Neo_Junior
User
Beiträge: 49
Registriert: Samstag 6. August 2011, 18:52

ok dazu sag ich ma nur eins:
BlackJack hat geschrieben:@Neo_Junior: „key-pressed” oder „ley-released” schreibst Du gar nirgends hin. Das ist eine natürlichsprachliche Beschreibung der Ereignisse. Die Konstanten in Pygame heissen `pygame.KEYDOWN` und `pygame.KEYUP`.
DAS war hilfreich danke

deets hat geschrieben:@Neo_Junior

Tut mir leid, aber dein permanentes insistieren, laeuffaehigen Code zu bekommen ist hart an der Grenze (wenn nicht drueber) zur Unverschaemtheit. Du zeigst nicht, das du dich systematisch mit der Programmierung beschaeftigst, sondern einfach immer nur cargo-cultige Versatzstuecke aus irgendwelchen Tutorien oder aehnlichem - in der Hoffnung, wir schreiben dir den Rest dazu.

Und da muss ich dich enttaeuschen: selbst wenn dir hier der beschriebene Code frei Haus geliefert wird - es wird immer nur Stueckwerk sein, und dein Traum vom grossen Spiel wird sich so nicht erfuellen. Du musst da schon selbst ran, und es wirklich *lernen*.
DAS war momentan für mich überhaupt nicht hilfreich, außer ich hätte gewollt, dass mich jemand in meiner Motivation bremst ich möchte mich echt nicht aggressiv dagegen äußer vielleicht stimmt das ja und ich merks einfach nicht aber wo her soll ich das wissen ich meine meine ausrüstung ist das Buch "Hello World" und ein haufen englischsprachiger torturials irgendwo muss information herkommen und aus diesem grund frage ich und wenn du mir sagst wie ich wenn ich mich jeden tag 2 stunden hinsetzte und das lerne oder eben programmiere so etwas lernen könnte würde ich das sofort machen

ich versuche dich zu verstehen ich glaube für dich ist das alles kinderkram und dudelei aber ich bin eben noch nicht weiter

bitte versuche auch mich zu verstehen als einen durchschnittlichen menschen mit einem IQ unter 140 und einer 2 in englisch

danke
Auf den Wunsch, Computer und Software zu verstehen folgt mit (nicht unbedingt kompletter Logik) der Drang nach Wissen im Programmieren.
deets

@Neo_Junior

Ich habe schon in meiner ersten Antwort gesagt, worauf es ankommt. Das ich das mit englischen, umgangssprachlichen Begriffen getan habe, mag es fuer dich unnoetig schwieriger gemacht haben - aber das kann ich nicht ahnen, und das lies sich ja dann durch eine Nachfrage schnell klaeren.

Deine Antwort ist aber
kannst du pls ma den code für deine events oder eben deren erkennung reinschreiben?
Du hast also nicht versucht, deine Verstaendnisprobleme zu kommunizieren. Sondern code gefordert. Und das ist ja hier nicht der erste Thread, in dem das so geht.

Erst eine halbe Ewigkeit spaeter kommst du auf die Idee zu fragen, was denn mit (m)einer Antwort gemeint sein koennte. Und genau auf dieses Verhalten bezog sich meine vermeintlich nicht hilfreiche letzte Antwort.
Neo_Junior
User
Beiträge: 49
Registriert: Samstag 6. August 2011, 18:52

ok ich merke, das wir uns "näherkommen" in dem sinne, dass wir immer weniger an einander vorbei reden.

ich will keinen code um etwas zu schaffen oder ein fertiges programm zu erhalten(spornt aber natürlich mehr an ;-) ), sondern um daraus zu lernendie frage nach dem code war also deshlab gestellt, weil ich dachte die rübergebrachten infos so besser materialisieren zu können.
es geht immer anders aber ok

ich bin hier fertig, denn der fehler ist behoben UND ich weis wie und warum er aufgetreten ist (siehe neue signatur)

also als zusammenfassung:

Danke
Auf den Wunsch, Computer und Software zu verstehen folgt mit (nicht unbedingt kompletter Logik) der Drang nach Wissen im Programmieren.
Antworten