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


HSPTV!掲示板


未解決 解決 停止 削除要請

2023
1010
オオゾラ (投稿者削除)8未解決


オオゾラ

リンク

2023/10/10(Tue) 10:46:25|NO.100179

この記事は投稿者により削除されました。
2023/12/28(Thu) 18:52:00



この記事に返信する


沢渡

リンク

2023/10/10(Tue) 11:49:30|NO.100180

そのコードだけではどこが問題なのかわかりませんが、一つ気になった点。
「false」や「true」とは何ぞやというのを、コードの冒頭で

#const global false 0 #const globat true 1
のような形で定義しているでしょうか?(constではなくdefineでも可)
HSPではfalseやtrueという文言に特別な意味はないので、
使うのならばこのようにして自前で定義する必要があります。
(私の早合点であれば申し訳ありません)



沢渡

リンク

2023/10/10(Tue) 18:59:18|NO.100186

すみません、NO.100180の二行目にある「globat」というのは「global」の間違いです。
お手数ですが読み替えていただければと思います。



さか

リンク

2023/10/11(Wed) 21:54:44|NO.100194

沢渡さん同様にこれだけ見てもですが。。
ゴール条件と思える「cell = "G" 」の前行のcellへの代入文がコメント(//)になっている
からでは?



オオゾラ

リンク

2023/10/28(Sat) 19:21:12|NO.100365

返信が遅れてすみません。
言われたことを試してみたのですがエラーが出てしまってうまくできませんでした。



オオゾラ

リンク

2023/10/28(Sat) 19:33:45|NO.100366

プログラムの全体をです。
マップは抜いてます。
 
#pack "yama2.jpg" #pack "parts.png" #pack "tamadot.png" #pack "se_block2" #pack "se_break3" #pack "se_foot" #pack "se_jump2" #pack "se_puyo" sx=40:sy=40 ; セルの大きさ mx=16:my=12 ; マップを並べる大きさ wx=640:wy=480 ; 画面のサイズ hitparts=3 mysizex=64:mysizey=64 myspd=4 grav=14 celload "yama2.jpg",1 gsel 1 bgmaxx=ginfo_sx:bgmaxy=ginfo_sy screen 0,wx,wy title "珠音のジャンプアップ♪" ; 素材の読み込み celload "parts.png",2 celdiv 2,sx,sy celload dir_tv+"tamadot.png",3 celdiv 3,mysizex,mysizey ; 音のデータを登録 mmload dir_tv+"se_block2",0 mmload dir_tv+"se_break3",1 mmload dir_tv+"se_foot",2 mmload dir_tv+"se_jump2",3 mmload dir_tv+"se_puyo",4 mmload dir_tv+"bgm12",5,1 mmload dir_tv+"bgm19",6,1 *gtitle ; タイトル画面 mmplay 5 *gtmain ; タイトル画面のループ redraw 0 pos 0,0:gmode 0,wx,wy:gcopy 1,0,400 color 255,255,255 font msgothic,40,1 pos 100,100 mes "珠音のジャンプアップ♪" font msgothic,26,1 pos 148,260 mes "Enterキーを押してスタート" redraw 1 await 16 stick key if key&32 : goto *ginit ; [Enter]が押されたか? goto *gtmain *ginit ; ゲームスタート時の初期化 stage=1 *start ; マップデータの読み込み sdim mapd,$10000 notesel mapd cr="\n" ; noteget s1,0 ; mapsizex=strlen(s1):if mapsizex<mx : mapsizex=mx mapsizey=notemax vmaxx=mapsizex*sx vmaxy=mapsizey*sy viewx=0:viewy=vmaxy-wy vbasey=viewy vbasex=vmaxx-wx ; マップの初期化 coinmax=0 dim map,mapsizex,mapsizey y=0 repeat mapsizey noteget s1,cnt repeat mapsizex s2=strmid(s1,cnt,1) ; 1文字だけを取り出す a=0 if s2!=" " : a=6 if s2="+" : a=5 ;敵 if s2="-" : a=9 ;地面 if s2="@" : a=10 ;白レンガ if s2="1" : a=1 ;雲左上 if s2="2" : a=2 ;雲右上 if s2="3" : a=7 ;雲左下 if s2="4" : a=8 ;雲右上 if s2="*" : coinmax=coinmax+1 : a=3 map(cnt,y)=a ; マップデータを代入する loop y=y+1 loop ; プレイヤーの初期化 coin=0 ; コインの数 myflag=0 myani=0:mydir=0 myjmp=0:mygrv=0 px=0:py=vmaxy-sy-mysizey font msgothic,16 mmstop mmplay 6 *main ; メインループ redraw 0 gosub *drawbg ; 奥の背景を描画 gosub *drawmap ; マップを描画 gosub *mymove ; プレイヤーの移動 color 255,255,255:pos 0,0 mes "COIN:"+coin+"/"+coinmax redraw 1 await 16 #const global false 0 #const global true 1 goal_enadlad = false;ゴールの条件チェック mapx = (x + 10) / sx mapy = (y + i) / sy if mapx >= 0 and mapx < mapsizex and mapy >= 0 and mapy < mapsizey :// cell = chr(map(mapx, mapy)) ; マップデータを文字列として取得 if cell = "G" and coin = coinmax : goal_enabled = true ; ゴールが有効になる条件を満たした goto *main *main2 ; プレイヤーやられ mmstop mmplay 1 repeat redraw 0 gosub *drawbg gosub *drawmap gosub *mymove font msgothic,40,1 pos 150,200 color 255,255,255 mes "回避失敗" redraw 1 await 16 stick key if key&32 : break ; [Enter]が押されたか? loop goto *gtitle *main3 ; クリア repeat 600 redraw 0 gosub *drawbg gosub *drawmap gosub *mymove font msgothic,40,1 pos 150,200 color 255,255,255 mes "目標達成" redraw 1 if cnt=16 : mmstop : mmplay 0 await 16 stick key if key&32 : break ; [Enter]が押されたか? loop goto *gtitle ; クリアしたらタイトルに戻る *mymove ; プレイヤー操作 stick key,15 x=px:y=py myrun=0 if myflag!=0 { mydir=32 myflag=myflag+1 key=0 } if key&1 : mydir=12 : myrun=1 : x=x-myspd if key&4 : mydir=28 : myrun=1 : x=x+myspd if x<0 : x=0 if x>=(vmaxx-mysizex) : x=px if myrun>0 { i=mysizey-1 : gosub *myarea if a>0 { gosub *chkitem x=px } } if myjmp>0 : goto *mymove3 ; 通常時 if key&16 : myjmp=1 : mygrv=-grav : mmplay 3 : goto *mymove3 i=mysizey : gosub *myarea if a=0 : myjmp=1 : mygrv=8 : goto *mymove3 goto *mymove2 *mymove3 ; ジャンプ中 y=y+mygrv mygrv=mygrv+1 if mygrv<0 : goto *mymove2 if mygrv>16 : mygrv=16 i=mysizey : gosub *myarea if a>0 { mmplay 2 gosub *chkitem y=(mapy*sy)-mysizey : myjmp=0 mydir=0 } if y>=vmaxy : gosub *mydead *mymove2 ; プレイヤー描画 px=x:py=y a=mydir if myrun>0 { myani=myani+1 a+=(myani/4)\4 } gmode 2,mysizex,mysizey x=px-viewx:y=py-viewy pos x,y:celput 3,a i=0 if x<240 : i=(x-240)/40 if x>(wx-320) : i=(x-(wx-320))/40 viewx=limit( viewx+i, 0, vbasex ) i=0 if y<160 : i=(y-160)/40 if y>(wy-240) : i=(y-(wy-240))/40 viewy=limit( viewy+i, 0, vbasey ) return *myarea ; 自分の足元マップを調べる mapx=(x+10)/sx mapy=(y+i)/sy if mapy>=mapsizey : a=0 : return if mapy<0 : a=0 : return a=map(mapx,mapy) if a>=hitparts : return ; 接触のあるパーツID mapx=(x+53)/sx a=map(mapx,mapy) if a>=hitparts : return ; 接触のあるパーツID a=0 return *chkitem ; 障害物・アイテムのチェック if a=3 { coin=coin+1 map(mapx,mapy)=0 mmplay 4 return } if a<6 { gosub *mydead } return *mydead ; やられフラグを立てる myflag=1 return *drawbg ; 背景描画 startx=-viewx\sx ; マップの表示開始X座標 starty=-viewy\sy ; マップの表示開始Y座標 ofsx=viewx/sx ; マップデータの参照開始X座標 ofsy=viewy/sy ; マップデータの参照開始Y座標 ; 奥の背景も少しスクロールさせる gmode 0,wx,wy x=0:y=viewy*(bgmaxy-wy)/vbasey pos 0,0:gcopy 1,x,y return *drawmap ; マップ描画 y=0 drawx=mx:if startx!=0 : drawx=drawx+1 drawy=my:if starty!=0 : drawy=drawy+1 gmode 2,sx,sy repeat drawy x=0 repeat drawx a=map(ofsx+x,ofsy+y) if a>0 : pos x*sx+startx,y*sy+starty:celput 2,a x=x+1 loop y=y+1 loop return
このプログラムではクリアと失敗したときの表示がされない状態になってしまいます。
改善すべきところはどこでしょうか?



沢渡

リンク

2023/10/29(Sun) 10:44:44|NO.100372

データファイルも画像ファイルもなくて実行できないので
気になったところだけいくつか。

goal_enadlad = false;ゴールの条件チェック
この"enadlad"というのは"enabled"の間違いでしょうか?

if cell = "G" and coin = coinmax : goal_enabled = true ; ゴールが有効になる条件を満たした
条件式に変数"cell"の内容が関わっていますが、さかさんの指摘通り、
cellに何かを代入するシーンが見当たりません。
その上の"cell = chr(map(mapx, mapy))"はコメントアウトされているから無効ですが、
「chr」という名前の配列なりユーザ定義関数なりは見当たりません。
(エラーが出るというのは、このコメントアウトを外すとエラーになるということでしょうか?
 それなら『chrという名前の配列やユーザ定義関数がない』というのがエラーの理由だと思います。
 上の方の内容から推察するに、chrというのは文字列配列で、
 配列"map"の数値に対応した文字を返す役割があるのではないかと思いますが)

*main2 *main3
ゲームオーバー時の文言が表示される部分は*main2、
クリア時の文言が表示される部分は*main3から始まっていますが、
この*main2なり*main3なりにジャンプするgoto文が見当たりません。
パッと見た感じ、ミスをするとmyflagが1になり、
以降はキー入力を無効にしてmyflagを1ずつ増やしながら
「やられ演出」をするという内容になっているようですが、
myflagが一定の値になったら*main2に飛ぶ、という形にした方が
良いでしょうか。
(クリア時にも同様のことを行う)



オオゾラ

リンク

2023/10/30(Mon) 20:47:26|NO.100383


*main ; メインループ redraw 0 gosub *drawbg ; 奥の背景を描画 gosub *drawmap ; マップを描画 gosub *mymove ; プレイヤーの移動 color 255,255,255:pos 0,0 mes "COIN:"+coin+"/"+coinmax redraw 1 await 16 #const global false 0 #const global true 1 goal_enablad = false;ゴールの条件チェック mapx = (x + 10) / sx mapy = (y + i) / sy if mapx >= 0 and mapx < mapsizex and mapy >= 0 and mapy < mapsizey : cell = chr(map(mapx, mapy)) ; マップデータを文字列として取得 if cell = "G" and coin = coinmax : goal_enabled = true ; ゴールが有効になる条件を満たした if goal_enabled : goto *main3 if myflag > 0 : goto *main2 if myflag > 2 : goto *main2 goto *main *main2 ; プレイヤーやられ mmstop mmplay 1 repeat redraw 0 gosub *drawbg gosub *drawmap gosub *mymove font msgothic,40,1 pos 150,200 color 255,255,255 mes "回避失敗" redraw 1 await 16 stick key if key&32 : break ; [Enter]が押されたか? loop goto *gtitle *main3 ; クリア repeat 600 redraw 0 gosub *drawbg gosub *drawmap gosub *mymove font msgothic,40,1 pos 150,200 color 255,255,255 mes "目標達成" redraw 1 if cnt=16 : mmstop : mmplay 0 await 16 stick key if key&32 : break ; [Enter]が押されたか? loop myflag = 0 goal_enabled = false goto *gtitle ; クリアしたらタイトルに戻る
こんな感じに直してみたのですがうまくできませんでした。



沢渡

リンク

2023/10/31(Tue) 13:08:08|NO.100388

「うまくできませんでした」とは、ゴール判定もミス判定も
両方上手くいかないということでしょうか?

ゴール判定については、文字列配列chrは、
ちゃんとゴールに対応する数値に対して"G"という文字を
返すようになっていますか?
(なぜ『if cell = "G"』で判定するためだけにわざわざ数値を文字に変換するのか、
 そこがよくわかりませんが……)
また、気になるのがその前の

mapx = (x + 10) / sx mapy = (y + i) / sy
この部分ですが、この時点で変数iには、スクロールに関連する、
判定とは関係ない値が入っていると思われます。
下の方を見る限り、

・左右への移動中はi=mysizey-1として判定を行う。 ・空中にいる間はi=mysizeyとしても判定を行う。 ・mapxについては、「(x+10)/sx」とした場合と「(x+53)/sx」とした場合の  二つのケースで判定を行う。
というようになっているようです。
当方では実行して試すことはできませんが、たとえば以下のようにすれば
どうなるでしょうか?
(以下、文字列配列chrは正しく"G"を返すことが前提)

goal_enablad = false;ゴールの条件チェック if coin>=coinmax { repeat 2 mapx = (x+10+43*cnt)/sx //「(x+10)/sx」と「(x+53)/sx」の2ケースの判定を行う。 if mapx>=0 & mapx<mapsizex { repeat 2 if cnt { if myjmp : mapy=(y+mysizey)/sy : else : break //この判定は空中にいる間だけ行う } else { mapy=(y+mysizey-1)/sy } if mapy>=0 & mapy<mapsizey { if chr(map(mapx, mapy))="G" : goal_enabled = true : break } loop if goal_enabled : break } loop } if goal_enabled : goto *main3

ミス判定に関しては申し訳ありません、
何度ソースコードを読んでも、改変元の「珠音のジャンプアップ♪」の
コードと見比べても、一体どこが悪いのかわかりませんでした。



記事削除

記事NO.パスワード
(質問が解決したスレッドは他の利用者に活用してもらうため、削除しないようお願いします)

NO.100179への返信

マスコット

好きなマスコットを選んでください。

名前

e-mail
HOME
  1. 初めて利用する方は、HSP3掲示板の使い方をお読みください。
  2. 不要部分の多い長いスクリプトの投稿は ご遠慮ください。
  3. 書き込みは自動改行されません。適度に改行を入れてください。
  4. スクリプトは小文字の<pre>〜</pre>で囲むと見やすく表示できます。

削除用パスワード

解決したら質問者本人がここをチェックしてください。

エラー発生時、再送信すると二重送信になることがあります。
回答が得られたら、お礼書き込み時に[解決]チェックしてください。
SPAM防止のためURLから始まる文章は投稿できません。
SPAM防止のため英文字のみの本文を投稿することはできません。

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