HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2016
0227
sourcehageペイントの「元に戻す」処理について3解決


sourcehage

リンク

2016/2/27(Sat) 17:06:41|NO.74716

ここ最近HSPをいじり始めた者です。ペイントソフトを作っているのですが、
元に戻す処理を行う際にどうしても最初の一回だけ余分に押す必要が出てしまいます
最初のみ処理を2回分するなど色々試してみたのですがどうしても整合性が取れなくて…
初歩的な質問+稚拙なソースで申し訳ないのですが、今の自分の知識だと解けそうにないので
どうかご回答頂けないでしょうか。
便宜上一部bufferをscreenに差し替えています。


#define U_limit 4 //アンドゥ限界 #define U_Buffer 100 //メインバッファの初期位置 #define wix 130 //ウィンドウ #define wiy 100 #define ofsx 600//初期位置 #define ofsy 300 #define x 0 #define y 1 dim keyar,26 ;キー情報 width 1,1,1,1 ;仮メイン screen U_Buffer,wix,wiy,0,ofsx,ofsy;メイン //undo→ repeat U_limit screen U_Buffer+(cnt+1),wix,wiy,0,(ofsx)+(wix*(cnt+1)),ofsy loop//------ //←redo repeat U_limit screen U_Buffer-(cnt+1),wix,wiy,0,(ofsx)-(wix*(cnt+1)),ofsy loop//------ gsel U_Buffer mes"ここに描画":mes"Z:undo Y:redo" *main A1=0 //クリック判定初期化 repeat 26 getkey a,'A'+cnt if keyar.cnt=0&a : s="_" : poke s,0,'A'+cnt:if s="Z":gosub *undo //Zが押されたら if keyar.cnt=0&a : s="_" : poke s,0,'A'+cnt:if s="Y":gosub *redo //Yが押されたら keyar.cnt=a loop stick key,256 if (key & 256){ color red,green,blue line M1(x),M1(y),mousex,mousey//変更 A1=1 } M1=mousex,mousey //マウス位置代入 if (A2=1)and(A1=0){//離したらundoに移動 repeat U_limit gsel (U_Buffer )+(U_limit) - cnt:pos 0,0 //描写先 gcopy (U_Buffer-1 )+(U_limit) - cnt,0,0,200,400 //描写元をコピー gsel U_Buffer loop//---- } A2=A1:await 10 goto *main //--------------------------------- *Undo repeat U_limit*2 gsel (U_Buffer- U_limit )+cnt :pos 0,0 //描写先に gcopy (U_Buffer- U_limit )+cnt+1 ,0,0,200,400 //描写元をコピー gsel U_Buffer loop//---- return *redo repeat U_limit*2 gsel (U_Buffer )+(U_limit) - cnt:pos 0,0 //描写先に gcopy (U_Buffer-1 )+(U_limit) - cnt,0,0,200,400 //描写元をコピー gsel U_Buffer loop//---- return



この記事に返信する


スペース

リンク

2016/2/27(Sat) 19:18:00|NO.74717

自分で書いたプログラムの動きを完全に把握出来ていないのが原因だと思います。



ue_dai

リンク

2016/2/27(Sat) 22:07:46|NO.74721

undo はふつう、スタックと呼ばれる構造を使って実装します。

テキストエディタを例にあげますと、


↓初期状態 text: "" undo: "" T ↓入力後 text: "a" undo: "", "a" T ↓入力後 text: "ab" undo: "", "a", "ab" T

のように、undo スタック (配列だと思ってください) の一番後ろに、直前の状態を追加していきます。

T の位置をスタックトップと呼ぶことにします。
T の位置にあるデータは編集中のデータと同一です。
undo 操作をするには、undoスタックトップを一つ前方に移動します。例えば

↓undo後 text: "a" undo: "", "a" T, "ab"
のように T をずらして、そこあるデータを編集画面に復元します。

redoするにはTを後方にずらせばいいのです。

実装例:
https://gist.github.com/vain0/f4bc3fac37aa7978be89



sourcehage

リンク

2016/2/28(Sun) 00:07:51|NO.74722

>スペースさん
返信ありがとうございます。
そうですよね…ちょっと背伸びしすぎました
次からは基本構造をもうちょっと調べてから手を出そうと思います。

>ue_dai
分かりやすい解説ありがとうございます…!
自分のundoに対する根本的な認識が足りてませんでした。
ソースまで添付していただいて感無量です。凄く参考になりました
重ね重ね御礼申し上げます。



ONION software Copyright 1997-2021(c) All rights reserved.