Zwaartekracht
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!
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
/**
* @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);
};
};
* @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?
Moet dit geen 9,81 m/s2 zijn ?
Ik ben al 40 jaar van school af dus ik kan er naast zitten.
http://nl.wikipedia.org/wiki/Zwaartekracht
@Pipo: De zwaartekracht kan ik achteraf nog altijd aanpassen, dit is enkel om te testen.
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: Evoor = Ena
In een simpel model, zonder wrijving, levert dit op:
(Ez + Ek)voor = (Ez + Ek)na
(m * g * h + .5 * m * v2)voor = (m * g * h + .5 * m * v2)na
Aangenomen dat de beginsnelheid 0 is (dus het moment dat je bijv. een balletje net loslaat):
m * g * h = .5 * m * v2
9.81 * h = .5 * v2
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 * vvoor2 = .5 * m * vna2
9.81 * h + .5 * vvoor2 = .5 * vna2
vna = wortel(19.62 * h + vvoor2)
Wil je het echter realistisch maken, dan moet je ook nog de wrijvingskracht erbij nemen. En dan wordt het al praktisch onmogelijk...
Gewijzigd op 01/05/2014 20:24:35 door Wouter J
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.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
/**
* @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;
}
};
* @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.