Hallo,

Ik heb de volgende class, die ik gebruik in een platformer.
Nu lukt het me alleen niet om de zwaartekracht goed te krijgen, ik heb al op internet rond gezocht maar ik heb nog niet echt een handige manier gevonden om dit te doen.

Ken iemand me hiermee helpen?

Alvast bedankt!


/**
 * @class Player
 */
var Player = function Player()
{
	/**
	 * @returns {Object}
	 */
	var _self = this;

	/**
	 * @returns {Number}
	 */
	_self.id = -1;

	/**
	 * @returns {String}
	 */
	_self.name = 'player';

	/**
	 * @returns {Number}
	 */
	_self.x = 0;

	/**
	 * @returns {Number}
	 */
	_self.y = 0;

	/**
	 * @returns {Number}
	 */
	_self.z = 0;

	/**
	 * @returns {Number}
	 */
	_self.width = 32;

	/**
	 * @returns {Number}
	 */
	_self.height = 32;

	/**
	 * @returns {String}
	 */
	_self.color = '#FF0000';

	/**
	 * @returns {Number}
	 */
	_self.speed = 3;

	/**
	 * @returns {Number}
	 */
	_self.velocityX = 0;

	/**
	 * @returns {Number}
	 */
	_self.velocityY = 0;

	/**
	 * @returns {Number}
	 */
	_self.gravity = 0.8;

	/**
	 * @returns {Boolean}
	 */
	_self.onFloor = false;

	/**
	 * @syntax Player.onUpdate()
	 */
	_self.onUpdate = function()
	{
		_self.velocityY += _self.gravity;
		_self.y += _self.velocityY;

		Client.getEntitiesByName('collision1').forEach(function(collision1, index)
		{
			if (collide(_self, collision1))
			{
			}
		});

		if (Client.isKeyPressed('up'))
		{
			_self.velocityY = -15;
		}

		if (Client.isKeyHold('left'))
		{
			_self.x -= _self.speed;
		}

		if (Client.isKeyHold('right'))
		{
			_self.x += _self.speed;
		}
	};

	/**
	 * @syntax Player.onDraw()
	 */
	_self.onDraw = function()
	{
		Client.context.fillStyle = _self.color;
		Client.context.fillRect(_self.x, _self.y, _self.width, _self.height);
	};
};
En waar loop je op vast?
@aar: Ik loop vast doordat ik niet weet hoe ik nu verder moet. Ik kan ook nergens een voorbeeld vinden waarbij wordt uitgelegd hoe je dit toepast.

@Pipo: De zwaartekracht kan ik achteraf nog altijd aanpassen, dit is enkel om te testen.

Waarom gebruik je _self en niet this?
En wat bedoel je met "niet goed krijgen"?

Wil je de werkelijkheid nabootsen dan heb je een ingewikkeld stukje natuur te pakken :) De snelheid die de zwaartekracht oplevert kun je uitrekenen met de wet van behoudt van energie: E[sub]voor[/sub] = E[sub]na[/sub]
In een simpel model, zonder wrijving, levert dit op:
(E[sub]z[/sub] + E[sub]k[/sub])[sub]voor[/sub] = (E[sub]z[/sub] + E[sub]k[/sub])[sub]na[/sub]
(m * g * h + .5 * m * v[sup]2[/sup])[sub]voor[/sub] = (m * g * h + .5 * m * v[sup]2[/sup])[sub]na[/sub]
Aangenomen dat de beginsnelheid 0 is (dus het moment dat je bijv. een balletje net loslaat):
m * g * h = .5 * m * v[sup]2[/sup]
9.81 * h = .5 * v[sup]2[/sup]
v = wortel(19.62 * h)

Hierbij is h de hoogte van het voorwerp.

Stel de totale val duurt 3 seconde en je wilt de snelheid op 2 seconde uitrekenen dan heb je wel een beginsnelheid en wordt het allemaal een stukje ingewikkelder:
m * g * h + .5 * m * v[sub]voor[/sub][sup]2[/sup] = .5 * m * v[sub]na[/sub][sup]2[/sup]
9.81 * h + .5 * v[sub]voor[/sub][sup]2[/sup] = .5 * v[sub]na[/sub][sup]2[/sup]
v[sub]na[/sub] = wortel(19.62 * h + v[sub]voor[/sub][sup]2[/sup])

Wil je het echter realistisch maken, dan moet je ook nog de wrijvingskracht erbij nemen. En dan wordt het al praktisch onmogelijk...
Het hoeft niet realistisch hoor, het enige wat ik moet kunnen is lopen en springen, maar ik heb geen idee waar / hoe ik moet beginnen. En ik gebruik _self in plaats van this omdat this in bijvoorbeeld forEach verwijst naar de forEach en niet naar het object waar de forEach in plaats vindt.
Als ik zie dat de verticale snelheid op '15' wordt gezet, zal de zwaartekracht wel iets moeten zijn als -15 oid?

_self.velocityY = -15;


Dus zou je elke 100 milliseconden iets als -5 Y kunnen doen.
Wat ik op dit moment heb is het volgende:


/**
 * @syntax Player.onUpdate()
 */
_self.onUpdate = function()
{
	_self.velocityY += _self.gravity;

	_self.x += _self.velocityX;
	_self.y += _self.velocityY;

	Client.getEntitiesByName('collision1').forEach(function(collision1, index)
	{
		if (collide(_self, collision1))
		{
			if (_self.velocityY < 0)
			{
				_self.y = collision1.y + collision1.height;
			}
			else if (_self.velocityY > 0)
			{
				_self.y = collision1.y - _self.height;
			}

			_self.velocityY = 0;
		}
	});

	if (Client.isKeyPressed('up'))
	{
		_self.velocityY = -15;
	}

	if (Client.isKeyHold('left'))
	{
		_self.x -= _self.speed;
	}

	if (Client.isKeyHold('right'))
	{
		_self.x += _self.speed;
	}
};


De zwaartekracht werkt nu, ik kan tegen de onderkant van blokken aanspringen en tegen de bovenkant. Het lopen werkt ook maar ik kan nog gewoon horizontaal door blokken heenlopen. Hoe kan ik dat het best aanpakken?
Bij houden waar blokken zitten, dus de (x,y) van hun outlines en dan zorgen dat je daar niet tussen kan komen.

Reageren