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


HSPTV!掲示板


未解決 解決 停止 削除要請

2006
0421
内おろち画像に動きを・・・14解決


内おろち

リンク

2006/4/21(Fri) 22:49:24|NO.448

下記のスクリプトは一部なんですが、
歩くモーションの画像を、
はさみたい時どうすればいいですか。


buffer 4 picload "ningen.bmp" ;人の画像 gsel 0 ;--------------------変数の初期化------------------ hito_x=20 : hito_y=120 ;--------------------メインループ------------------ *main_loop await 10 gosub *hito ;人移動 goto *main_loop ;--------------------人移動------------------ *hito pos hito_x,hito_y ;位置 getkey usiro,37 : getkey ue,38 : getkey mae,39 : getkey sita,40 ;キー if usiro=1 { color 0,128,128 : gmode 4,,,255 : gcopy 4,224,0,32,32 ;後 hito_x-2 } if ue=1 { color 0,128,128 : gmode 4,,,255 : gcopy 4,128,0,32,32 ;上 hito_y-2 } if mae=1 { color 0,128,128 : gmode 4,,,255 : gcopy 4,320,0,32,32 ;前 hito_x+2 } if sita=1 { color 0,128,128 : gmode 4,,,255 : gcopy 4,0,0,32,32 ;下 hito_y+2 } return



この記事に返信する


だいすけ

リンク

2006/4/21(Fri) 23:10:22|NO.449

う〜ん、難しいですが、私も昔にHSPでの歩行プログラムを考えました。
その時はですが、RPGツクール用の素材を使わせて貰いまして、
右向きならどこをコピーするなどして作りました。

説明が難しいですが、考え方として、画像を用意して、それをコピーする方が、
良いかと思います。

適切な解答が出来なくて、申し訳ないです。



なたで

リンク

2006/4/22(Sat) 00:40:48|NO.450

歩行グラフィック用の画像を2枚使うとき。
こんな感じでいいと思います。

buffer 4,400,32 repeat 100 color rnd(128),rnd(128),rnd(128) pos cnt*10,0:mes "*@*\n@*@" ;人の画像 loop gsel 0 ;--------------------変数の初期化------------------ hito_x=20 : hito_y=120 ;--------------------メインループ------------------ *main_loop ch+:ch\=10 await 10 gosub *hito ;人移動 goto *main_loop ;--------------------人移動------------------ *hito pos hito_x,hito_y ;位置 getkey usiro,37 : getkey ue,38 : getkey mae,39 : getkey sita,40 ;キー if usiro=1 { color 0,128,128 : gmode 4,,,255 if (ch<5){ gcopy 4,224,0,32,32 ;左1 }else{ gcopy 4,206,0,32,32 } ;左2 hito_x-2 } if ue=1 { color 0,128,128 : gmode 4,,,255 if (ch<5){ gcopy 4,128,0,32,32 ;上1 }else{ gcopy 4,130,0,32,32 } ;上2 hito_y-2 } if mae=1 { color 0,128,128 : gmode 4,,,255 : if (ch<5){ gcopy 4,320,0,32,32 ;前1 }else{ gcopy 4,322,0,32,32 } ;前2 hito_x+2 } if sita=1 { color 0,128,128 : gmode 4,,,255 : if (ch<5){ gcopy 4,0,0,32,32 ;下1 }else{ gcopy 4,15,0,32,32 } ;下2 hito_y+2 } return



osakana

リンク

2006/4/22(Sat) 16:22:10|NO.454

モーションだけのプログラムは作れますか?
一度アニメーションだけのスクリプトを書いてみると
分かりやすいと思います。



内おろち

リンク

2006/4/23(Sun) 22:46:11|NO.474

>2006/4/22(Sat) 00:40:48|NO.450
>
>歩行グラフィック用の画像を2枚使うとき。
>こんな感じでいいと思います。

回答ありがとう。そのスクリプトを参考にします!

画像を2枚以上使うときはどこを変更・追加すればいいんですかね・・・・
ヒントだけでもお願いします



osakana

リンク

2006/4/24(Mon) 03:04:30|NO.476


buffer 4,32*3,32*4 color 0,128,128 :boxf color 225,255,255 repeat 3 font "",10*(cnt+1),1 pos cnt*32,0 :mes "<" ;人の画像 pos cnt*32,32 :mes "A" ;人の画像 pos cnt*32,64 :mes ">" ;人の画像 pos cnt*32,96 :mes "V" ;人の画像 loop gsel 0 ;--------------------変数の初期化------------------ hito_x=ginfo_winx/2-32/2 : hito_y=ginfo_winy/2-32/2 ;--------------------メインループ------------------ *main_loop color 0,0,0 :boxf gosub *hito ;人移動 ch=(ch+1)\30 await 10 goto *main_loop ;--------------------人移動------------------ *hito pos hito_x,hito_y ;位置 getkey usiro,37 : getkey ue,38 : getkey mae,39 : getkey sita,40 ;キー if usiro=1 :copy_y=0 :hito_x-2 if ue=1 :copy_y=32 :hito_y-2 if mae=1 :copy_y=64 :hito_x+2 if sita=1 :copy_y=96 :hito_y+2 color 0,128,128 : gmode 4,,,255 gcopy 4,32*(ch/10),copy_y,32,32 return
なたでさんのとは やり方が違いますが参考までに。
配列という選択肢も。



