Problem bei Kollisionsabfrage

Hier werden alle anderen GUI-Toolkits sowie Spezial-Toolkits wie Spiele-Engines behandelt.
Antworten
Newcomer
User
Beiträge: 131
Registriert: Sonntag 15. Mai 2011, 20:41

Hi, also ich hab wieder ein Problem:

Code: Alles auswählen

from pg_start import *
from time import clock
class Ball(pygame.sprite.Sprite):
    def __init__(self,x,y):
        pygame.sprite.Sprite.__init__(self)
        self.image=load_image("C:/Users/Username/Desktop/Spiele/Physiksimulation/Ball.png",-1)
        self.rect=self.image.get_rect(center=(900,900))
        self.screenrect=pygame.display.get_surface().get_rect()
        self.keystate="NOTPRESSED"
        self.T=0
        self.Sx,self.Sy=0,0
        self.x,self.y=x,y
    def update(self,events):
        if any(pygame.mouse.get_pressed()):
            if self.rect.collidepoint(pygame.mouse.get_pos()):
                self.keystate="PRESSED"
                self.rect.center=pygame.mouse.get_pos()
                self.T=clock()
                self.Sx,self.Sy=pygame.mouse.get_pos()[0],pygame.mouse.get_pos()[1]
                
            elif not self.rect.collidepoint(pygame.mouse.get_pos()):
                if self.keystate=="PRESSED":
                    self.rect.center=pygame.mouse.get_pos()
                    

                    
                
        else:
            self.keystate="NOTPRESSED"
            if self.Sx and self.Sy and self.T:
                self.x=(pygame.mouse.get_pos()[0]-self.Sx)/(clock()-self.T)
                self.y=(pygame.mouse.get_pos()[1]-self.Sy)/(clock()-self.T)
                self.Sx,self.Sy,self.T=0,0,0

            
            if not self.screenrect.contains(self.rect.move(self.x,0)):
                self.x=-self.x
            if not self.screenrect.contains(self.rect.move(0,self.y)):
                self.y=-self.y
                    
                    
            self.rect.move_ip(self.x,self.y)
                
                
                
                
                
                
        
        
        
            





def main():
    screen,clock=init_general((0,0),FULLSCREEN,32)
    b_g = pygame.sprite.GroupSingle()
    ball=Ball(0,0)
    b_g.add(ball)
    
    while True:
        clock.tick(10)
        events=pygame.event.get()
        pygame.key.set_repeat(100,100)
        for event in events:
            if event.type == KEYDOWN:
                if event.key == K_ESCAPE:
                    exit()
        screen.fill((0,0,0))
        b_g.update(events)
        b_g.draw(screen)
        pygame.display.flip()
        
