鱼C论坛

 找回密码
 立即注册
查看: 81|回复: 1

[已解决]cocos2d python 画一个圆在pymunk重力下自由下落

[复制链接]
发表于 3 天前 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
在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[0], y + self.circle_center[1])
            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)
最佳答案
3 天前
要在 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 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 3 天前 | 显示全部楼层    本楼为最佳答案   
要在 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 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-21 17:24

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表