added zoom/drag controls, control panel minimizer

This commit is contained in:
MaxRobinsonTheGreat
2020-07-23 15:27:44 -06:00
parent 8fb471025e
commit b0af739747
7 changed files with 131 additions and 25 deletions

32
dist/css/style.css vendored
View File

@@ -15,9 +15,17 @@ body{
#env {
position: fixed;
top: 0;
bottom: 300px; /* must correspond to control-panel height*/
height: 100%;
width: 100%;
text-align: center;
transform: scale(1);
image-rendering: pixelated;
}
#env-canvas {
top: 0;
left: 0;
position: relative;
}
.control-panel {
@@ -56,6 +64,7 @@ button {
text-decoration: none;
display: inline-block;
font-size: 16px;
min-width: 30px;
}
button:hover{
background-color: #81d2c7;
@@ -72,6 +81,11 @@ button:hover{
grid-column: 1;
}
#view-controls {
float:right;
padding: 10px;
}
.col-row-input {
display: none;
}
@@ -130,11 +144,15 @@ button:hover{
width: 30px;
height: 30px;
}
.edit-mode-btn#drag-view {
background-color: #81d2c7;
}
#drop-org {
bottom: 0;
}
#editor-env {
image-rendering: pixelated;
height: 195px;
width: 195px;
}
@@ -189,3 +207,15 @@ button:hover{
#editor-mode-cont{
padding-top: 20px;
}
#minimize {
margin: 10px;
/* align-self: center; */
float: right;
}
#maximize {
position: fixed;
bottom: 10px;
right: 10px;
display: none;
}

9
dist/index.html vendored
View File

@@ -6,6 +6,7 @@
<link rel="stylesheet" href="./css/style.css">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
</head>
<body>
<script src="./js/bundle.js"></script>
@@ -15,6 +16,10 @@
</div>
<div class='control-panel'>
<div id='speed-controller' class='control-set'>
<div id='view-controls'>
<button id="reset-view" title="Reset View"><i class="fa fa-video-camera"></i></button>
<button class="edit-mode-btn" id="drag-view" title="Drag View"><i class="fa fa-arrows"></i></button>
</div>
<h2>Simulation Speed</h2>
<input id="slider" type="range" min="1" max="300" value="60">
<button id='pause-button'><i class="fa fa-pause"></i></button>
@@ -53,11 +58,12 @@
<p class='tabnav-item' id='editor'>Editor</p>
<p class='tabnav-item' id='hyperparameters'>Rule Tuning</p>
<p class='tabnav-item' id='stats'>Stats</p>
<button id="minimize" title="Minimze Control Panel"><i class="fa fa-minus"></i></button>
</div>
<div id='about' class='tab'>
<div class='left-half'>
<img src="../img/title.png" alt="Life Engine">
<img src="./img/title.png" alt="Life Engine">
<p>The Life Engine is a virtual ecosystem that allows organisms to grow, spread, and compete.</p>
<p>Each organism is made up by a structure of cells, which provide different benefits based on their color.</p>
@@ -171,5 +177,6 @@
</div>
</div>
</div>
<button id="maximize" title="Show Control Panel"><i class="fa fa-plus-square"></i></button>
</body>
</html>

2
dist/js/bundle.js vendored

File diff suppressed because one or more lines are too long

View File

