Seite 1 von 1

Problem bei Kollisionsabfrage

Verfasst: Mittwoch 10. August 2011, 12:37
von Newcomer
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 (:

Re: Problem bei Kollisionsabfrage

Verfasst: Mittwoch 10. August 2011, 12:53
von Newcomer
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

Re: Problem bei Kollisionsabfrage

Verfasst: Mittwoch 10. August 2011, 13:06
von Hyperion
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).

Re: Problem bei Kollisionsabfrage

Verfasst: Mittwoch 10. August 2011, 13:27
von Newcomer
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()