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()
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