@@ -22,37 +22,20 @@ class CanvasController{
defineEvents() {
this.canvas.addEventListener('mousemove', e => {
var prev_cell = this.cur_cell;
var prev_org = this.cur_org;
this.mouse_x = e.offsetX;
this.mouse_y = e.offsetY;
var colRow = this.env.grid_map.xyToColRow(this.mouse_x, this.mouse_y);
this.mouse_c = colRow[0];
this.mouse_r = colRow[1];
this.cur_cell = this.env.grid_map.cellAt(this.mouse_c, this.mouse_r);
this.cur_org = this.cur_cell.owner;
if (this.cur_org != prev_org || this.cur_cell != prev_cell) {
this.env.renderer.clearAllHighlights(true);
if (this.cur_org != null && this.highlight_org) {
this.env.renderer.highlightOrganism(this.cur_org);
}
else if (this.cur_cell != null) {
this.env.renderer.highlightCell(this.cur_cell, true);
}
}
this.updateMouseLocation(e.offsetX, e.offsetY)
this.mouseMove();
});
this.canvas.addEventListener('mouseup', function(evt) {
evt.preventDefault();
this.updateMouseLocation(evt.offsetX, evt.offsetY)
this.left_click=false;
this.right_click=false;
}.bind(this));
this.canvas.addEventListener('mousedown', function(evt) {
evt.preventDefault();
this.updateMouseLocation(evt.offsetX, evt.offsetY)
if (evt.button == 0) {
this.left_click = true;
}
@@ -73,6 +56,29 @@ class CanvasController{
}
updateMouseLocation(offsetX, offsetY) {
var prev_cell = this.cur_cell;
var prev_org = this.cur_org;
this.mouse_x = offsetX;
this.mouse_y = offsetY;
var colRow = this.env.grid_map.xyToColRow(this.mouse_x, this.mouse_y);
this.mouse_c = colRow[0];
this.mouse_r = colRow[1];
this.cur_cell = this.env.grid_map.cellAt(this.mouse_c, this.mouse_r);
this.cur_org = this.cur_cell.owner;
if (this.cur_org != prev_org || this.cur_cell != prev_cell) {
this.env.renderer.clearAllHighlights(true);
if (this.cur_org != null && this.highlight_org) {
this.env.renderer.highlightOrganism(this.cur_org);
}
else if (this.cur_cell != null) {
this.env.renderer.highlightCell(this.cur_cell, true);
}
}
}
mouseMove() {
alert("mouse move must be overriden");
}

View File

@@ -5,7 +5,8 @@ const Modes = {
ClickKill: 3,
Select: 4,
Edit: 5,
Clone: 6
Clone: 6,
Drag: 7
}
module.exports = Modes;

View File

@@ -5,6 +5,7 @@ const CellTypes = require("../Organism/Cell/CellTypes");
class ControlPanel {
constructor(engine) {
this.engine = engine;
this.defineMinMaxControls();
this.defineEngineSpeedControls();
this.defineGridSizeControls();
this.defineTabNavigation();
@@ -18,6 +19,19 @@ class ControlPanel {
this.editor_controller.setControlPanel(this);
}
defineMinMaxControls(){
$('#minimize').click ( function() {
console.log('hello')
$('.control-panel').css('display', 'none');
$('#maximize').css('display', 'block');
});
$('#maximize').click ( function() {
$('.control-panel').css('display', 'grid');
$('#maximize').css('display', 'none');
});
}
defineEngineSpeedControls(){
this.slider = document.getElementById("slider");
this.slider.oninput = function() {
@@ -197,12 +211,18 @@ class ControlPanel {
self.setMode(Modes.Clone);
self.env_controller.org_to_clone = self.engine.organism_editor.getCopyOfOrg();
break;
case "drag-view":
self.setMode(Modes.Drag);
}
$('.edit-mode-btn').css('background-color', '#9099c2');
$('#'+this.id).css('background-color', '#81d2c7');
});
$('#reset-view').click( function(){
this.env_controller.resetView();
}.bind(this));
var env = this.engine.env;
$('#reset-env').click( function() {
this.engine.env.reset();

View File

@@ -8,8 +8,42 @@ const Cell = require("../Organism/Cell/Cell");
class EnvironmentController extends CanvasController{
constructor(env, canvas) {
super(env, canvas);
this.mode = Modes.None;
this.mode = Modes.Drag;
this.org_to_clone = null;
this.defineZoomControls();
this.prev_x;
this.prev_y;
this.scale = 1;
}
defineZoomControls() {
var scale = 1;
var zoom_speed = 0.5;
const el = document.querySelector('#env-canvas');
el.onwheel = function zoom(event) {
event.preventDefault();
var sign = -1*Math.sign(event.deltaY);
// Restrict scale
scale = Math.max(0.5, scale+(sign*zoom_speed));
// Apply scale transform
el.style.transform = `scale(${scale})`;
this.scale = scale;
}.bind(this);
}
resetView() {
$('#env-canvas').css('transform', 'scale(1)');
$('#env-canvas').css('top', '0px');
$('#env-canvas').css('left', '0px');
this.scale = 1;
}
updateMouseLocation(offsetX, offsetY){
this.prev_x = this.mouse_x;
this.prev_y = this.mouse_y;
super.updateMouseLocation(offsetX, offsetY);
}
mouseMove() {
@@ -68,6 +102,14 @@ class EnvironmentController extends CanvasController{
}
}
break;
case Modes.Drag:
var cur_top = parseInt($('#env-canvas').css('top'), 10);
var cur_left = parseInt($('#env-canvas').css('left'), 10);
var new_top = (cur_top + (this.mouse_y - this.prev_y)*this.scale);
var new_left = (cur_left + (this.mouse_x - this.prev_x)*this.scale);
$('#env-canvas').css('top', new_top+'px');
$('#env-canvas').css('left', new_left+'px');
break;
}
}
}