diff options
| -rw-r--r-- | blocks.js | 6 | ||||
| -rw-r--r-- | objects.js | 15 | ||||
| -rw-r--r-- | overpass.xml | 2 | ||||
| -rw-r--r-- | threads.js | 109 |
4 files changed, 44 insertions, 88 deletions
@@ -6653,9 +6653,9 @@ InputSlotMorph.prototype.messagesReceivedMenu = function () { InputSlotMorph.prototype.collidablesMenu = function () { var dict = { - 'mouse-pointer' : ['mouse-pointer'], + /*'mouse-pointer' : ['mouse-pointer'], edge : ['edge'], - 'pen trails' : ['pen trails'] + 'pen trails' : ['pen trails']*/ }, rcvr = this.parentThatIsA(BlockMorph).receiver(), stage = rcvr.parentThatIsA(StageMorph), @@ -6679,7 +6679,7 @@ InputSlotMorph.prototype.collidablesMenu = function () { InputSlotMorph.prototype.distancesMenu = function () { var dict = { - 'mouse-pointer' : ['mouse-pointer'] + //'mouse-pointer' : ['mouse-pointer'] }, rcvr = this.parentThatIsA(BlockMorph).receiver(), stage = rcvr.parentThatIsA(StageMorph), @@ -815,12 +815,6 @@ SpriteMorph.prototype.initBlocks = function () { category: 'sensing', spec: 'touching %clr ?' }, - reportColorIsTouchingColor: { - only: SpriteMorph, - type: 'predicate', - category: 'sensing', - spec: 'color %clr is touching %clr ?' - }, colorFiltered: { dev: true, type: 'reporter', @@ -2030,7 +2024,6 @@ SpriteMorph.prototype.blockTemplates = function (category) { blocks.push(block('reportTouchingObject')); blocks.push(block('reportTouchingColor')); - blocks.push(block('reportColorIsTouchingColor')); blocks.push('-'); blocks.push(block('doAsk')); blocks.push(watcherToggle('getLastAnswer')); @@ -2899,6 +2892,14 @@ SpriteMorph.prototype.removeClone = function () { // SpriteMorph primitives +SpriteMorph.prototype.isTouching = function (other) { + var me = L.latLng(this.yPosition(), this.xPosition()); + target = L.latLng(other.yPosition(), other.xPosition()); + + // could also use leaflet's equals + return me.distanceTo(target) < 1; // 1 meter magic number +}; + // SpriteMorph hiding and showing: /* diff --git a/overpass.xml b/overpass.xml index 50fc971..9299943 100644 --- a/overpass.xml +++ b/overpass.xml @@ -1 +1 @@ -<blocks app="Snap! 4.0, http://snap.berkeley.edu" version="1"><block-definition s="ist Längengrad: %'Längengrad' Breitengrad: %'Breitengrad' innerhalb einer Fläche der Farbe von %'SpriteName' ?" type="predicate" category="sensing"><header></header><code></code><inputs><input type="%n"></input><input type="%n"></input><input type="%txt">Sprite</input></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>spriteName</l><l>lat</l><l>lon</l></list><l>var layers = window.penShapes, sprites = world.children[0].sprites.asArray(), sprite;
for (j = 0; j < sprites.length; j++) {
 if (sprites[j].name == spriteName) {
 sprite = sprites[j];
 break;
 }
}
if (!sprite) {
 return false;
}
var matches = leafletPip.pointInLayer([lon, lat], layers);

for (var j = 0; j < matches.length; j++) {
 if (matches[j].options.color == sprite.color) {
 return true;
 }
}

return false;</l></block><list><block var="SpriteName"/><block var="Breitengrad"/><block var="Längengrad"/></list></block></block></script></block-definition><block-definition s="ist eine Straße nahe Längengrad: %'lon' Breitengrad: %'lat'" type="predicate" category="sensing"><header></header><code></code><inputs><input type="%n"></input><input type="%n"></input></inputs><script><block s="doReport"><block s="reportGreaterThan"><block s="reportListLength"><block s="overpassQuery"><block s="reportJoinWords"><list><l>way(around:7,</l><block var="lat"/><l>,</l><block var="lon"/><l>)[highway];out;</l></list></block></block></block><l>0</l></block></block></script></block-definition><block-definition s="ist ein Gebäude nahe Längengrad: %'lon' Breitengrad: %'lat'" type="predicate" category="sensing"><header></header><code></code><inputs><input type="%n"></input><input type="%n"></input></inputs><script><block s="doReport"><block s="reportGreaterThan"><block s="reportListLength"><block s="overpassQuery"><block s="reportJoinWords"><list><l>way(around:5,</l><block var="lat"/><l>,</l><block var="lon"/><l>)[building];out;</l></list></block></block></block><l>0</l></block></block></script></block-definition><block-definition s="Größe des von mit %'SpriteName' s Farbe markierten Feldes" type="reporter" category="sensing"><header></header><code></code><inputs><input type="%txt">Sprite</input></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>spriteName</l></list><l>var size = 0, layers = window.penShapes.getLayers(), sprites = world.children[0].sprites.asArray(), sprite;
for (j = 0; j < sprites.length; j++) {
 if (sprites[j].name == spriteName) {
 sprite = sprites[j];
 break;
 }
}
if (!sprite) {
 return 0;
}
for (j = 0; j < layers.length; j++) {
 if (layers[j].options.color == sprite.color) {
 size += LGeo.area(layers[j]);
 }
}
return size;</l></block><list><block var="SpriteName"/></list></block></block></script></block-definition></blocks>
\ No newline at end of file +<blocks app="Snap! 4.0, http://snap.berkeley.edu" version="1"><block-definition s="ist eine Straße nahe Längengrad: %'lon' Breitengrad: %'lat'" type="predicate" category="sensing"><header></header><code></code><inputs><input type="%n"></input><input type="%n"></input></inputs><script><block s="doReport"><block s="reportGreaterThan"><block s="reportListLength"><block s="overpassQuery"><block s="reportJoinWords"><list><l>way(around:7,</l><block var="lat"/><l>,</l><block var="lon"/><l>)[highway];out;</l></list></block></block></block><l>0</l></block></block></script></block-definition><block-definition s="ist ein Gebäude nahe Längengrad: %'lon' Breitengrad: %'lat'" type="predicate" category="sensing"><header></header><code></code><inputs><input type="%n"></input><input type="%n"></input></inputs><script><block s="doReport"><block s="reportGreaterThan"><block s="reportListLength"><block s="overpassQuery"><block s="reportJoinWords"><list><l>way(around:5,</l><block var="lat"/><l>,</l><block var="lon"/><l>)[building];out;</l></list></block></block></block><l>0</l></block></block></script></block-definition><block-definition s="Größe des von mit %'SpriteName' s Farbe markierten Feldes" type="reporter" category="sensing"><header></header><code></code><inputs><input type="%txt">Sprite</input></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>spriteName</l></list><l>var size = 0, layers = window.penShapes.getLayers(), sprites = world.children[0].sprites.asArray(), sprite;
for (j = 0; j < sprites.length; j++) {
 if (sprites[j].name == spriteName) {
 sprite = sprites[j];
 break;
 }
}
if (!sprite) {
 return 0;
}
for (j = 0; j < layers.length; j++) {
 if (layers[j].options.color == sprite.color) {
 size += LGeo.area(layers[j]);
 }
}
return size;</l></block><list><block var="SpriteName"/></list></block></block></script></block-definition></blocks>
\ No newline at end of file @@ -2444,39 +2444,16 @@ Process.prototype.objectTouchingObject = function (thisObj, name) { // and for any parts (subsprites) var myself = this, those, - stage, - box, - mouse; + box; - if (this.inputOption(name) === 'mouse-pointer') { - mouse = thisObj.world().hand.position(); - if (thisObj.bounds.containsPoint(mouse) && - !thisObj.isTransparentAt(mouse)) { + stage = thisObj.parentThatIsA(StageMorph); + if (stage) { + those = this.getObjectsNamed(name, thisObj, stage); // clones + if (those.some(function (any) { + return thisObj.isTouching(any); + })) { return true; } - } else { - stage = thisObj.parentThatIsA(StageMorph); - if (stage) { - if (this.inputOption(name) === 'edge') { - box = thisObj.bounds; - if (!thisObj.costume && thisObj.penBounds) { - box = thisObj.penBounds.translateBy(thisObj.position()); - } - if (!stage.bounds.containsRectangle(box)) { - return true; - } - } - if (this.inputOption(name) === 'pen trails' && - thisObj.isTouching(stage.penTrailsMorph())) { - return true; - } - those = this.getObjectsNamed(name, thisObj, stage); // clones - if (those.some(function (any) { - return thisObj.isTouching(any); - })) { - return true; - } - } } return thisObj.parts.some( function (any) { @@ -2488,68 +2465,46 @@ Process.prototype.objectTouchingObject = function (thisObj, name) { Process.prototype.reportTouchingColor = function (aColor) { // also check for any parts (subsprites) var thisObj = this.homeContext.receiver, - stage; + color = aColor.toString(), + stage, sprites; + console.log('color', color); if (thisObj) { - stage = thisObj.parentThatIsA(StageMorph); - if (stage) { - if (thisObj.isTouching(stage.colorFiltered(aColor, thisObj))) { - return true; - } - return thisObj.parts.some( - function (any) { - return any.isTouching(stage.colorFiltered(aColor, any)); + console.log(thisObj.parts.length); + return thisObj.parts.concat([thisObj]).some( + function (any) { + // check if a sprite is inside a polygon colored 'aColor' + var matches = leafletPip.pointInLayer( + // leafletPip swaps lat/lon, be careful + [any.xPosition(), any.yPosition()], + window.penShapes); + for (var j = 0; j < matches.length; j++) { + console.log('match color', matches[j].options.color); + if (matches[j].options.color == color) { + console.log('Hoooray!'); + return true; + } } - ); - } - } - return false; -}; - -Process.prototype.reportColorIsTouchingColor = function (color1, color2) { - // also check for any parts (subsprites) - var thisObj = this.homeContext.receiver, - stage; - - if (thisObj) { - stage = thisObj.parentThatIsA(StageMorph); - if (stage) { - if (thisObj.colorFiltered(color1).isTouching( - stage.colorFiltered(color2, thisObj) - )) { - return true; + return false; } - return thisObj.parts.some( - function (any) { - return any.colorFiltered(color1).isTouching( - stage.colorFiltered(color2, any) - ); - } - ); - } + ); } return false; }; Process.prototype.reportDistanceTo = function (name) { var thisObj = this.blockReceiver(), - thatObj, stage, - rc, - point; + thatObj; if (thisObj) { - rc = thisObj.rotationCenter(); - point = rc; - if (this.inputOption(name) === 'mouse-pointer') { - point = thisObj.world().hand.position(); - } stage = thisObj.parentThatIsA(StageMorph); thatObj = this.getOtherObject(name, thisObj, stage); - if (thatObj) { - point = thatObj.rotationCenter(); - } - return rc.distanceTo(point) / stage.scale; + var thisPoint = L.latLng(thisObj.yPosition(), thisObj.xPosition()); + thatPoint = L.latLng(thatObj.yPosition(), thatObj.xPosition()); + + // in meters + return thisPoint.distanceTo(thatPoint); } return 0; }; |
