Discuss Scratch
- inoking
-
Scratcher
1000+ posts
Scratch2.0をModする会
x, y 座標の変換にてついてMODしてみました。
提案反対派の私がするのもナンですが。。。
結論から言うと難しいです。完全にはできませんでした。
内部的には変換できましたが見た目が変わりません。
変換後のブロックをクリックすると変換後の座標値が表示されるので内部的には変換できていることは確認できます。
表示言語を選択し直すか、プロジェクトを開き直すかすると表示も切り替わります。
見た目が変わらないのは、
相互変換に使用する共通処理が「表示のための変換処理」が 不要 な加減乗除や等号不等号だけに対して実装されているからです。

変更箇所:
src/scratch/BlockMenus.as:
見た目が変わらない原因となっている処理:
blocks/Block.as:
提案反対派の私がするのもナンですが。。。
結論から言うと難しいです。完全にはできませんでした。
内部的には変換できましたが見た目が変わりません。
変換後のブロックをクリックすると変換後の座標値が表示されるので内部的には変換できていることは確認できます。
表示言語を選択し直すか、プロジェクトを開き直すかすると表示も切り替わります。
見た目が変わらないのは、
相互変換に使用する共通処理が「表示のための変換処理」が 不要 な加減乗除や等号不等号だけに対して実装されているからです。

