मैं एक ऐसा गेम बना रहा हूं जिसमें गेंद के आसपास के अंदर उछालती है। बड़ा सर्कल हिलता नहीं है।पायथन और पायगम: सर्कल के इंटीरियर के साथ बॉल टकराव
def collideCircle(circle, ball):
"""Check for collision between a ball and a circle"""
dx = circle.x - ball.x
dy = circle.y - ball.y
distance = math.hypot(dx, dy)
if distance >= circle.size + ball.size:
# We don't need to change anything about the circle, just the ball
tangent = math.atan2(dy, dx)
ball.angle = 2 * tangent - ball.angle
ball.speed *= elasticity + 0.251
angle = 0.5 * math.pi + tangent
ball.x -= math.sin(angle)
ball.y += math.cos(angle)
यह पीटर Collingridge over here द्वारा अद्भुत ट्यूटोरियल पर आधारित है:
यहाँ कोड है कि मैं वर्तमान में इन टक्करों के लिए उपयोग कर रहा हूँ है।
सर्कल और बॉल ऑब्जेक्ट्स दोनों कक्षाएं हैं (x, y), त्रिज्या, कोण और गति के साथ।
मैं इस विधि के साथ दो समस्याओं, हालांकि हो रहा है:
- गेंद से बाउंस (मैं क्या संदेह है) ने अपने "लंगर बिंदु" है, जो वृत्त के ऊपरी दाएं कोने में हो रहा है है।
- सर्कल के नीचे 5% के साथ टकराने के दौरान, स्क्रीन के बाहर पर्याप्त उच्च उछाल और इसलिए "सिंक" में विफल रहता है। मुझे लगता है कि ऐसा इसलिए है क्योंकि यह उछाल गेंद को अपने (गलत तरीके से रखा गया) "एंकर पॉइंट" से ऊपर ले जाने के लिए पर्याप्त नहीं है?
संभवतः यहां पर संभावित समाधानों को देखते हुए, विशेष रूप से "फास्ट सर्कल टकराव का पता लगाने" [लिंक स्पैम लिंक सीमा के कारण हटा दिया गया], जो जावा में एक ही विधि का उपयोग कर रहा है, ये सभी बाहरी टकरावों से निपटते हैं, जबकि मैं एक सर्कल के इंटीरियर के चारों ओर एक गेंद उछाल देख रहा हूँ।
class Ball():
def __init__(self, (x,y), size):
"""Setting up the new instance"""
self.x = x
self.y = y
self.size = size
self.colour = (0,128,255)
self.thickness = 0
self.speed = 0.01
self.angle = math.pi/2
def display(self):
"""Draw the ball"""
pygame.draw.circle(screen, self.colour, (int(self.x), int(self.y)), self.size, self.thickness)
def move(self):
"""Move the ball according to angle and speed"""
self.x += math.sin(self.angle) * self.speed
self.y -= math.cos(self.angle) * self.speed
(self.angle, self.speed) = addVectors((self.angle, self.speed), gravity)
self.speed *= drag
class Circle():
def __init__(self, (x,y), size):
"""Set up the new instance of the Circle class"""
self.x = x
self.y = y
self.size = size
self.colour = (236, 236, 236)
self.thickness = 0
self.angle = 0 # Needed for collision...
self.speed = 0 # detection against balls
def display(self):
"""Draw the circle"""
pygame.draw.circle(screen, self.colour, (int(self.x), int(self.y)), self.size, self.thickness
अग्रिम धन्यवाद, नाथन
एक्स अक्ष को कोण के कोसाइन और साइन द्वारा वाई अक्ष द्वारा परिभाषित नहीं किया जाएगा? या मैंने गलत सीखा? : एक्स – JCM
मुझे लगता है कि आप सही हैं कि चीजों को परिभाषित करने का यह मानक तरीका है, लेकिन जब तक आप लगातार हैं, यह वास्तव में कोई फर्क नहीं पड़ता है। स्पष्ट रूप से यदि आप 90 डिग्री से सब कुछ घुमाते हैं, तो इससे प्रभावित नहीं होना चाहिए कि चीजें कैसे उछालती हैं (गुरुत्वाकर्षण मानते हुए भी बदलते हैं)। –
@ पीटरकॉलिंग्रिज, आपके लेख * अद्भुत * हैं!सुरुचिपूर्ण समाधान, पायथन शैली, बधाई .. और धन्यवाद! – MestreLion