[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:35
Message-ID: 20101031232335.D3564AC8AA () svn ! kde ! org
[Download RAW message or body]

SVN commit 1191715 by majewsky:

Kill Ball::vector property.

 M  +11 -31    ball.cpp  
 M  +3 -9      ball.h  
 M  +27 -35    game.cpp  


--- trunk/KDE/kdegames/kolf/ball.cpp #1191714:1191715
@@ -76,35 +76,24 @@
 {
 	if (state == Stopped || state == Holed || !isVisible())
 	{
-		setVelocity(Vector());
+		setVelocity(QPointF());
 		return;
 	}
 	const double subtractAmount = .027 * frictionMultiplier;
-	if (m_vector.magnitude() <= subtractAmount)
+	Vector velocity = this->velocity();
+	if (velocity.magnitude() <= subtractAmount)
 	{
 		state = Stopped;
-		setVelocity(Vector());
+		setVelocity(QPointF());
 		game->timeout();
 		return;
 	}
-	m_vector.setMagnitude(m_vector.magnitude() - subtractAmount);
-	setVector(m_vector);
+	velocity.setMagnitude(velocity.magnitude() - subtractAmount);
+	setVelocity(velocity);
 
 	frictionMultiplier = 1.0;
 }
 
-void Ball::setVelocity(const Vector& velocity)
-{
-	CanvasItem::setVelocity(velocity);
-	m_vector = QPointF(velocity.x(), -velocity.y());
-}
-
-void Ball::setVector(const Vector& newVector)
-{
-	m_vector = newVector;
-	CanvasItem::setVelocity(Vector(newVector.x(), -newVector.y()));
-}
-
 void Ball::moveBy(double dx, double dy)
 {
 	EllipticalCanvasItem::moveBy(dx, dy);
@@ -132,9 +121,8 @@
 	if (m_collisionId == 1 && !velocity().isNull())
 		friction();
 
-	double initialVector = m_vector.magnitude();
+	const double initialVelocity = velocity().magnitude();
 	const double minSpeed = .06;
-	bool justCollidedWithWall = false;
 
 	QList<QGraphicsItem *> items = collidingItems();
 
@@ -178,24 +166,16 @@
 		}
 	}
 
-	double vectorChange = initialVector - m_vector.magnitude();
-	if(vectorChange < 0 ) 
-		vectorChange *= -1;
+	const double currentVelocity = velocity().magnitude();
+	const double velocityChange = qAbs(initialVelocity - currentVelocity);
 
-	if(m_vector.magnitude() < minSpeed && vectorChange < minSpeed && \
m_vector.magnitude()) +	if(currentVelocity < minSpeed && velocityChange < minSpeed && \
currentVelocity)  {
-		if( justCollidedWithWall )
-		{ //don't want to stop if just hit a wall as may be in the wall
-			//problem: could this cause endless ball bouncing between 2 walls?
-			m_vector.setMagnitude(minSpeed);
-		}
-		else
-		{
+		//cutoff low velocities
 			setVelocity(Vector());
 			setState(Stopped);
 		}
 	}