なたで

リンク

2006/4/25(Tue) 00:48:18|NO.482

>画像を2枚以上使うときはどこを変更・追加すればいいんですかね・・・・
>ヒントだけでもお願いします

ch+:ch\=10

この行でchという変数が1,2,3,4,....0,1,2.. とループするようになっています。 これを
if ue=1 {
	color 0,128,128 : gmode 4,,,255
	if (ch<5){	gcopy 4,128,0,32,32		;上1
		}else{	gcopy 4,130,0,32,32	}	;上2
	hito_y-2
}
この真ん中のchの変数が0〜4だったら
上1の画像を使う。
それ以外だったら上2の画像を使う
というようなプログラムでした。

だからもし2枚以上挟みたいときは
	if (ch<5){	gcopy 4,128,0,32,32		;上1
}else{ gcopy 4,130,0,32,32 } ;上2
ここのパターンを多くすればいいのです

もっと分かりやすいように変えてみました。

buffer 4,400,32 repeat 100 color rnd(128),rnd(128),rnd(128) pos cnt*10,0:mes "*@*\n@*@" ;人の画像 loop gsel 0 ;--------------------変数の初期化------------------ hito_x=20 : hito_y=120 hito_time=10 ;--------------------メインループ------------------ *main_loop time+:if time>hito_time{ch+:ch\=3:time=0} //ch変数はtimeが10で、0,1,2と繰り返す await 10 gosub *hito ;人移動 goto *main_loop ;--------------------人移動------------------ *hito pos hito_x,hito_y ;位置 getkey usiro,37 : getkey ue,38 : getkey mae,39 : getkey sita,40 ;キー if usiro=1 { color 0,128,128 : gmode 4,,,255 if ch=0: gcopy 4,224,0,32,32 ;後1 if ch=1: gcopy 4,206,0,32,32 ;後2 if ch=2: gcopy 4,186,0,32,32 ;後3 hito_x-2 } if ue=1 { color 0,128,128 : gmode 4,,,255 if ch=0: gcopy 4,128,0,32,32 ;上1 if ch=1: gcopy 4,130,0,32,32 ;上2 if ch=2: gcopy 4,132,0,32,32 ;上2 hito_y-2 } if mae=1 { color 0,128,128 : gmode 4,,,255 : if ch=0: gcopy 4,320,0,32,32 ;前1 if ch=1: gcopy 4,322,0,32,32 ;前2 if ch=2: gcopy 4,312,0,32,32 ;前3 hito_x+2 } if sita=1 { color 0,128,128 : gmode 4,,,255 : if ch=0: gcopy 4,0,0,32,32 ;下1 if ch=1: gcopy 4,15,0,32,32 ;下2 if ch=2: gcopy 4,30,0,32,32 ;下3 hito_y+2 } return



内おろち

リンク

2006/4/25(Tue) 16:35:33|NO.487

osakanaさん、なたでさん!
見やすいスクリプトでとても参考になりました。
ありがとうございました



白鳳堂

リンク

2006/4/25(Tue) 21:05:05|NO.488

ちょ、ちょっとすいません
なたでさんのプログラムを試したのですが
なぜか画像を引きずってる感じになるんです
どうして?
対策とかあるん?



osakana

リンク

2006/4/26(Wed) 02:23:54|NO.491

メインループをこれに置き換えてみてください。
って、私が答えていいのかなぁ。


;--------------------メインループ------------------ *main_loop redraw 0 color 255,255,255 :boxf time+:if time>hito_time{ch+:ch\=3:time=0} //ch変数はtimeが10で、0,1,2と繰り返す await 10 gosub *hito ;人移動 redraw 1 goto *main_loop



白鳳堂

リンク

2006/4/26(Wed) 13:06:47|NO.495

osakanaさん、ありがとう〜
画像を引きずってる感じは解消されました〜

でもキーを押したときしか表示されない〜〜〜
どうなってるんだ〜
私が初心者すぎるのが原因か〜



フレッド

リンク

2006/4/27(Thu) 00:19:26|NO.504

ルーチンの移動の順番変えてみるっていうのはどお?



osakana

リンク

2006/4/27(Thu) 05:06:12|NO.505

>でもキーを押したときしか表示されない〜〜〜

それは表示されるように出来ていないからです。
ですからこれは、プログラムのとおり正確に動いています。

キーを押さない時にも表示するにはどうするかと言うと・・・
それよりもなぜ表示されないかというと、
サンプルでは gcopy の部分で絵を表示しています。
そして gcopy は if の中にあります。
if ではキーボードの矢印キーを見張っています。
つまりキーを押したときだけ gcopy が実行されます。
これが表示されない理由です。(よけい分かりにくくしたかな・・・)