main()
Ich wollte ein bisschen Physik simulieren, doch stieß ich auf folgendes Problem:
1. Der Ball wird nach einiger Zeit herumschleudern viel zu schnell. Man kann ihn kaum sehen. (Nur mit niedriger Framerate)
2. Der Ball prallt nich an den Ecken des Bldschirms ab, sondern schon davor, da die Bewegung von x,y zu groß wäre. Wie kann ich diese Probleme beheben
Danke im Vorraus (:
Newcomer
User
Beiträge: 131
Registriert: Sonntag 15. Mai 2011, 20:41

Oh habs jetzt selbst geschafft. Ist mir gekommen als ich den Artikel verfasst hab:

Code: Alles auswählen

from pg_start import *
from time import clock
class Ball(pygame.sprite.Sprite):
    def __init__(self,x,y):
        pygame.sprite.Sprite.__init__(self)
        self.image=load_image("C:/Users/Jan/Desktop/Spiele/Physiksimulation/Ball.png",-1)
        self.rect=self.image.get_rect(center=(900,900))
        self.screenrect=pygame.display.get_surface().get_rect()
        self.keystate="NOTPRESSED"
        self.T=0
        self.Sx,self.Sy=0,0
        self.x,self.y=x,y
    def update(self,events):
        if any(pygame.mouse.get_pressed()):
            if self.rect.collidepoint(pygame.mouse.get_pos()):
                self.keystate="PRESSED"
                self.rect.center=pygame.mouse.get_pos()
                self.T=clock()
                self.Sx,self.Sy=pygame.mouse.get_pos()[0],pygame.mouse.get_pos()[1]
                
            elif not self.rect.collidepoint(pygame.mouse.get_pos()):
                if self.keystate=="PRESSED":
                    self.rect.center=pygame.mouse.get_pos()
                    

                    
                
        else:
            self.keystate="NOTPRESSED"
            if self.Sx and self.Sy and self.T:
                self.x=(pygame.mouse.get_pos()[0]-self.Sx)/(clock()-self.T)
                self.y=(pygame.mouse.get_pos()[1]-self.Sy)/(clock()-self.T)
                self.Sx,self.Sy,self.T=0,0,0

            
            if not self.screenrect.contains(self.rect.move(self.x/100,0)):
                self.x=-self.x
            if not self.screenrect.contains(self.rect.move(0,self.y/100)):
                self.y=-self.y
                    
                    
            self.rect.move_ip(self.x/100,self.y/100)
                
                
                
                
                
                
        
        
        
            





def main():
    screen,clock=init_general((0,0),FULLSCREEN,32)
    b_g = pygame.sprite.GroupSingle()
    ball=Ball(0,0)
    b_g.add(ball)
    
    while True:
        clock.tick(100)
        events=pygame.event.get()
        pygame.key.set_repeat(100,100)
        for event in events:
            if event.type == KEYDOWN:
                if event.key == K_ESCAPE:
                    exit()
        screen.fill((0,0,0))
        b_g.update(events)
        b_g.draw(screen)
        pygame.display.flip()
        
main()
Das wärst dann. Trotzdem Danke
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Du machts hier wieder dieselben Fehler, wie in diesem Thread. Du solltest auch mehr auf PEP8 achten, wenn Du hier Code postest; diese zig sinnlosen Leerzeilen vor ``elif`` und vor der ``main``-Funktion solltest Du sinnvoller zwischen die Methoden setzen (normalerweise 2 Leerzeilen zwischen Klassen und Funktionen, und 1 Leerzeichen zwischen Methoden).
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Newcomer
User
Beiträge: 131
Registriert: Sonntag 15. Mai 2011, 20:41

also dann so?:

Code: Alles auswählen

from pg_start import *
from time import clock
class Ball(pygame.sprite.Sprite):
    "Objekt für Physiksimulation"

    def __init__(self,x,y):
        pygame.sprite.Sprite.__init__(self)
        self.image=load_image("C:/Users/Jan/Desktop/Spiele/Physiksimulation/Ball.png",-1)
        self.rect=self.image.get_rect(center=(900,900))
        self.screenrect=pygame.display.get_surface().get_rect()
        self.keystate="NOTPRESSED"
        self.T=0
        self.Sx,self.Sy=0,0
        self.x,self.y=x,y

    def update(self,events):
        "Updatet bei jedem Schleifendurchlauf."
        # Prüft ob irg. button gedrückt ist
        if any(pygame.mouse.get_pressed()):
            if self.rect.collidepoint(pygame.mouse.get_pos()):
                self.keystate="PRESSED"
                self.rect.center=pygame.mouse.get_pos()
                self.T=clock()
                self.Sx,self.Sy=pygame.mouse.get_pos()[0],pygame.mouse.get_pos()[1]
            elif not self.rect.collidepoint(pygame.mouse.get_pos()):
                if self.keystate=="PRESSED":
                    self.rect.center=pygame.mouse.get_pos()
        else:
            self.keystate="NOTPRESSED"
            if self.Sx and self.Sy and self.T:
                self.x=(pygame.mouse.get_pos()[0]-self.Sx)/(clock()-self.T)
                self.y=(pygame.mouse.get_pos()[1]-self.Sy)/(clock()-self.T)
                self.Sx,self.Sy,self.T=0,0,0
            if not self.screenrect.contains(self.rect.move(self.x/100,0)):
                self.x=-self.x
            if not self.screenrect.contains(self.rect.move(0,self.y/100)):
                self.y=-self.y        
            self.rect.move_ip(self.x/100,self.y/100)
                            

def main():
    screen,clock=init_general((0,0),FULLSCREEN,32)
    b_g = pygame.sprite.GroupSingle()
    ball=Ball(0,0)
    b_g.add(ball)  
    while True:
        clock.tick(100)
        events=pygame.event.get()
        pygame.key.set_repeat(100,100)
        for event in events:
            if event.type == KEYDOWN:
                if event.key == K_ESCAPE:
                    exit()
        screen.fill((0,0,0))
        b_g.update(events)
        b_g.draw(screen)
        pygame.display.flip()
        
if __name__=="__main__":main()
Antworten