实现小球随机碰撞,最好分析

其实用flash actionscript实现地更快更好...

这个程序很锻炼新手能力哦~

面向对象的分析与设计:
1.把小球看成是一个对象,且自身就是一个线程,能控制自身的运动。

设计具有以下属性和(行为)方法,
属性:
  x:横坐标
  y:纵坐标
  speed:小球运动的直线速度
  alpha:小球运动的方向。记为小球运动方向和12点钟的顺时针的夹角
   

方法:
  move():根据小球当前的属性值来运动
  run():控制小球运动的线程

2.运动的分析:
设在某一时刻t0,小球处于屏幕中任意一点,即其位置为x和y,如果小球是

水平或垂直运动的话,那么在下一时刻t1,只需将小球的横或纵坐标加或减

一个值,并将这个加后或减后的值重新作为小球的x,y就能实现小球位置的

变化,只要t1-t0足够小,运动就能产生。
但这里有两个问题:
a:小球的坐标要加或减的值是多少?
这个值是t1-t0的一段时间,小球移动的一段距离,这个距离值实际上就是

小球的速度值,即speed,单位是pixel/(1/36)s,叫做"像素每36分之一秒"

,为什么是36分之一秒内移动speed个像素?因为这样一来,1秒钟就能显

示36幅小球在不同位置的画面,根据电影原理,人眼在每秒看到36幅画面

时,感觉最为流畅。

b.假设小球不是水平或垂直运动,而是向任意方向运动的话,这个距离如何

计算?
在面板中的坐标系,横轴是向右,纵轴是向下,原点在面板的左上角。这一

点跟我们在中学数学中学习到的坐标系不同。在图中我以小球为中心原点,

建立的这个坐标系,主要为了便于分析小球的运动过程,方便推理和计算。
另外,面板中只能进行横向运动和纵向运动,要产生斜向运动,必须将横向

运动和纵向运动进行合成。


在t1-t0的时间段内,小球向右上角运动一个speed的距离,这个运动过程

无法直接在程序中表达,只能由横向运动和纵向运动合成而来。根据我们定

义的小球的运动方向的概念,分别得到横向运动距离dx和纵向运动距离dy.

在这个时间段内,只需要将小球的横坐标x加上这个dx,纵坐标减去这个dy,

得到的新的坐标点,就是小球应该到达的位置。
注意这个时候alpha的值处于第一象限,根据正弦函数和余弦函数的图像可

知,此时sina和cosa的值都为正数,即:
x+=dx;
y-=dy
之后,小球的位置正好处于原来位置的右上角,到达了既定位置.

在第二象限内,根据正弦函数和余弦函数的图像,这次sina的值依然是正

数,cosa的值却是一个负数,在:
x+=dx;
y-=dy
之后,小球也还是能正确运动到达正确位置。

按照此种方式继续分析第三象限和第四象限的情况可知,方程组:
x+=speed*sina;
y-=speed*cosa;
是小球运动的一般规律,而水平和垂直方向的运动,也是这个方程组描述的

一种特殊情况.

3.边界碰撞检测:
根据光的反射定律,光的入射角等于反射角。在这里,将小球看成是一个光

子,四周的边界看成是绝对光滑的镜面,那么小球对边界的碰撞也遵从反射

定律。
看图:


如果碰撞上边框,小球反射前的运动方向alpha在碰撞到边框的一瞬间,立即变成反射后的运动方向,才能让小球正确呈现反弹效果。即让反弹后的运动方向值,替代反射前的运动方向值,如果运动分析没有错,那么,小球的碰撞和反弹也会按照预期正确出现。画出法线,经过简单的几何证明:

反射后的方向=180-反射前的方向,即对应的代码应该为:
alpha=180-alpha;(简单的不可思议!)

如果按照相反的方向入射和反射,或者碰撞到下边框,依然遵从该方程!你可以自己试着推理证明。

这次是碰撞左边框,经过一番简单的证明,得到结论是:
反射后的角度=360-反射前的角度,即对应的代码应该为:
alpha=360-alpha;(同样简单的不可思议!)

你也可以画图证明碰撞右边框的情形,也同样遵照上述方程。

如果边框宽600pix,高400pix,小球宽高都为20pix的话,核心代码为:

Java code

publicvoid move(){ x+=speed*Math.sin(alpha*Math.PI/180); y-=speed*Math.cos(alpha*Math.PI/180);if(x<0||x>580)alpha=360-alpha;if(y<0||y>480)alpha=180-alpha; setLocation(x,y); }


在线程体中使用死循环反复调用move()方法,线程的休眠间隔是(1000/36)毫秒,不要约分,否则就失去了这个数值所表达的意义了。




转载于:https://www.cnblogs.com/xieyuan/archive/2012/11/27/3787450.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Pygame是一个用于开发2D游戏的Python库,可以实现小球碰撞效果。下面是一个简单的示例代码来演示如何使用Pygame实现小球碰撞: ```python import pygame import random # 初始化Pygame pygame.init() # 设置窗口大小和标题 width, height = 800, 600 screen = pygame.display.set_mode((width, height)) pygame.display.set_caption("Ball Collision") # 定义颜色 BLACK = (0, 0, 0) WHITE = (255, 255, 255) # 定义小球类 class Ball: def __init__(self, x, y, radius, color): self.x = x self.y = y self.radius = radius self.color = color self.dx = random.randint(-5, 5) # 随机生成小球的水平速度 self.dy = random.randint(-5, 5) # 随机生成小球的垂直速度 def move(self): self.x += self.dx self.y += self.dy def draw(self): pygame.draw.circle(screen, self.color, (self.x, self.y), self.radius) def check_collision(self, other_ball): distance = ((self.x - other_ball.x) ** 2 + (self.y - other_ball.y) ** 2) ** 0.5 if distance <= self.radius + other_ball.radius: return True else: return False # 创建小球对象列表 balls = [] for _ in range(10): x = random.randint(0, width) y = random.randint(0, height) radius = random.randint(10, 50) color = (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)) ball = Ball(x, y, radius, color) balls.append(ball) # 游戏主循环 running = True clock = pygame.time.Clock() while running: for event in pygame.event.get(): if event.type == pygame.QUIT: running = False screen.fill(BLACK) # 移动和绘制小球 for ball in balls: ball.move() ball.draw() # 检测小球碰撞 for i in range(len(balls)): for j in range(i + 1, len(balls)): if balls[i].check_collision(balls[j]): balls[i].dx *= -1 balls[i].dy *= -1 balls[j].dx *= -1 balls[j].dy *= -1 pygame.display.flip() clock.tick(60) # 退出游戏 pygame.quit() ``` 这段代码创建了一个窗口,生成了一些随机大小和颜色的小球,并且让它们在窗口中移动。当两个小球碰撞时,它们的速度会反向改变,从而实现小球碰撞效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值