-}
 
 BallState Ball::currentState()
 {
--- trunk/KDE/kdegames/kolf/ball.h #1191714:1191715
@@ -36,7 +36,6 @@
 
 	virtual void doAdvance();
 	virtual void moveBy(double dx, double dy);
-	virtual void setVelocity(const Vector& velocity);
 
 	virtual bool deleteable() const { return false; }
 
@@ -53,9 +52,9 @@
 	void collisionDetect();
 
 	int addStroke() const { return m_addStroke; }
-	bool placeOnGround(Vector &v) { v = oldVector; return m_placeOnGround; }
+	bool placeOnGround(Vector &v) { v = m_pogOldVelocity; return m_placeOnGround; }
 	void setAddStroke(int newStrokes) { m_addStroke = newStrokes; }
-	void setPlaceOnGround(bool placeOnGround) { m_placeOnGround = placeOnGround; \
oldVector = m_vector; } +	void setPlaceOnGround(bool placeOnGround) { m_placeOnGround \
= placeOnGround; m_pogOldVelocity = velocity(); }  
 	bool beginningOfHole() const { return m_beginningOfHole; }
 	void setBeginningOfHole(bool yes) { m_beginningOfHole = yes; }
@@ -63,9 +62,6 @@
 	bool forceStillGoing() const { return m_forceStillGoing; }
 	void setForceStillGoing(bool yes) { m_forceStillGoing = yes; }
 
-	Vector curVector() const { return m_vector; }
-	void setVector(const Vector &newVector);
-
 	void shotStarted() { maxBumperBounceSpeed = 8; }
 
 	void setDoDetect(bool yes) { m_doDetect = yes; }
@@ -93,13 +89,11 @@
 
 	int m_addStroke;
 	bool m_placeOnGround;
+	Vector m_pogOldVelocity;
 
 	bool m_beginningOfHole;
 	bool m_forceStillGoing;
 
-	Vector m_vector;
-	Vector oldVector;
-
 	bool m_doDetect;
 
 	QGraphicsSimpleTextItem *label;
--- trunk/KDE/kdegames/kolf/game.cpp #1191714:1191715
@@ -870,7 +870,7 @@
 	if (ball->isVisible())
 	{
 		// is center of ball in?
-		if (contains(ball->pos() - pos()) /* && ball->curVector().magnitude() < 4*/)
+		if (contains(ball->pos() - pos()))
 		{
 			playSound("puddle");
 			ball->setAddStroke(ball->addStroke() + 1);
@@ -900,9 +900,9 @@
 bool Sand::collision(Ball *ball)
 {
 	// is center of ball in?
-	if (contains(ball->pos()-pos())/* && ball->curVector().magnitude() < 4*/)
+	if (contains(ball->pos()-pos()))
 	{
-		if (ball->curVector().magnitude() > 0)
+		if (ball->velocity().magnitude() > 0)
 			ball->setFrictionMultiplier(7);
 		else
 		{
@@ -1052,18 +1052,16 @@
 bool Bumper::collision(Ball *ball)
 {
 	double maxSpeed = ball->getMaxBumperBounceSpeed();
-	double speed = qMin(maxSpeed, 1.8 + ball->curVector().magnitude() * .9);
+	double speed = qMin(maxSpeed, 1.8 + ball->velocity().magnitude() * .9);
 	ball->reduceMaxBumperBounceSpeed();
 
-	Vector betweenVector(pos() - ball->pos());
+	Vector betweenVector(ball->pos() - pos());
 	betweenVector.setMagnitudeDirection(speed,
 		// add some randomness so we don't go indefinetely
 		betweenVector.direction() + deg2rad((KRandom::random() % 3) - 1)
 	);
 
-	ball->setVector(betweenVector);
-	// for some reason, x is always switched...
-	ball->setVelocity(Vector(-ball->velocity().x(), ball->velocity().y()));
+	ball->setVelocity(betweenVector);
 	ball->setState(Rolling);
 
 	setSpriteKey(QLatin1String("bumper_on"));
@@ -1108,7 +1106,7 @@
 {
 	bool wasCenter = false;
 
-	switch (result(ball->pos(), ball->curVector().magnitude(), &wasCenter))
+	switch (result(ball->pos(), ball->velocity().magnitude(), &wasCenter))
 	{
 		case Result_Holed:
 			place(ball, wasCenter);
@@ -1220,7 +1218,7 @@
 {
 	bool wasCenter = false;
 
-	switch (result(ball->pos(), ball->curVector().magnitude(), &wasCenter))
+	switch (result(ball->pos(), ball->velocity().magnitude(), &wasCenter))
 	{
 		case Result_Holed:
 			place(ball, wasCenter);
@@ -1260,7 +1258,7 @@
 	playSound("blackholeputin");
 
 	const double diff = (m_maxSpeed - m_minSpeed);
-	const double speed = m_minSpeed + ball->curVector().magnitude() * (diff / 3.75);
+	const double speed = m_minSpeed + ball->velocity().magnitude() * (diff / 3.75);
 
 	ball->setVelocity(Vector());
 	ball->setState(Stopped);
@@ -1281,14 +1279,14 @@
 {
 	ball->setPos(exitItem->pos());
 
-	Vector v = Vector::fromMagnitudeDirection(10, deg2rad(exitDeg));
-	ball->setVector(v);
+	Vector v = Vector::fromMagnitudeDirection(10, -deg2rad(exitDeg));
+	ball->setVelocity(v);
 
-	// advance ball 10
+	// advance ball by 10 units
 	ball->doAdvance();
 
 	v.setMagnitude(speed);
-	ball->setVector(v);
+	ball->setVelocity(v);
 
 	ball->setForceStillGoing(false);
 	ball->setVisible(true);
@@ -2671,7 +2669,7 @@
 	}
 
 	for (PlayerList::Iterator it = players->begin(); it != players->end(); ++it)
-		if ((*it).ball()->forceStillGoing() || ((*it).ball()->curState() == Rolling && \
(*it).ball()->curVector().magnitude() > 0 && (*it).ball()->isVisible())) +		if \
((*it).ball()->forceStillGoing() || ((*it).ball()->curState() == Rolling && \
(*it).ball()->velocity().magnitude() > 0 && (*it).ball()->isVisible()))  return;
 
 	int curState = curBall->curState();
@@ -3000,8 +2998,8 @@
 		if (ball->curState() == Holed)
 			continue;
 
-		Vector v;
-		if (ball->placeOnGround(v))
+		Vector oldVelocity;
+		if (ball->placeOnGround(oldVelocity))
 		{
 			ball->setPlaceOnGround(false);
 
@@ -3015,7 +3013,9 @@
 			{
 				(*it).ball()->setDoDetect(false);
 
-				double x = ball->x(), y = ball->y();
+				QPointF pos = ball->pos();
+				//normalize old velocity
+				const QPointF v = oldVelocity / oldVelocity.magnitude();
 
 				while (1)
 				{
@@ -3023,25 +3023,17 @@
 					bool keepMoving = false;
 					while (!list.isEmpty())
 					{
-						QGraphicsItem *item = list.first();
+						QGraphicsItem *item = list.takeFirst();
 						if (item->data(0) == Rtti_DontPlaceOn)
 							keepMoving = true;
-
-						list.pop_front();
 					}
 					if (!keepMoving)
 						break;
 
-					const float movePixel = 3.0;
-					x -= cos(v.direction()) * movePixel;
-					y += sin(v.direction()) * movePixel;
-
-					ball->setPos(x, y);
+					const qreal movePixel = 3.0;
+					pos -= v * movePixel;
+					ball->setPos(pos);
 				}
-
-				// move another two pixels away
-				x -= cos(v.direction()) * 2;
-				y += sin(v.direction()) * 2;
 			}
 			else if (choice == rehit)
 			{
@@ -3129,7 +3121,7 @@
 	emit maxStrokesReached(playerWhoMaxed);
 }
 
-void KolfGame::startBall(const Vector &vector)
+void KolfGame::startBall(const Vector &velocity)
 {
 	playSound("hit");
 
@@ -3137,7 +3129,7 @@
 	putter->setVisible(false);
 
 	(*curPlayer).ball()->setState(Rolling);
-	(*curPlayer).ball()->setVector(vector);
+	(*curPlayer).ball()->setVelocity(velocity);
 	(*curPlayer).ball()->shotStarted();
 
 	QList<QGraphicsItem *>::const_iterator item;
@@ -3170,7 +3162,7 @@
 
 	(*curPlayer).ball()->collisionDetect();
 
-	startBall(Vector::fromMagnitudeDirection(strength, putter->curAngle() + M_PI));
+	startBall(Vector::fromMagnitudeDirection(strength, -(putter->curAngle() + M_PI)));
 
 	addHoleInfo(ballStateList);
 }
@@ -3178,7 +3170,7 @@
 void KolfGame::addHoleInfo(BallStateList &list)
 {
 	list.player = (*curPlayer).id();
-	list.vector = (*curPlayer).ball()->curVector();
+	list.vector = (*curPlayer).ball()->velocity();
 	list.hole = curHole;
 }
 


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic