Kollisionsmodell

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
jonas
User
Beiträge: 156
Registriert: Dienstag 9. September 2008, 21:03

Donnerstag 5. Februar 2009, 12:49

Hi Leute,
Habe hier ein bisschen was gecodet, was aber nicht so funktioniert wie ich es mir vorstelle, doch ich finde den Fehler einfach nicht.
Die Quadrate können vom Rand abprallen (funktioniert) nun hätte
ich gerne noch, dass sie voneinander abprallen, aber ich bekomme
es nicht hin.

Code: Alles auswählen

import Tkinter as tk

class Feld (object):

    def __init__ (self, title, width, height):

        self.root = tk.Tk()
        self.root.title(title)
        self.width = width
        self.height = height

        self.canvas = tk.Canvas(width=self.width,
                                height=self.height,
                                bg="white")
        
        self.canvas.pack(expand="YES")

    def loopy (self):

        self.root.mainloop()

class Quadrat (object):

    def __init__ (self, parent, PosX, PosY, KantLaeng, speedX, speedY, color):

        self.k = KantLaeng
        self.speedX = speedX
        self.speedY = speedY
        self.PosX = PosX
        self.PosY = PosY
        self.parent = parent
        self.canvas = self.parent.canvas
        self.color = color
        self.o = 0
        self.l = 0
        self.r = 0
        self.u = 0

    def draw_self (self):
        self.q = self.canvas.create_rectangle(self.PosX,self.PosY,
                                              self.PosX+self.k,
                                              self.PosY+self.k,
                                              fill=self.color)
        
        self.canvas.update()

    def add_friend (self, friend):
        self.friend = friend

    def collide_frame (self):
        if self.PosX < 0 or self.PosX+self.k > self.parent.width:
            self.speedX = -self.speedX
        if self.PosY < 0 or self.PosY+self.k > self.parent.height:
            self.speedY = -self.speedY

    def collide_friend (self):

        if (self.PosX,self.PosY) in self.friend.o:
            print "ObenLinks -> oben"
            self.speedX = -self.speedX
            self.speedY = -self.speedY
        elif (self.PosX,self.PosY) in self.friend.l:
            print "ObenLinks -> links"
            self.speedX = -self.speedX
            self.speedY = -self.speedY
        elif (self.PosX,self.PosY) in self.friend.r:
            print "ObenLinks -> rechts"
            self.speedX = -self.speedX
            self.speedY = -self.speedY
        elif (self.PosX,self.PosY) in self.friend.u:
            print "ObenLinks -> unten"
            self.speedX = -self.speedX
            self.speedY = -self.speedY

        elif (self.PosX+self.k,self.PosY) in self.friend.o:
            print "ObenRechts -> oben"
            self.speedX = -self.speedX
            self.speedY = -self.speedY
        elif (self.PosX+self.k,self.PosY) in self.friend.l:
            print "ObenRechts -> links"
            self.speedX = -self.speedX
            self.speedY = -self.speedY
        elif (self.PosX+self.k,self.PosY) in self.friend.r:
            print "ObenRechts -> rechts"
            self.speedX = -self.speedX
            self.speedY = -self.speedY
        elif (self.PosX+self.k,self.PosY) in self.friend.u:
            print "ObenRechts -> unten"
            self.speedX = -self.speedX
            self.speedY = -self.speedY

        elif (self.PosX,self.PosY+self.k) in self.friend.o:
            print "UntenLinks -> oben"
            self.speedX = -self.speedX
            self.speedY = -self.speedY
        elif (self.PosX,self.PosY+self.k) in self.friend.l:
            print "UntenLinks -> links"
            self.speedX = -self.speedX
            self.speedY = -self.speedY
        elif (self.PosX,self.PosY+self.k) in self.friend.r:
            print "UntenLinks -> rechts"
            self.speedX = -self.speedX
            self.speedY = -self.speedY
        elif (self.PosX,self.PosY+self.k) in self.friend.u:
            print "UntenLinks -> unten"
            self.speedX = -self.speedX
            self.speedY = -self.speedY

        elif (self.PosX+self.k,self.PosY+self.k) in self.friend.o:
            print "UntenRechts -> oben"
            self.speedX = -self.speedX
            self.speedY = -self.speedY
        elif (self.PosX+self.k,self.PosY+self.k) in self.friend.l:
            print "UntenRechts -> links"
            self.speedX = -self.speedX
            self.speedY = -self.speedY
        elif (self.PosX+self.k,self.PosY+self.k) in self.friend.r:
            print "UntenRechts -> rechts"
            self.speedX = -self.speedX
            self.speedY = -self.speedY
        elif (self.PosX+self.k,self.PosY+self.k) in self.friend.u:
            print "UntenRechts -> unten"
            self.speedX = -self.speedX
            self.speedY = -self.speedY

    def collide_friend2 (self):
        for i in self.bbb:
            if i in self.friend.bbb:
                self.speedX = -self.speedX
                self.speedY = -self.speedY

    def collide_friend3 (self):
        if self.friend.PosX < self.PosX < self.friend.PosX+self.friend.k:
            self.speedX = -self.speedX
        
        if self.friend.PosY < self.PosY < self.friend.PosY+self.friend.k:
            self.speedY = -self.speedY

    def collide_friend4 (self):
        if self.friend.PosX < self.PosX < self.friend.PosX+self.friend.k and self.friend.PosY < self.PosY < self.friend.PosY+self.friend.k:
            self.speedX = -self.speedX
            self.speedY = -self.speedY
            
    def get_box (self):
        
        self.o = [(x,self.PosY) for x in range(self.PosX,self.PosX+self.k)]
        self.l = [(self.PosX,y) for y in range(self.PosY,self.PosY+self.k)]
        self.r = [(self.PosX+self.k,y) for y in range(self.PosY,self.PosY+self.k)]
        self.u = [(x,self.PosY+self.k) for x in range(self.PosX,self.PosX+self.k)]

    def get_box2 (self):

        self.bbb = [(x,y) for x in range(self.PosX,self.PosX+self.k) for y in range(self.PosY,self.PosY+self.k)]

    def move_self(self):
        
        self.PosX += self.speedX
        self.PosY += self.speedY

        #self.get_box2()

        self.collide_frame()
        self.collide_friend4()

        self.canvas.move(self.q, self.speedX, self.speedY)
        self.canvas.update()
        self.canvas.after(4,self.move_self)

    def run(self):
        self.draw_self()
        self.move_self()
            


if __name__ == "__main__":

    f = Feld("Kollisionsmodell",500,500)

    q1 = Quadrat(f,30,30,50,5,3,"yellow")
    q2 = Quadrat(f,100,100,50,4,8,"red")

    q1.add_friend(q2)
    q2.add_friend(q1)

    q1.run()
    q2.run()
    
    f.loopy()

Mein letzter Versuch "collide_friend4" funktioniert nicht so
toll, weil sich die Quadrate teilweise ineinander verfangen... :(
Vielleicht habt ihr eine Idee...
"get_box" funktioniert nicht so gut, weil der Speed, der zur Position dazu addiert
wird dazu führen kann, dass die Ecken auf die ich versucht
habe zu testen bereits im Quadrat liegen und es so keine Kollision gibt.
"get_box2" ist viel zu langsam und zu rechenaufwändig, alles läuft in Zeitlupe.

MfG Jonas :wink:
Antworten