我即将开始开发一款主要功能围绕2D水模拟的游戏.我已经考虑过从Box2D开始并在该引擎中设计水,但我不确定它是否有效,而且我对Box2D没有任何经验.
如果有一个内置良好流体模拟的发动机,那将会很棒.如果没有,我应该从哪里开始?我一直在寻找一段时间,但仍然没有一个好的开始.
水一次只占屏幕的10%,我的目标是3GS上40 FPS和iPhone 4上45+.只是粗略的数字.
我使用libgdx做了一个游戏,它之前在桌面和android上运行良好.我不确定它是否因为我开始使用box2d物理引擎和liquidfun粒子,基本上发生的是,当我点击我的游戏时它开始加载然后加载它应该去游戏屏幕,但它崩溃然后说"不幸的是,myGame已经停止了".
错误信息:
E/AndroidRuntime: FATAL EXCEPTION: GLThread 3764
Process: com.nivekbryan.puffypuff, PID: 8416
java.lang.NoClassDefFoundError: Failed resolution of: Lcom/badlogic/gdx/physics/box2d/World;
Run Code Online (Sandbox Code Playgroud)
我按照这个设置教程介绍了如何移植liquidfun库,它从2014年开始有点老了.游戏运行Ok作为桌面应用程序.
这是我的build.gradle文件(依赖项),可能是什么问题?为什么作为桌面应用程序而不是作为Android应用程序?
buildscript {
repositories {
mavenLocal()
mavenCentral()
maven { url "https://oss.sonatype.org/content/repositories/snapshots/" }
jcenter()
}
dependencies {
classpath 'de.richsource.gradle.plugins:gwt-gradle-plugin:0.6'
classpath 'com.android.tools.build:gradle:2.0.0'
classpath 'com.mobidevelop.robovm:robovm-gradle-plugin:2.1.0'
}
}
allprojects {
apply plugin: "eclipse"
apply plugin: "idea"
version = '1.0'
ext {
appName = "Puffy Puff"
gdxVersion = '1.9.3'
roboVMVersion = '2.1.0'
box2DLightsVersion = '1.4'
ashleyVersion = '1.7.0'
aiVersion = '1.8.0'
admobVersion = '8.3.0'
}
repositories …Run Code Online (Sandbox Code Playgroud) 我试图通过连接3个矩形来在Box2d(在Cocos2d中)创建一个"U"形状:| _ |
这听起来像关节不是正确的解决方案因为我不想要任何动作所以我创造了一个主体,它是中间位和两个夹具的两侧.我已将这两个边添加到中间位,如下所示:
mainBody->CreateFixture(&leftFixtureDef);
mainBody->CreateFixture(&rightFixtureDef);
Run Code Online (Sandbox Code Playgroud)
这有效,但是两个侧面装置都被添加到mainBody的中心.我似乎无法弄清楚如何相对于主体定位灯具.将精灵/节点附加到夹具并改变位置似乎没有什么区别.
有任何想法吗?
非常感谢.
我一直在创建我自己非常简单的基于Breakout的测试游戏,同时学习SpriteKit(使用Ray Wenderlich等教授的iOS游戏)来看看我是否可以应用我学到的概念.我决定通过使用.sks文件来创建精灵节点并用物理主体替换我的手动边界检查和碰撞来简化我的代码.
然而,只要它以陡峭的角度与它们碰撞,我的球就会保持平行于墙壁/其他矩形(例如,只是向上和向下滑动).这是相关的代码 - 我已将物理主体属性移动到代码中以使它们更加可见:
import SpriteKit
struct PhysicsCategory {
static let None: UInt32 = 0 // 0
static let Edge: UInt32 = 0b1 // 1
static let Paddle: UInt32 = 0b10 // 2
static let Ball: UInt32 = 0b100 // 4
}
var paddle: SKSpriteNode!
var ball: SKSpriteNode!
class GameScene: SKScene, SKPhysicsContactDelegate {
override func didMoveToView(view: SKView) {
physicsWorld.gravity = CGVector.zeroVector
let edge = SKNode()
edge.physicsBody = SKPhysicsBody(edgeLoopFromRect: frame)
edge.physicsBody!.usesPreciseCollisionDetection = true
edge.physicsBody!.categoryBitMask = PhysicsCategory.Edge
edge.physicsBody!.friction = 0
edge.physicsBody!.restitution …Run Code Online (Sandbox Code Playgroud) 在我的应用程序中,我想在设备旋转(方向更改)的情况下调用CCScene myscene中的某些方法.我禁用了自动旋转(因为我希望它不会发生).
问题是:我想根据我的设备方向改变场景中的重力.我的代码:
-(void) onEnter
{
[super onEnter];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(notification_OrientationWillChange:) name:UIApplicationWillChangeStatusBarOrientationNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(notification_OrientationDidChange:) name:UIApplicationDidChangeStatusBarOrientationNotification object:nil];
}
-(void) onExit
{
//[[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationWillChangeStatusBarOrientationNotification object:nil];
//[[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationDidChangeStatusBarOrientationNotification object:nil];
}
-(void)notification_OrientationWillChange:(NSNotification*)n
{
orientation = (UIInterfaceOrientation)[[n.userInfo objectForKey:UIApplicationStatusBarOrientationUserInfoKey] intValue];
}
-(void)notification_OrientationDidChange:(NSNotification*)n
{
if (orientation == UIInterfaceOrientationLandscapeLeft) {
b2Vec2 gravity( 0, -10);
world->SetGravity(gravity);
}
if (orientation == UIInterfaceOrientationLandscapeRight) {
b2Vec2 gravity( 0, 10);
world->SetGravity(gravity);
}
}
Run Code Online (Sandbox Code Playgroud)
但在这种情况下,我只能在启用自动旋转的情况下收到通知.(如果禁用,设备实际上不会更改状态栏方向)你能帮助我吗?
我有一个质量为10的物体,程序的每个循环我使用简单的方法对它施加100的力;
Vector2 force = new Vector2(0, 1) * 100;
bod.ApplyForce(force, bod.GetWorldCenter());
Run Code Online (Sandbox Code Playgroud)
它运行良好,加速和所有这一切,但一旦它达到10的速度(100/10我假设)它将不会更快.我无论如何都不是物理学家,但我记得身体应该不断加速,就像在重力作用下一样.这个速度限制是Box2D做事的方式的结果,还是我真的搞砸了什么?另外,我该怎么做才能解决它.
注意:如果我使用ApplyLinearImpulse而不是ApplyForce,我会获得相同的有限速度
更新:我很清楚Box2D施加的总体最高速度限制(在b2Settings.h中).在我的例子中,所讨论的项目远远低于此限制,因为更改了应用的力,无论是1000还是10000,总是会达到最大速度(力/质量).
我是游戏编程世界的新手,但他想为iPhone构建一个简单的基于物理的游戏.有谁知道iPhone上的Cocos2D和/或Box2D的任何教程?文档有点令人困惑.
我正在太空船上实施2D游戏.
为了做到这一点,我正在使用LÖVE,它将Box2D与Lua包装在一起.但我相信我的问题可以由对物理学有更多了解的人来回答 - 所以伪代码被接受作为回应.
我的问题是我不知道如何在启用2D物理的世界中正确地移动我的宇宙飞船.更具体地说:
质量船m位于初始位置{x, y}.它的初始速度矢量为{vx, vy}(可以{0,0}).
目标是一个点{xo,yo}.船必须{vxo, vyo}按照最短的轨迹到达具有(或接近它)速度的物镜.
有一个update(dt)被称为频繁调用的函数(即每秒30次).在此功能上,船舶可以通过对自身施加"冲动"来修改其位置和轨迹.脉冲的大小是二进制的:你可以在给定的方向上应用它,或者根本不应用它.在代码中,它看起来像这样:
function Ship:update(dt)
m = self:getMass()
x,y = self:getPosition()
vx,vy = self:getLinearVelocity()
xo,yo = self:getTargetPosition()
vxo,vyo = self:getTargetVelocity()
thrust = self:getThrust()
if(???)
angle = ???
self:applyImpulse(math.sin(angle)*thrust, math.cos(angle)*thrust))
end
end
Run Code Online (Sandbox Code Playgroud)
第一个???是表明在某些情况下(我猜)最好"不要冲动"并让船"漂移".第二???部分是关于如何计算给定dt上的脉冲角.
我们在太空中,所以我们可以忽略空气摩擦之类的东西.
虽然它会非常好,但我并不是在寻找能为我编码的人; 我把代码放在那里,所以我的问题清楚地被理解了.
我需要的是一种策略 - 一种攻击方式.我知道一些基本的物理,但我不是专家.例如,这个问题有名字吗?诸如此类的事情.
非常感谢.
编辑:Beta提供了一个有效的策略,Judge在评论中直接在LÖVE中实现了它.
EDIT2:经过更多的谷歌搜索后,我也找到了openSteer.这是在C++上,但它做了我假装的.达到这个问题的任何人都可能会有所帮助.
如何检测身体是否与其他身体发生碰撞但对此碰撞没有反应.
通过默认的 I -碰撞检测和机构碰撞.
如果我设置fixtureDef过滤器 - 主体不会发生碰撞,但我无法检测到碰撞.
请帮忙!
我正在使用box2d进行物理模拟.当按下按键时,我通过在身体上施加冲动使用箭头键移动一个圆圈.不幸的是,圆圈移动速度极慢,并且似乎没有像真正的身体一样加速.我的世界尺寸是400x800像素.圆体的半径是20f.
根据这一点,可以通过在创建圆形半径时缩小圆形半径并在绘制期间获得主体位置后放大来解决该问题.它似乎没有任何区别.我在这里缺少一些步骤或设置吗?
box2d ×10
game-physics ×2
iphone ×2
libgdx ×2
2d ×1
android ×1
box2d-iphone ×1
c# ×1
c++ ×1
cocoa-touch ×1
collision ×1
ios ×1
java ×1
liquidfun ×1
lua ×1
objective-c ×1
physics ×1
sprite-kit ×1
swift ×1