ydwb 发表于 2024-11-18 14:05:12

cocos2d python 画一个圆在pymunk重力下自由下落

在cocos2d python界面画一个圆,在pymunk重力下自由下落,以下代码如何修改?# coding: utf-8
import cocos
import pymunk
from pyglet.gl import *
from math import cos, tan, pi
class Hello(cocos.layer.Layer):
    def __init__(self):
      super(Hello, self).__init__()
      self.ball_body, self.ball_shape = create_ball(self)
      self.space.add(self.ball_body, self.ball_shape)

      # 创建Pymunk空间
      self.space = pymunk.Space()
      self.space.gravity = (0, -300)
      self.elapsed = 0
      self.schedule(self.update)

      # 创建圆的Pymunk body和shape
      radius = 20
      mass = 1000
      moment = pymunk.moment_for_circle(mass, 0, radius)
      self.cbody = pymunk.Body(mass, moment)
      self.cbody.position = 300, 300
      self.c = pymunk.Circle(self.cbody, radius)
      self.space.add(self.cbody, self.c)

    def create_ball(self):
      super().draw()
      self.circle_center = (300, 300)
      self.circle_radius = 20
      # 设置颜色为绿色并绘制圆
      glColor4ub(0, 255, 0, 255)
      num_segments = 100
      theta = 2 * pi / num_segments
      tangetial_factor = tan(theta)# Calculate the tangential factor
      radial_factor = cos(theta)# Calculate the radial factor
      x = self.circle_radius# Start at angle = 0
      y = 0
      glBegin(GL_LINE_LOOP)
      for i in range(num_segments):
            glVertex2f(x + self.circle_center, y + self.circle_center)
            tx = -y
            ty = x
            x += tx * tangetial_factor
            y += ty * tangetial_factor
            x *= radial_factor
            y *= radial_factor
      glEnd()

      self.ball_body = pymunk.Body(body_type=pymunk.Body.KINEMATIC)
      self.ball_shape = pymunk.Poly(self.ball_body, self.circle)
      self.ball_shape.friction = 0.5
      self.ball_shape.collision_type = 1
      self.ball_shape.density = 0.1
      return self.ball_body, self.ball_shape

    def update(self, dt):
      self.space.step(dt)
      self.ball.position = self.cbody.position

if __name__ == "__main__":
    cocos.director.director.init()
    hello_layer = Hello()
    main_scene = cocos.scene.Scene(hello_layer)
    cocos.director.director.run(main_scene)

FishC 发表于 2024-11-18 14:13:53

要在 Cocos2d-python 中使用 Pymunk 实现一个圆在重力下自由下落,您需要正确创建和更新圆的物理表现和显示。以下是对您提供的代码的修正,以确保圆正确地在重力影响下下落:

import cocos
import pymunk
from pyglet.gl import *
from math import cos, tan, pi

class Hello(cocos.layer.Layer):
    def __init__(self):
      super(Hello, self).__init__()

      # 创建Pymunk空间
      self.space = pymunk.Space()
      self.space.gravity = (0, -300)

      # 创建圆的Pymunk body和shape
      radius = 20
      mass = 10# 质量设为较小的值以便测试
      moment = pymunk.moment_for_circle(mass, 0, radius)
      self.cbody = pymunk.Body(mass, moment)
      self.cbody.position = (300, 300)
      self.c = pymunk.Circle(self.cbody, radius)
      self.c.friction = 0.5
      self.c.elasticity = 0.9# 加入一点弹性
      self.space.add(self.cbody, self.c)

      self.schedule(self.update)

    def draw(self):
      # 设置颜色为绿色并绘制圆
      glColor4ub(0, 255, 0, 255)
      num_segments = 100
      theta = 2 * pi / num_segments
      tangetial_factor = tan(theta)# 计算切线因子
      radial_factor = cos(theta)# 计算径向因子

      x = self.c.radius# 起始点为角度0
      y = 0

      glPushMatrix()
      glTranslatef(self.cbody.position.x, self.cbody.position.y, 0)
      glBegin(GL_LINE_LOOP)
      for i in range(num_segments):
            glVertex2f(x, y)
            tx = -y
            ty = x
            x += tx * tangetial_factor
            y += ty * tangetial_factor
            x *= radial_factor
            y *= radial_factor
      glEnd()
      glPopMatrix()

    def update(self, dt):
      self.space.step(dt)

if __name__ == "__main__":
    cocos.director.director.init()
    hello_layer = Hello()
    main_scene = cocos.scene.Scene(hello_layer)
    cocos.director.director.run(main_scene)

### 修改要点:
1. **创建Pymunk Body的类型和设置**:我将body的类型设置为动态(去掉了KINEMATIC类型),它会自然地受到重力影响。
2. **正确绘制圆**:确保每次绘制时都是以 `self.cbody.position` 作为中心来进行绘制,以体现下落效果。
3. **物理属性**:调整了弹性(elasticity)和摩擦力(friction),以简单模拟现实效果。
4. **删除冗余代码**:去掉了不必要的代码和重复定义的函数参数。

这些修改确保了圆的物理行为和图形显示能够同步,即圆能够因重力而下落并在屏幕上看到其移动。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: cocos2d python 画一个圆在pymunk重力下自由下落