何も押さないで絵を表示させるには、キーが押されていない時に
gcopy を実行するようにすれば表示されるはずです。
矢印キーが押されていない時というのは、
変数の usiro , ue , mae , sita それぞれが 0 の時です。
if命令で4つの変数が0がどうかを調べて、0なら絵を表示します。

if (usiro=0)&(ue=0)&(mae=0)&(sita=0) { color 0,128,128 : gmode 4,,,255 gcopy 4,0,0,32,32 ;後1 }
このスクリプトをラベル *hito のどこか(returnの1つ上の行が確実)に
追加してみてください。これで表示されたと思います。
(usiro=0)&(ue=0)&(mae=0)&(sita=0)の部分は(usiro||ue||mae||sita)!1 でもOKです。
分かりやすいかそうでないかの違いだけで結果は同じだと思います(たぶん

・・・・じつはもっと簡単な方法があります。
それは if usiro=1 の1つ上の行に、

color 0,128,128 : gmode 4,,,255 gcopy 4,224,0,32,32 ;後1
を追加するだけです。
これはキーを押す押さないに関係なく常に絵を表示します。
方向キーを押した時に同じ場所に絵を上書きするので、モーションも表示されています。

よく分からない命令がある時やどの命令を使えばいいか分からない時は、
HSPキーワード検索で調べてみてください。



K

リンク

2006/4/27(Thu) 06:49:57|NO.506

分からない時は一個一個分解して見てみる

getkey usiro,37 : getkey ue,38 : getkey mae,39 : getkey sita,40 ;キー if usiro=1 { color 0,128,128 : gmode 4,,,255 if ch=0: gcopy 4,224,0,32,32 ;後1 if ch=1: gcopy 4,206,0,32,32 ;後2 if ch=2: gcopy 4,186,0,32,32 ;後3 hito_x-2 }


実際に描画している部分

if usiro=1 { color 0,128,128 : gmode 4,,,255 if ch=0: gcopy 4,224,0,32,32
usiroが1ならカラー(透明色)を赤0緑128青128にしてコピーモードを半透明に(255にしてるから実際には普通のコピー)
chが0ならスクリーンバッファID4の座標224,0から32,32を現在のポジションにコピー

ここに来るにはusiroが1になる必要がある

getkey usiro,37 : getkey ue,38 : getkey mae,39 : getkey sita,40 ;キー
ここで、キーコード37番が押されたらusiroが1になる
でも、押されなければ0、その結果

color 255,255,255 :boxf

毎回実行しているboxf命令によって画面が白く塗られてキャラが消えている

では、どうするか、
方法は色々あるけど、あまりスクリプトに手を加えないでやるとしたら
A・キーが押された時だけキャラ描画前にcolor 255,255,255 :boxfを実行
B・キーが押されていない時のキャラを作って描画

Aは毎回書き換えしたくないとき(ゲームではあまり使わないかな・・・)
通常(アニメーションとか多量にキャラを出したり)はBだろう

って、事でBのやり方で、考えてみる
この時に必要なのは、移動キーが押されたかどうか

getkey usiro,37 : getkey ue,38 : getkey mae,39 : getkey sita,40 ;キー
ここで使われている変数が0ならキーは押されていない

その調べ方は色々ある
一個一個順番に見たり全部一回で調べたり、この変数を見ないで他の変数を作って
移動に使ったルーチン内にフラグを追加して移動したら1とか
(この場合移動ルーチンに入る前に初期化が必要になる)
とりあえずは、使われている変数を使ってやってみる

順番に見る


if usiro=0 { if ue=0 { if mae=0 { if sita=0 { ;ここに描画処理 }}}}

全部一回で調べるのも方法は一つじゃない0かどうかを調べるだけだから

if (usiro+ue+mae+sita)=0 { ;これでも上のと結果は同じ }



もう一つ(描画処理も追加 getkey後に追加して)


if (usiro|ue|mae|sita)=0 { color 0,128,128 : gmode 4,,,255 : if ch=0: gcopy 4,12,0,31,32 ;止1 if ch=1: gcopy 4,12,1,31,32 ;止2 if ch=2: gcopy 4,12,0,31,32 ;止3 }

| は or 意味は論理演算で調べてくれ

2DのRPGとかに良くある右向いて止まったら右を向いたままとかは
この方法だけじゃ無理、そうしたければ、最後の移動方向を覚えて
それによって分岐を作る必要がある

ここまでのが理解できたら出来るんじゃないかな・・・

#書いてる間に他の人が・・・まぁ、いいかw



白鳳堂

リンク

2006/4/27(Thu) 13:28:37|NO.510

うまく表示されました〜〜
いい雰囲気になってきましたね〜
osakanaさん、とても分かりやすい説明ありです〜
Kさん、詳しく分解して教えてくれてありです〜〜



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