Python & Pygame: alle elementen in een lijst bijwerken onder een lus tijdens iteratie

ik ben bezig met een programma in Python en met Pygame. dit is hoe de basiscode eruit ziet:

while 1:

   screen.blit(background, (0,0))
   for event in pygame.event.get():

      if event.type == QUIT:
        pygame.quit()
        sys.exit()

      if event.type == KEYDOWN and event.key == K_c:
        circle_create = True
        circle_list.append(Circle())

      if event.type == MOUSEBUTTONDOWN and circle_create == True:
        if clicks == 0:
            circle_list[i].center()
        clicks += 1


      if event.type == MOUSEMOTION and clicks == 1 and circle_create == True:
        circle_list[i].stretch()

   if circle_create == True:
     circle_list[i].draw_circle()

   if clicks == 2:
     clicks = 0
     i += 1
     circle_create = False    

 pygame.display.update()

wat ik wil doen is de functie van het object draw_circle() hebben om constant te worden bijgewerkt door de lus zodat de getekende cirkel wordt weergegeven voor alle objecten in de lijst, maar omdat de lijst wordt herhaald, wordt het nieuwe toegevoegde object en de objecten bijgewerkt al toegevoegd zijn niet bijgewerkt.

Het programma werkt, het trekt de cirkels naar gebruikersinvoer, maar het probleem met de update is het enige probleem dat ik moet oplossen. Is er een manier om alle elementen in de lijst met objecten te laten bijwerken door de while-lus? ik heb het vele dagen geprobeerd en ik heb geen goede oplossing kunnen vinden. alle ideeën worden op prijs gesteld. Bedankt

0
Ja. de code werkt goed en zo, alles werkt goed. de enige problemen zijn het bijwerken van de draw_circle() voor elk object in de lijst ... op die manier is de getekende cirkel zichtbaar
toegevoegd de auteur starhacker, de bron
nou, de lijst zal door de gebruiker blijven groeien. ik zou de groeiende lijst dusdanig moeten herhalen dat alle cirkels constant worden getekend en bijgewerkt, welke lus zal daarvoor beter geschikt zijn? terwijl of voor?
toegevoegd de auteur starhacker, de bron
'i' wordt alleen gebruikt om toegang te krijgen tot een index in de lijst 'circle_list'.
toegevoegd de auteur starhacker, de bron
ik heb de loop nodig om meerdere cirkels te maken (zoveel als de gebruiker wil). dat is waar het probleem is. hoe je meerdere cirkels kunt laten tekenen met verschillende variabelen die constant worden bijgewerkt omdat het scherm tijdens de lus constant wordt gebladerd
toegevoegd de auteur starhacker, de bron
de lus eindigt wanneer event.type == QUIT
toegevoegd de auteur starhacker, de bron
Dus waarom zou u niet alle cirkels tekenen door de volledige lijst te doorlopen?
toegevoegd de auteur Dhara, de bron
2. Wat is 'ik' in bovenstaande code?
toegevoegd de auteur Dhara, de bron
1. Kunt u de vraag op dezelfde manier in de code inspringen, zodat u daar geen commentaar meer op krijgt
toegevoegd de auteur Dhara, de bron
Voeg geen tekst toe met de tekst "deze statements bevinden zich onder de while-lus". Corrigeer uw geplakte code zodat die uitspraken onder de while-lus staan. Ik heb je code bewerkt, zodat deze overeenkomt met wat je hier zegt. Bewerk het opnieuw als het niet correct is.
toegevoegd de auteur BrenBarn, de bron
Maar wanneer event.type == QUIT u sys.exit aanroept, lijkt het erop dat dit het hele programma beëindigt, niet alleen de lus.
toegevoegd de auteur BrenBarn, de bron
Is uw code correct ingesprongen? Het lijkt erop dat je while-lus nooit zal eindigen, omdat je geen pauze hebt.
toegevoegd de auteur BrenBarn, de bron

3 antwoord

Als u alle kringen in uw lijst wilt tekenen, typt u ze gewoon door en tekent u ze vóór elke oproep om bij te werken:

for circle in circle_list:
    circle.draw_circle()

Bewerken: de OP had verkeerd geformatteerde code gepost, maar zegt dat de eigenlijke code in orde is, dus verwijderde die suggestie

1
toegevoegd
alright. Ja dat werkt. ik zag het aanvankelijk niet omdat de C ++ mentaliteit me de details van de lussen van python deed vergeten. erg bedankt
toegevoegd de auteur starhacker, de bron
oh dom van mij. ik heb het nu. bedankt dat het werkt.
toegevoegd de auteur starhacker, de bron
Nee. om draw_circle te kunnen aanroepen, moet deze worden benaderd door de lijst circle_list [i] .draw_circle ()
toegevoegd de auteur starhacker, de bron
de code is juist ingesprongen net toen ik het in dit blog/forum typte was de inspringing uitgeschakeld. het programma werkt prima. het tekent de cirkel maar verdwijnt daarna omdat circle_list [i] .draw_circle() alleen de cirkel in de huidige iteratie tekent. ik heb een manier nodig om de programma-update circle_list [i] .draw_circle() voor alle elementen te vertellen en niet de huidige iteratie
toegevoegd de auteur starhacker, de bron
Welnu, corrigeer alstublieft uw inspringing in de vraag
toegevoegd de auteur Dhara, de bron
U hebt geen toegang tot draw_circle met de lijst in die instructie, u opent deze met een lijstelement . In de for-lus hierboven is cirkel een list-element net zoals circle_list [i] is
toegevoegd de auteur Dhara, de bron
Ik zou willen voorstellen om de lijst niet te kopiëren, tenzij je: de expressie [:] de lijst kopieert voordat ze er door heen gaat en dat is een extra overhead. Accepteer ook het antwoord als het je probleem oplost :)
toegevoegd de auteur Dhara, de bron

Je moet de hele lijst opnieuw tekenen na je blit (het bedekt het hele scherm met de oppervlakte 'achtergrond' en 'wist' het), het is niet voorwaardelijk, je moet de hele lijst herhalen en tekenen. Hen in het evenementdeel beslis je wie er binnenkomt en wie de lijst verlaat.

Loop:
  Blit,starting new

  Event, here you decide who moves, who begin or cease to exist(append/remove)

  Redraw whole list, everyone in the circle_list.
1
toegevoegd
Ja dat weet ik. Ik probeer een methode te bedenken om de hele groeielijst effectief opnieuw te tekenen.
toegevoegd de auteur starhacker, de bron
Ik kan de spritegroepen voorstellen, pygame.org/docs /ref/sprite.html#pygame.sprite.Sprite , hebt u alleen uw instantie van Circle nodig om de kenmerken. schaduw (surface instance) en a. rect (rect instance) te hebben. Voeg vervolgens uw circle-instanties eraan toe en roep de .raw-methode aan, waarmee elk item van de groep wordt getekend.
toegevoegd de auteur Not a privileged user, de bron

edit: I thought you already tried : https://stackoverflow.com/a/11172885/341744

Het programma, werkt, het tekent de cirkels op gebruikersinvoer maar de   update probleem is het enige probleem dat ik moet oplossen. Is er een?   mogelijke manier om alle elementen in de lijst met objecten te laten bijwerken   door de while-lus?

U kunt een tijdelijke lijst herhalen, bijvoorbeeld als u acteurs doodt terwijl ze itereren.

for circle in circles[:]:
    circle.update()
0
toegevoegd