我编写了一个动画(在python中),用于三个沙滩球在屏幕上反弹.我现在希望让它们全部碰撞,并能够互相反弹.我真的很感激可以提供任何帮助.
import pygame
import random
import sys
class Ball:
def __init__(self,X,Y):
self.velocity = [1,1]
self.ball_image = pygame.image.load ('Beachball.jpg'). convert()
self.ball_boundary = self.ball_image.get_rect (center=(X,Y))
self.sound = pygame.mixer.Sound ('Thump.wav')
self.rect = self.ball_image.get_rect (center=(X,Y))
if __name__ =='__main__':
width = 800
height = 600
background_colour = 0,0,0
pygame.init()
window = pygame.display.set_mode((width, height))
pygame.display.set_caption("Bouncing Ball animation")
num_balls = 3
ball_list = []
for number in range(num_balls):
ball_list.append( Ball(random.randint(10, (width - 10)),random.randint(10, (height - 10))) )
while True:
for event in pygame.event.get():
print event
if event.type …Run Code Online (Sandbox Code Playgroud) 我正试图在XNA中制作(弄清楚如何......)2d平台游戏.
我知道如何创建一个平铺网格以及如何执行碰撞检测.我在播放器的9个边界拼贴上执行碰撞检测,但我想知道是否有更好的方法来执行碰撞检测.
我读过Braid不使用瓷砖而是拼凑图像或其他东西,你如何对它们进行碰撞检测?并且比使用瓷砖更好吗?
这是半编程,半数学问题.
我有一些盒子,代表四个角点.它们是真正的矩形,是两组平行线的交点,每组中的每一行都与另一组中的两条直线成直角(我们很清楚.)
对于任何一组n个框,我怎样才能有效地计算移动它们的位置(最小距离),以便它们不会相互重叠?
我在这里用javascript工作.这是数据:
//an array of indefinite length of boxes
//boxes represented as arrays of four points
//points represented as arrays of two things, an x and a y, measured in
//pixels from the upper left corner
var boxes = [[[504.36100124308336,110.58685958804978],[916.3610012430834,110.58685958804978],[916.3610012430834,149.58685958804978],[504.36100124308336,149.58685958804978]],[[504.4114378910622,312.3334473005064],[554.4114378910622,312.3334473005064],[554.4114378910622,396.3334473005064],[504.4114378910622,396.3334473005064]],[[479.4272869132357,343.82042608058134],[516.4272869132358,343.82042608058134],[516.4272869132358,427.82042608058134],[479.4272869132357,427.82042608058134]],[[345.0558946408693,400.12499171846],[632.0558946408694,400.12499171846],[632.0558946408694,439.12499171846],[345.0558946408693,439.12499171846]],[[164.54073131913765,374.02074227992966],[264.54073131913765,374.02074227992966],[264.54073131913765,428.02074227992966],[164.54073131913765,428.02074227992966]],[[89.76601656567325,257.7956256799442],[176.76601656567325,257.7956256799442],[176.76601656567325,311.7956256799442],[89.76601656567325,311.7956256799442]],[[60.711850703535845,103.10558195262593],[185.71185070353584,103.10558195262593],[185.71185070353584,157.10558195262593],[60.711850703535845,157.10558195262593]],[[169.5240557746245,23.743626531766495],[231.5240557746245,23.743626531766495],[231.5240557746245,92.7436265317665],[169.5240557746245,92.7436265317665]],[[241.6776988694169,24.30106373152889],[278.6776988694169,24.30106373152889],[278.6776988694169,63.30106373152889],[241.6776988694169,63.30106373152889]],[[272.7734457459479,15.53275710947554],[305.7734457459479,15.53275710947554],[305.7734457459479,54.53275710947554],[272.7734457459479,54.53275710947554]],[[304.2905062327675,-3.9599943474960035],[341.2905062327675,-3.9599943474960035],[341.2905062327675,50.04000565250399],[304.2905062327675,50.04000565250399]],[[334.86335590542114,12.526345270766143],[367.86335590542114,12.526345270766143],[367.86335590542114,51.52634527076614],[334.86335590542114,51.52634527076614]],[[504.36100124308336,110.58685958804978],[916.3610012430834,110.58685958804978],[916.3610012430834,149.58685958804978],[504.36100124308336,149.58685958804978]],[[504.4114378910622,312.3334473005064],[554.4114378910622,312.3334473005064],[554.4114378910622,396.3334473005064],[504.4114378910622,396.3334473005064]],[[479.4272869132357,343.82042608058134],[516.4272869132358,343.82042608058134],[516.4272869132358,427.82042608058134],[479.4272869132357,427.82042608058134]],[[345.0558946408693,400.12499171846],[632.0558946408694,400.12499171846],[632.0558946408694,439.12499171846],[345.0558946408693,439.12499171846]],[[164.54073131913765,374.02074227992966],[264.54073131913765,374.02074227992966],[264.54073131913765,428.02074227992966],[164.54073131913765,428.02074227992966]],[[89.76601656567325,257.7956256799442],[176.76601656567325,257.7956256799442],[176.76601656567325,311.7956256799442],[89.76601656567325,311.7956256799442]],[[60.711850703535845,103.10558195262593],[185.71185070353584,103.10558195262593],[185.71185070353584,157.10558195262593],[60.711850703535845,157.10558195262593]],[[169.5240557746245,23.743626531766495],[231.5240557746245,23.743626531766495],[231.5240557746245,92.7436265317665],[169.5240557746245,92.7436265317665]],[[241.6776988694169,24.30106373152889],[278.6776988694169,24.30106373152889],[278.6776988694169,63.30106373152889],[241.6776988694169,63.30106373152889]],[[272.7734457459479,15.53275710947554],[305.7734457459479,15.53275710947554],[305.7734457459479,54.53275710947554],[272.7734457459479,54.53275710947554]],[[304.2905062327675,-3.9599943474960035],[341.2905062327675,-3.9599943474960035],[341.2905062327675,50.04000565250399],[304.2905062327675,50.04000565250399]],[[334.86335590542114,12.526345270766143],[367.86335590542114,12.526345270766143],[367.86335590542114,51.52634527076614],[334.86335590542114,51.52634527076614]]]
Run Code Online (Sandbox Code Playgroud)
我正在使用需要碰撞检测的画布在Javascript中构建游戏,在这种情况下,如果玩家精灵击中一个盒子,则不允许玩家通过该框.
我有一个名为的全局数组blockList,它包含绘制到画布的所有框.它看起来像这样:
var blockList = [[50, 400, 100, 100]];
Run Code Online (Sandbox Code Playgroud)
他们被这样的画布所吸引:
c.fillRect(blockList[0][0], blockList[0][1], blockList[0][2], blockList[0][3]);
Run Code Online (Sandbox Code Playgroud)
我还有一个玩家对象,它有一个更新方法和一个绘制方法.更新根据键盘输入等设置播放器的位置,主游戏循环使用绘制将玩家绘制到画布.玩家被画成这样:
this.draw = function(timestamp) {
if(this.state == "idle") {
c.drawImage(this.idleSprite, this.idleSprite.frameWidth * this.idleSprite.frameCount, 0, this.idleSprite.frameWidth, this.idleSprite.frameHeight, this.xpos, this.ypos, this.idleSprite.frameWidth, this.idleSprite.frameHeight);
if(timestamp - this.lastDraw > this.idleSprite.updateInterval) {
this.lastDraw = timestamp;
if(this.idleSprite.frameCount < this.idleSprite.frames - 1) { this.idleSprite.frameCount++; } else { this.idleSprite.frameCount = 0; }
}
} else if(this.state == "running") {
var height = 0;
if(this.facing == "left") { height = 37; }
c.drawImage(this.runningSprite, this.runningSprite.frameWidth …Run Code Online (Sandbox Code Playgroud) 我只是想编写一个漂亮的物理游戏.
球碰撞看起来不错,但如果球碰撞得太慢,它们会互相"粘".我不知道他们为什么这么做.
这是我的碰撞功能:
private void checkForCollision(ArrayList<Ball> balls) {
for (int i = 0; i < balls.size(); i++) {
Ball ball = balls.get(i);
if (ball != this && ball.intersects(this)) {
this.collide(ball, false);
}
}
}
public boolean intersects(Ball b) {
double dx = Math.abs(b.posX - posX);
double dy = Math.abs(b.posY - posY);
double d = Math.sqrt(dx * dx + dy * dy);
return d <= (radius + b.radius);
}
private void collide(Ball ball, boolean b) {
double m1 = this.radius;
double …Run Code Online (Sandbox Code Playgroud) 如何测试三角形和正方形是否相互交叉?
当我们知道它是方形而不是矩形时,有没有什么方法可以优化它?此外,方形是轴对齐的,这样可以提高性能吗?
或者我应该将正方形分成三角形,并进行两次三角形 - 三角形相交检查?
编辑:澄清:我正试图检查这两个形状是否以任何方式相互重叠.所以三角形可以在正方形内,正方形可以在三角形内部,并且它也应该返回true.
我正在开发一款游戏,让我们说玩家在位置x = 100,y = 100并且爆炸半径为100个单位时放置炸弹......我很容易在游戏中找到所有"项目"被爆炸的炸弹击中(只需要检查他们与炸弹的距离是否低于100).
但现在我想考虑到我在游戏中遇到的障碍,障碍物是正方形,总是64*64像素,总是与轴对齐(不旋转)..我想知道一个项目是否"隐藏"背后知道他没被击中的障碍......
这样的事情:
右边的家伙没有被击中,但是底部的家伙被打了,我把灰色打到了打击区域,绿色的区域被隐藏了......
我的想法是:1.找到的所有项目在现场看到,从炸弹的距离越低则100 2.找到场景中的所有障碍,从炸弹的距离越低则100.3.计算从线炸弹中心的物品..然后检查线是否与任何障碍物相交,如果没有......你被击中了.
最后,问题1.有没有人有更好的主意?2.有免费的开源c#兼容引擎可以帮助我吗?Box2d可以帮到我吗?
谢谢
math collision-detection game-physics computational-geometry
我实现了一个检测两个形状之间碰撞的函数,以及另一个在检测到碰撞时将dragBound限制为边框的函数,以实现捕捉功能,然后添加到Kinetic.Group.所以实际上我将放置目标限制为现有矩形的边界.
这是一个明确查看我的问题的方法:http://jsfiddle.net/4Y87X/6/
当width = height时,这个逻辑适用于大矩形.但是,当我拖动小灰色矩形(代表我项目中的一个窗口)时,仅在大矩形的右侧和顶部检测到碰撞,未检测到左侧和底部!这是由于DragBoundWindow方法中的一些数学方程吗?
如果有人能找到错误,请?
代码:
var stage = new Kinetic.Stage({
container: "container",
width: 900,
height: 600
});
var leftLayer = new Kinetic.Layer({
x:0,
y:0,
id: 'leftLayer',
width:250,
height:600
});
var leftBackground = new Kinetic.Rect({
width: 250,
height: 600,
stroke: "red"
});
leftLayer.add(leftBackground);
stage.add(leftLayer);
var rightLayer = new Kinetic.Layer({
x: 280,
y:0,
id: 'rightLayer',
width:600,
height:600
});
var rightBackground = new Kinetic.Rect({
x: 0,
y: 0,
width: 600,
height: 600, …Run Code Online (Sandbox Code Playgroud) 
你好.
我有一个多重碰撞问题.有一颗子弹击中敌人(红色矩形).然后,它得分.有一个螺旋(红色圆圈),当敌人(红色矩形)接触时,它会触发场景结束.
在这种情况下,当敌人击中螺旋,它工作,场景结束,我们进入菜单屏幕.但是,当子弹击中敌人时,同样的事情发生了,我不知道为什么.
现在,这是我的代码:
struct PhysicsCategory {
static let None : UInt32 = 0
static let All : UInt32 = UInt32.max
static let enemyOne : UInt32 = 0b1
static let enemyTwo : UInt32 = 0b1
static let bullet : UInt32 = 0b10
static let spiral : UInt32 = 0b111
}
spiral.physicsBody = SKPhysicsBody(rectangleOfSize: spiral.size)
spiral.physicsBody?.categoryBitMask = PhysicsCategory.spiral
spiral.physicsBody?.contactTestBitMask = PhysicsCategory.enemyOne
spiral.physicsBody?.collisionBitMask = PhysicsCategory.None
...
enemyOne.physicsBody = SKPhysicsBody(rectangleOfSize: enemyOne.size)
enemyOne.physicsBody?.dynamic = true
enemyOne.physicsBody?.categoryBitMask = PhysicsCategory.enemyOne
enemyOne.physicsBody?.contactTestBitMask = PhysicsCategory.bullet | PhysicsCategory.spiral
enemyOne.physicsBody?.collisionBitMask …Run Code Online (Sandbox Code Playgroud) 如何在碰撞后正确地将GameObject附加(或"粘贴")到另一个GameObject?问题:我希望GameObject在碰撞后附加,即使它正在改变比例.
"附上碰撞"代码:
protected Transform stuckTo = null;
protected Vector3 offset = Vector3.zero;
public void LateUpdate()
{
if (stuckTo != null)
transform.position = stuckTo.position - offset;
}
void OnCollisionEnter(Collision col)
{
rb = GetComponent<Rigidbody>();
rb.isKinematic = true;
if(stuckTo == null
|| stuckTo != col.gameObject.transform)
offset = col.gameObject.transform.position - transform.position;
stuckTo = col.gameObject.transform;
}
Run Code Online (Sandbox Code Playgroud)
此代码使GameObject在碰撞后完美连接.但是当GameObject改变比例(当它附着时)时,它在视觉上不再看起来与它碰撞的任何东西相关联.基本上,这段代码使GameObject在碰撞时仅保留原始比例.如何使GameObject始终坚持与碰撞的任何东西?它在过程中的规模是多少?我想避免养育子女:"虽然有点不安全,但是养育对手会造成奇怪的结果,比如随机传送或物体开始疯狂地移动和旋转等等." - SamedTarıkÇETİN:评论.
缩放脚本:
public Transform object1; //this is the object that my future-scaling GameObject collided with.
public Transform object2; //another object, the same …Run Code Online (Sandbox Code Playgroud) c# ×2
collision ×2
geometry ×2
javascript ×2
math ×2
2d ×1
c++ ×1
canvas ×1
game-physics ×1
intersection ×1
ios ×1
java ×1
kineticjs ×1
performance ×1
python ×1
sprite-kit ×1
swift ×1
tiles ×1
unity5 ×1
xna ×1