変更箇所:
src/scratch/BlockMenus.as:
public class BlockMenus implements DragClient {
...
private static const basicMathOps:Array = ['+', '-', '*', '/'];
private static const comparisonOps:Array = ['<', '=', '>'];
private static const positionOps:Array = ['xpos', 'ypos']; // 追加
...
public static function BlockMenuHandler(evt:MouseEvent, block:Block, blockArg:BlockArg = null, menuName:String = null):void {
...
if ((basicMathOps.indexOf(op)) > -1) { menuHandler.changeOpMenu(evt, basicMathOps); return; }
if ((comparisonOps.indexOf(op)) > -1) { menuHandler.changeOpMenu(evt, comparisonOps); return; }
if ((positionOps.indexOf(op)) > -1) { menuHandler.changeOpMenu(evt, positionOps); return; } // 追加
...
見た目が変わらない原因となっている処理:
blocks/Block.as:
public function changeOperator(newOp:String):void {
// Used to switch among a family of related operators (e.g. +, -, *, and /).
// Note: This does not deal with translation, so it only works for symbolic operators.
for each (var item:* in labelsAndArgs) {
if ((item is TextField) && (item.text == op)) item.text = newOp;
}
op = newOp;
opFunction = null;
fixArgLayout();
}
- MMGISS_sub
-
Scratcher
43 posts
Scratch2.0をModする会
あ、すみません。~略~本筋でなくてすみません。
いままで配列全体を文字列型で参照するものといえば、
(list :: list)これしかなく、また要素をつなげる文字も半角スペースで固定されてました。
~略~
どうやると半角スペースで結合できますか?
変数にリストを代入してみたところ間に何も入らずそのままつながりました。
配列の全要素が1文字であれば間に半角スペースが入ることはありません。
配列の要素のうちどれか一つでも複数文字であった場合は、半角スペースが入ります。
- MMGISS_sub
-
Scratcher
43 posts
Scratch2.0をModする会
x, y 座標の変換にてついてMODしてみました。そうですね…
(略)
見た目が変わらないのは、
相互変換に使用する共通処理が「表示のための変換処理」が 不要 な加減乗除や等号不等号だけに対して実装されているからです。
(略)
見た目が変わらない原因となっている処理:
blocks/Block.as:
public function changeOperator(newOp:String):void {
// Used to switch among a family of related operators (e.g. +, -, *, and /).
// Note: This does not deal with translation, so it only works for symbolic operators.
for each (var item:* in labelsAndArgs) {
if ((item is TextField) && (item.text == op)) item.text = newOp;
}
op = newOp;
opFunction = null;
fixArgLayout();
}
同じようにしてandとorの相互変換も試して見ていたのですが
これじゃあ難しいですね…
このScratchのソースにちょこっと追加して色々するだけでは相互変換は無理かもしれません
何とかして実現させたいものですが..
- rapitan
-
Scratcher
100+ posts
Scratch2.0をModする会
-削除しました-
Last edited by rapitan (Sept. 7, 2019 11:47:26)
- inoking
-
Scratcher
1000+ posts
Scratch2.0をModする会
60FPSとかにすると結構おもしろいです。
ターボモードのように速くなります。
もちろん元々間に合っていない処理は速くなりません。
src/Scratch.as:
ターボモードのように速くなります。
もちろん元々間に合っていない処理は速くなりません。
src/Scratch.as:
stage.frameRate = 30; // 60 にする
- inoking
-
Scratcher
1000+ posts
Scratch2.0をModする会
MODした Scratch.swf でオリジナルを置き換えると、
メニューからロゴや Tips, About が消え
コスチューム等の素材データ (media フォルダ等に格納) にもアクセスできなくなります。
ソースを検索してもそれらしいところは見つからなかったのですが
何か情報お持ちの方はいませんか?
メニューからロゴや Tips, About が消え
コスチューム等の素材データ (media フォルダ等に格納) にもアクセスできなくなります。
ソースを検索してもそれらしいところは見つからなかったのですが
何か情報お持ちの方はいませんか?
- inoking
-
Scratcher
1000+ posts
Scratch2.0をModする会
MOD全般の話をされていますか?公開すると、そこを編集してmod版を本サイトにupするなどの不正が行われるかもしれないからですソースコードの情報は公開しないほうがいいです。すみません、これはどういう意味でしょうか?
ソースの情報を公開しないと自分で試すこともできませんし
本サイトにアップしようとしても本流には反映できないので問題ないと思います。
- abee
-
Scratcher
1000+ posts
Scratch2.0をModする会
Scratchのソースをmodした場合、必ずそのソースを公開しなければなりません。
これはライセンス(GPL v2)で決まっています。これはScratchのリスペクトしてリミックスするという考えと基本的に同じです。
https://github.com/LLK/scratch-flash/blob/develop/COPYING
ソースを公開するから悪用されるのではなく、みんながソースを知っていることにより、なにかあったときに対策でき、悪用を防げるのです。
本サイトに直接modをアップすることはできず、pull requestされたソースは、慎重に審査されて本体に取り込まれるかどうかが決まります。
これはライセンス(GPL v2)で決まっています。これはScratchのリスペクトしてリミックスするという考えと基本的に同じです。
https://github.com/LLK/scratch-flash/blob/develop/COPYING
ソースを公開するから悪用されるのではなく、みんながソースを知っていることにより、なにかあったときに対策でき、悪用を防げるのです。
本サイトに直接modをアップすることはできず、pull requestされたソースは、慎重に審査されて本体に取り込まれるかどうかが決まります。
- inoking
-
Scratcher
1000+ posts
Scratch2.0をModする会
Scratchのソースをmodした場合、必ずそのソースを公開しなければなりません。ちなみに
これは改変したものを頒布する場合の話で、個人的に改変しているだけの場合には該当しませんよね。
- abee
-
Scratcher
1000+ posts
Scratch2.0をModする会
その通りです。リミックスして公開しない場合と同じです。
Last edited by abee (July 27, 2017 23:45:24)
- MMGISS
-
Scratcher
1000+ posts
Scratch2.0をModする会
https://scratch.mit.edu/discuss/post/2750402/
(Scratch2.0の提案)で投稿したものです。


ペンの状態を返すブロックを追加してほしいという提案があったのでModして作ってみたものです。
src/primitives/MotionAndPenPrims.as

src/specs.as

今回はただ値を返すだけだったので非常に簡単でした。Modやったことない人にもオススメです。


ペンの状態を返すブロックを追加してほしいという提案があったのでModして作ってみたものです。
src/primitives/MotionAndPenPrims.as

primTable["getPenHue"] = function():* { return interp.targetSprite().penHue };
primTable["getPenShade"] = function():* { return interp.targetSprite().penShade };
primTable["getPenSize"] = function():* { return interp.targetSprite().penWidth };
primTable["getPenState"] = function():* { return interp.targetSprite().penIsDown };

["pen color", "r", 4, "getPenHue"],
["pen shade", "r", 4, "getPenShade"],
["pen size", "r", 4, "getPenSize"],
["-"],
["is pen down?", "b", 4, "getPenState"],
- apple502j
-
Scratcher
1000+ posts
Scratch2.0をModする会
三項演算子をつくってみました。空,false,0では後の値が、でなければ前の値が返ります。
演算ブロックに if () then else が追加されます。
Specs.as 348:
Primitives.as 71:

演算ブロックに if () then else が追加されます。
Specs.as 348:
[ "if %n then %s else %s" , "r" , 8 , "ifThenString" , "" , "" ] ,
Primitives.as 71:
primTable [ "ifThenString" ] = function ( b :* ) :* { return "" + ( interp . arg ( b , 0 ) ? interp . arg ( b , 1 ) : interp . arg ( b , 2 ))};

- MMGISS
-
Scratcher
1000+ posts
Scratch2.0をModする会
Specs.as 348:そのコードは
[ "if %n then %s else %s" , "r" , 8 , "ifThenString" , "" , "" ] ,
[ "if %n then %s else %s" , "r" , 8 , "if:then:else:" , 1 , "A" , "B" ] ,
また、他のブロックの慣例に従うと、関数名はif:then:else:とやった方がいいかもしれませんね
Last edited by MMGISS (July 30, 2017 03:33:33)
- inoking
-
Scratcher
1000+ posts
Scratch2.0をModする会
三項演算子をつくってみました。空,false,0では後の値が、でなければ前の値が返ります。いいですね
演算ブロックに if () then else が追加されます。

これがあれば
(<[a] > [b]> * (10)) 歩動かすのような隠し?テクニックも不要となります。
scratch2.0の提案 に入れたいですね。
なお、最初の引数は真偽値のほうがよいと思います。
- apple502j
-
Scratcher
1000+ posts
Scratch2.0をModする会
ターボモード・ブロック
BlockMenus.as 104:
BlockMenus.as 113:
BlockMenus.as 513:
Interpreter.as 463:
Specs.as 254:
Specs.as 271:
Scratch.as 1251:
新しい引数のメニューを定義したり、関数を他ファイルから呼び出すために関数を作成したりといろいろ行っていますが、なんとか成功しています。

BlockMenus.as 104:
if ( menuName == 'onOff' ) menuHandler . onOffMenu ( evt );
handler . onOffMenu ( evt );
private function onOffMenu ( evt : MouseEvent ) : void { var m : Menu = new Menu ( setBlockArg , 'onOff' ); m . addItem ( 'off' ); m . addItem ( 'on' ); showMenu ( m ); }
primTable [ "isTurboMode" ] = function ( b :* ) :* { return turboMode }; primTable [ "setTurboMode" ] = function ( b :* ) :* { turboMode = ( 'on' == arg ( b , 0 )); app . refreshScreen ();};
[ "turbo mode?" , "b" , 6 , "isTurboMode" ] , [ "set turbo mode to %m.onOff" , " " , 6 , "setTurboMode" , "on" ] ,
[ "turbo mode?" , "b" , 106 , "isTurboMode" ] , [ "set turbo mode to %m.onOff" , " " , 106 , "setTurboMode" , "on" ] ,
public function refreshScreen () : void { stagePart . refresh ();}
新しい引数のメニューを定義したり、関数を他ファイルから呼び出すために関数を作成したりといろいろ行っていますが、なんとか成功しています。

Last edited by apple502j (July 30, 2017 04:23:15)
