Uh.
This commit is contained in:
parent
0e7ebc5c1f
commit
679274de2f
@ -4,7 +4,7 @@
|
||||
{% block head %}
|
||||
<meta charset="utf-8">
|
||||
<title>{% block title %}Writings by Shoofle{% endblock %}</title>
|
||||
<script src="/static/jquery.min.js" type="text/javascript"></script>
|
||||
<script src="/static/jquery-2.0.3.js" type="text/javascript"></script>
|
||||
<link href="/static/bootstrap/css/bootstrap.css" rel="stylesheet" type="text/css">
|
||||
<link href="/static/bootstrap/css/bootstrap-responsive.css" rel="stylesheet" type="text/css">
|
||||
<link href="/static/shoofle.css" rel="stylesheet" type="text/css">
|
||||
|
@ -3,6 +3,7 @@
|
||||
<script type="text/javascript" src="/static/flot/jquery.flot.js"></script>
|
||||
<script type="text/javascript" src="/static/flot/jquery.flot.resize.js"></script>
|
||||
<script type="text/javascript" src="engine.js"></script>
|
||||
<script type="text/javascript" src="supporting_math.js"></script>
|
||||
<h1>Dynamic Systems in Games</h1>
|
||||
<p>Here, take a look at this simple game I coded up. Your task is to keep an engine's temperature as high as possible, to maximize power output, without dmaaging the engine. The threshhold for damage is at <span data-var="damage_threshhold">10</span> degrees, and the engine will stop burning and deignite if it goes under <span data-var="ignition_threshhold">2</span> degrees.</p>
|
||||
<div class="row-fluid">
|
||||
@ -97,18 +98,17 @@
|
||||
<div id="fuel-management-4" class="span4 offset4">
|
||||
<script type="text/javascript">
|
||||
// describe a better potential graph
|
||||
var e4=engine($('#fuel-management-4'), function (sq) {
|
||||
if (sq.temperature.value < sq.ignition_threshhold.value) {
|
||||
return 0;
|
||||
}
|
||||
var y = 0;
|
||||
y += 10*recenter(dgauss,
|
||||
10*sq.fuel_flow_rate.value + sq.ignition_threshhold.value,
|
||||
Math.sqrt(10*sq.fuel_flow_rate.value)) (sq.temperature.value);
|
||||
y -= 5*recenter(dgauss,
|
||||
10*sq.fuel_flow_rate.value + sq.ignition_threshhold.value,
|
||||
Math.sqrt(2*sq.fuel_flow_rate.value)) (sq.temperature.value);
|
||||
return y;
|
||||
var f, t, i;
|
||||
var e4=alt_engine($('#fuel-management-4'), function (sq) {
|
||||
f = sq.fuel_flow_rate.value;
|
||||
t = sq.temperature.value;
|
||||
i = sq.ignition_threshhold.value;
|
||||
return -5*(
|
||||
exp_decay(0.5, 0.3) (t) +
|
||||
exp_growth(0.5, 10) (t) +
|
||||
Math.sqrt(1+60*f)*(make_bell(10*f+i, Math.sqrt(10*f+1)) (t)) +
|
||||
-1*Math.sqrt(1+10*f)*(make_bell(10*f+i, Math.sqrt(f+1)) (t))
|
||||
);
|
||||
});
|
||||
</script>
|
||||
<div class="flow_rate">
|
||||
|
@ -1,7 +1,14 @@
|
||||
var cfg = {
|
||||
xaxis: { min:0, max:15, tickSize: 3 },
|
||||
yaxis: { min:-20, max:20, show: false },
|
||||
series: { lines: { lineWidth: 4, }, points: { radius: 0.1, } },
|
||||
colors: ['gray'],
|
||||
};
|
||||
function engine(element, reaction_rate_function) {
|
||||
var e = {}; // the engine object!
|
||||
e.container = $(element);
|
||||
var q = {};
|
||||
e.reaction_rate_function = reaction_rate_function;
|
||||
e.quantities = q;
|
||||
q.temperature = {
|
||||
"update": function () {
|
||||
@ -25,7 +32,7 @@ function engine(element, reaction_rate_function) {
|
||||
},
|
||||
"value": 0,
|
||||
"graph_data": {
|
||||
data: [[0,10],[0,0],[0,-10]],
|
||||
data: [[0,cfg.yaxis.max+2],[0,0],[0,cfg.yaxis.min-2]],
|
||||
lines: {show: true, lineWidth: 1},
|
||||
points: {show: true, radius: 3},
|
||||
color: 'red',
|
||||
@ -57,7 +64,7 @@ function engine(element, reaction_rate_function) {
|
||||
q.ignition_threshhold = {
|
||||
"update": function () {},
|
||||
"out": function() {
|
||||
this.graph_data.data = [[this.value, 10], [this.value, -10], [-this.value, -10], [-this.value, 10], [this.value, 10]];
|
||||
this.graph_data.data = [[this.value, cfg.yaxis.max+2], [this.value, cfg.yaxis.min-2], [-this.value, cfg.yaxis.min-2], [-this.value, cfg.yaxis.max+2], [this.value, cfg.yaxis.max+2]];
|
||||
},
|
||||
"value": 2,
|
||||
"graph_data": {
|
||||
@ -70,7 +77,7 @@ function engine(element, reaction_rate_function) {
|
||||
q.damage_threshhold = {
|
||||
"update": function () {},
|
||||
"out": function() {
|
||||
this.graph_data.data = [[this.value, -10], [this.value, 10], [20*this.value, 10], [20*this.value, -10], [this.value, -10]];
|
||||
this.graph_data.data = [[this.value, cfg.yaxis.min-2], [this.value, cfg.yaxis.max+2], [20*this.value, cfg.yaxis.max+2], [20*this.value, cfg.yaxis.min-2], [this.value, cfg.yaxis.min-2]];
|
||||
},
|
||||
"value": 10,
|
||||
"graph_data": {
|
||||
@ -105,7 +112,7 @@ function engine(element, reaction_rate_function) {
|
||||
|
||||
e.graph_config = {
|
||||
xaxis: { min:0, max:15, tickSize: 3 },
|
||||
yaxis: { min:-8, max:8, show: false },
|
||||
yaxis: { min:-20, max:20, show: false },
|
||||
series: { lines: { lineWidth: 4, }, points: { radius: 0.1, } },
|
||||
colors: ['gray'],
|
||||
};
|
||||
@ -158,3 +165,15 @@ function engine(element, reaction_rate_function) {
|
||||
});
|
||||
return e;
|
||||
}
|
||||
|
||||
function temperature_derivative (fn, step) {
|
||||
return function (quantities) {
|
||||
var next_input = $.extend({}, quantities);
|
||||
next_input.temperature = {"value": quantities.temperature.value + step};
|
||||
return (fn(next_input) - fn(quantities))/step;
|
||||
};
|
||||
};
|
||||
var step = 0.005;
|
||||
function alt_engine(element, reaction_rate_potential_function) {
|
||||
return engine(element, temperature_derivative(reaction_rate_potential_function, step));
|
||||
}
|
20
articles/dynamic_systems_in_games/supporting_math.js
Normal file
20
articles/dynamic_systems_in_games/supporting_math.js
Normal file
@ -0,0 +1,20 @@
|
||||
function make_gaussian(mean, standard_deviation) {
|
||||
return function (x) {
|
||||
return Math.exp(-Math.pow((x-mean)/standard_deviation, 2))/(standard_deviation * Math.sqrt(2*Math.PI));
|
||||
};
|
||||
}
|
||||
function make_bell(mean, standard_deviation) {
|
||||
return function (x) {
|
||||
return Math.exp(-Math.pow((x-mean)/standard_deviation, 2));
|
||||
};
|
||||
}
|
||||
function exp_decay(height, width) {
|
||||
return function (x) {
|
||||
return height*Math.exp(-x/width);
|
||||
};
|
||||
}
|
||||
function exp_growth(height, width) {
|
||||
return function (x) {
|
||||
return height*Math.exp(x/width);
|
||||
};
|
||||
}
|
@ -134,6 +134,7 @@
|
||||
<span class="achievement normal">Beat the Elite Four</span>
|
||||
</div>
|
||||
</li>
|
||||
<li>Prince of Persia (1989)</li>
|
||||
<li>Prince of Persia: Sands of Time</li>
|
||||
<li>Prince of Persia (2008)</li>
|
||||
<li>Super Smash Brothers: Melee
|
||||
@ -167,6 +168,8 @@
|
||||
<p class="thoughts">I think this might be my #1 pick for best Zelda game.</p>
|
||||
</li>
|
||||
<li>Legend of Zelda: Ocarina of Time</li>
|
||||
<li>Legend of Zelda: Majora's Mask</li>
|
||||
<li>Legend of Zelda: The Wind Waker</li>
|
||||
<li>Legend of Zelda: Twilight Princess</li>
|
||||
<li>Super Mario 64</li>
|
||||
<li>Super Mario Sunshine</li>
|
||||
@ -234,6 +237,11 @@
|
||||
<span class="achievement normal">Discovered all the particles</span>
|
||||
</div>
|
||||
</li>
|
||||
<li>Guns of Icarus
|
||||
<div class="accolades">
|
||||
<span class="achievement bad">unfinished</span>
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
</section>
|
||||
<section>
|
||||
|
8829
static/jquery-2.0.3.js
vendored
Normal file
8829
static/jquery-2.0.3.js
vendored
Normal file
File diff suppressed because it is too large
Load Diff
1
static/jquery-2.0.3.min.map
Normal file
1
static/jquery-2.0.3.min.map
Normal file
File diff suppressed because one or more lines are too long
Loading…
Reference in New Issue
Block a user