|
|
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
|
|
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枚以上使うときはどこを変更・追加すればいいんですかね・・・・
ヒントだけでもお願いします
|
|
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
ちょ、ちょっとすいません
なたでさんのプログラムを試したのですが
なぜか画像を引きずってる感じになるんです
どうして?
対策とかあるん?
|
|
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
ルーチンの移動の順番変えてみるっていうのはどお?
|
|
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キーワード検索で調べてみてください。
|
|
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さん、詳しく分解して教えてくれてありです〜〜
|
|