[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: KDE/kdegames/kolf
From: Stefan Majewsky <majewsky () gmx ! net>
Date: 2010-10-31 23:23:46
Message-ID: 20101031232346.04D26AC8A8 () svn ! kde ! org
[Download RAW message or body]
SVN commit 1191720 by majewsky:
Milestone! The intro level works with Box2D-powered ball propagation!
M +0 -1 ball.cpp
M +8 -8 canvasitem.cpp
M +1 -1 external/Box2D/Common/b2Settings.h
M +7 -1 game.cpp
--- trunk/KDE/kdegames/kolf/ball.cpp #1191719:1191720
@@ -109,7 +109,6 @@
void Ball::setVelocity(const Vector& velocity)
{
CanvasItem::setPhysicalVelocity(velocity);
- kDebug() << velocity;
}
#endif
--- trunk/KDE/kdegames/kolf/canvasitem.cpp #1191719:1191720
@@ -29,11 +29,12 @@
: game(0)
, m_body(0)
, m_overlay(0)
- , m_simulationType(CanvasItem::CollisionSimulation)
+ , m_simulationType((CanvasItem::SimulationType) -1)
{
b2BodyDef bodyDef;
bodyDef.userData = this;
m_body = world->CreateBody(&bodyDef);
+ setSimulationType(CanvasItem::CollisionSimulation);
}
CanvasItem::~CanvasItem()
@@ -133,7 +134,7 @@
QPointF CanvasItem::physicalVelocity() const
{
b2Vec2 v = m_body->GetLinearVelocity();
- return QPointF(v.x, v.y) / Kolf::Box2DScaleFactor;
+ return QPointF(v.x, v.y);
}
void CanvasItem::setPhysicalVelocity(const QPointF& newVelocity)
@@ -142,16 +143,15 @@
if (newVelocity != currentVelocity)
{
const qreal mass = m_body->GetMass();
- if (mass == 0)
+ //WARNING: Velocities are NOT scaled. The timestep is scaled, instead.
+ //See where b2World::Step() gets called for more info.
+ if (mass == 0 || m_simulationType != CanvasItem::DynamicSimulation)
{
- m_body->SetLinearVelocity(b2Vec2(
- newVelocity.x() * Kolf::Box2DScaleFactor,
- newVelocity.y() * Kolf::Box2DScaleFactor
- ));
+ m_body->SetLinearVelocity(b2Vec2(newVelocity.x(), newVelocity.y()));
}
else
{
- const QPointF impulse = (newVelocity - currentVelocity) * mass * \
Kolf::Box2DScaleFactor; + const QPointF impulse = (newVelocity - currentVelocity) * \
mass; m_body->ApplyLinearImpulse(b2Vec2(impulse.x(), impulse.y()), \
m_body->GetPosition()); }
}
--- trunk/KDE/kdegames/kolf/external/Box2D/Common/b2Settings.h #1191719:1191720
@@ -99,7 +99,7 @@
/// A velocity threshold for elastic collisions. Any collision with a relative \
linear /// velocity below this threshold will be treated as inelastic.
-#define b2_velocityThreshold 1.0f
+#define b2_velocityThreshold 0.0f
/// The maximum linear position correction used when solving constraints. This helps \
to /// prevent overshoot.
--- trunk/KDE/kdegames/kolf/game.cpp #1191719:1191720
@@ -1639,6 +1639,7 @@
void Wall::setVisible(bool yes)
{
QGraphicsLineItem::setVisible(yes);
+ setSimulationType(yes ? CanvasItem::CollisionSimulation : \
CanvasItem::NoSimulation);
startItem->setVisible(yes);
endItem->setVisible(yes);
@@ -2740,7 +2741,12 @@
}
}
//step world
- const double timeStep = 1.0; //so that CanvasItem::physicalVelocity() corresponds \
to the position change per step + //NOTE: I previously set timeStep to 1.0 so that \
CItem's physicalVelocity() + //corresponds to the position change per step. In this \
case, the physical + //velocity would be scaled by Kolf::Box2DScaleFactor, which \
would result in + //very small velocities (below Box2D's internal cutoff thresholds!) \
for + //usual movements. Therefore, we apply the scaling to the timestep instead.
+ const double timeStep = 1.0 * Kolf::Box2DScaleFactor;
g_world->Step(timeStep, 10, 10); //parameters 2/3 = iteration counts (TODO: \
optimize) //conclude simulation
for (b2Body* body = g_world->GetBodyList(); body; body = body->GetNext())
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic