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


HSPTV!掲示板


未解決 解決 停止 削除要請

2021
1224
donadonaパラメーター式が無効な理由が知りたい14解決


donadona

リンク

2021/12/24(Fri) 22:30:58|NO.94752

c=cnt ;自機弾と敵機の当たり判定
repeat bmx
if by(cnt)<0 :break
if dist(ex(c),bx(cnt),ey(c),by(cnt))<48 { sc+=10
:mmplay 1
gcn(c)=8 :gx(c)=ex(c) :gy(c)=ey(c) :ey(c)=512
:by(cnt)=-16 }
loop
と書きました。
if dist(ex(c),bx(cnt),ey(c),by(cnt))<48 { sc+=10
この式のパラメーターが無効だとエラーが出ました。HSP初心者で右も左もわからない状態です。

なにがダメで、どう改善したらよいのか教えていただけると幸いです。



この記事に返信する


沢渡

リンク

2021/12/25(Sat) 10:58:22|NO.94757

そのコードを実行してみてもエラーは出ませんでしたが?
cntが冒頭から唐突に出てくるあたり、
それより前の部分をはしょってるのでしょうか?
そのはしょった部分を見ないことには何とも言えませんが、
内容から推察するに、distというのはユーザー定義関数か関数型マクロだと
思いますので、もしそうならば#defcfuncなり#defineなりの記述に
問題がありそうな気がします。
もしくは、中で指定されている配列が途中で文字列型に変わっているという可能性も。



donadona

リンク

2021/12/25(Sat) 19:12:57|NO.94761

沢渡さん、動作確認やアドバイスありがとうございます!
そうです、問題の文前後だけで解決するという考えが甘かったです。
#defcfuncなど確認してみました。やはりエラーは出続けます。
長文になりますが私の力では無理なので助けてください!おねがいします。

#include "hsp3dish.as" #packopt name "buster" #packopt xsize 320 ;横サイズ #packopt ysize 480 ;縦サイズ ;画像の準備 celload "IMG_20201021_204354.jpg",1 celdiv 1,320,480,0,0 celload "IMG_20201021_204354.jpg",2 celdiv 2,64,64,32,32 mmload "bussdora.wav",0 mmload "pichu-n.mp3",1 hi=0 *start if hi<sc :hi=sc ;タイトル表示 redraw 0 color 0,0,0 :boxf gosub *score msg " ",112,216,255 redraw 1 gosub *pause ;変数の設定 bmx=3 :emx=99 ;自機弾数、敵最大数 px=160 :py=320 :pdx=0 :pdy=0 ; dim bx,bmx :dim by,bmx dim bdx,bmx :dim bdy,bmx dim ex,emx :dim ey,emx dim edx,emx :dim edy,emx dim gcn,emx :dim gx,emx :dim gy,emx ; repeat emx :ey(cnt)=512 :loop ;メインルーチン *main redraw 0 pos 0,0 :celput 1,0 ;背景表示 gosub *score if gmov>0 {gmov- if gmov=0 :goto *start zm=(30.0-gmov)/10+1.0 :title ""+zm pos px,py :celput 2,3,zm,zm,(1.4+gmov)/10 goto *skip } stick mo,256 if mo=256 { mx=mousex :my=mousey if dist(mx,px,my,py)<48 :pdx=mx-px :pdy=my-py :else :gosub *myshot px+=pdx :py+=pdy :pdx=pdx*3/4 :pdy=pdy*3/4 pos px,py :celput 2,0 ;自機表示 *skip repeat bmx if by(cnt)>0 { by(cnt)-=bdy(cnt) :bx(cnt)-=bdx(cnt) pos bx(cnt),by(cnt) :celput 2,1 ;自機弾表示 loop ;スコアアップに応じて敵機数アップ emc=sc/50+1 :if emc>emx :emc=emx r=rnd(emc);敵機を新規配置 if ey(r)>511 { ex(r)=rnd(320) :ey(r)=-32 edx(r)=rnd(16)-8 :edy(r)=8+rnd(8) } repeat emc if ey(cnt)<512 { ey(cnt)+=edy(cnt) :ex(cnt)+=edx(cnt) pos ex(cnt),ey(cnt) :celput 2,2;敵機表示 } ;自機と敵機の当たり判定 if gmov=0 and dist(ex(cnt),px,ey(cnt),py)<48 :gmov=30 :mmplay 1 c=cnt ;自機弾と敵機の当たり判定 repeat bmx if by(cnt)<0 :break if dist(ex(c),bx(cnt),ey(c),by(cnt))<48 { sc+=10 :mmplay 1 gcn(c)=8 :gx(c)=ex(c) :gy(c)=ey(c) :ey(c)=512 :by(cnt)=-16 } loop if gcn(cnt)>0 :gcn(cnt)- :pos gx(cnt),gy(cnt) :celput 2,3;敵爆発表示 loop redraw 1 wait 6 goto *main ;自機弾発射 *myshot repeat bmx if by(cnt)<1 { bx(cnt)=px :by(cnt)=py bdx(cnt)=(px-mx)/8 :bdy(cnt)=32 abs(bdx(cnt)/8) mmplay 0 :break } loop return *pause stick mo :if mo=256 :return wait 5 :goto *pause *score msg "SCORE:"+sc,8,8 :msg "HISCORE:"+hi,160,8 return ;scの定義 #defcfunc sc int _score_ Score+=_score_ if(Score>HiScore):HiScore=Score return ;moの定義 ;gmovの定義 ;自機移動 pos jkx * mm , jky * mm gcopy 1, 0, 0 ;キー入力 gosub *key_input ;キー入力 ----- *key_input stick kk, 5 ;キー入力情報 if kk & 128 : end ;[Esc] if kk & 1 : jkx = jkx - 2 ;[←] if kk & 4 : jkx = jkx + 2 ;[→] jkx = limit(jkx, 0, winx - 4) ;左右の壁の制限 return ;2点間の距離を返す関数の定義 #defcfunc dist int x1,int x2,int y1,int y2 x=x1-x2 :y=y1-y2 :return sqrt(x*x+y*y) ;縁取り文字表示 #deffunc msg str moj,int x3,int y3,int bc color bc,bc,bc repeat 9 xx=cnt\3 :yy=cnt/3 pos x3-1+xx,y3-1+yy :mes moj loop color 255-bc,25-bc,255-bc pos x3,y3 :mes moj return



よしひと

リンク

2021/12/25(Sat) 19:33:09|NO.94762

パット見ですが、#defcfuncで関数と定義されているscに10を加算するっていう
処理に問題がありそうだと思いました。



donadona

リンク

2021/12/25(Sat) 19:48:16|NO.94763

よしひとさん、ご返信ありがとうございます。
sc+=10を削除してみたところこの文章のエラーが消えました!
ありがとうございます!

;scの定義
#defcfunc sc int _score_ Score+=_score_ if(Score>HiScore):HiScore=Score return

新たなエラーが...ラベル名が指定できないと言われました。
どう直せばいいんでしょうか!



沢渡

リンク

2021/12/25(Sat) 19:56:56|NO.94764

まず、「#defcfunc sc」(ユーザ定義関数)の部分はreturnに返り値がなく、
このままscを呼んだらエラーになってしまいます。

点数はScoreという変数で扱っているようなので、
・点数を参照する場面では変数Scoreを直接参照する。
・点数の加算処理は#defcfuncの「ユーザ定義関数」で行うのではなく、
 #deffuncの「ユーザ定義命令」で行う。
というのはどうでしょう。

それから、「Score」という文言が変数名とラベル名で被っているので、
*scoreというラベル名を変えるべきでしょう。



donadona

リンク

2021/12/25(Sat) 22:55:51|NO.94766

沢渡さん、度々ありがとうございますm(*_ _)m
returnした後に行き着くところが無いという解釈で合ってますかね?
大文字と小文字は同一文字として認識されるって事ですか?



沢渡

リンク

2021/12/26(Sun) 11:22:11|NO.94767

#defcfuncというのは関数を作る命令であり、関数には必ず返り値があります。
(HSPではそういう仕様)
下の方の「#defcfunc dist」の部分では「return sqrt(x*x+y*y)」として
sqrt(x*x+y*y)を返り値としていますが、
もしscを#defcfuncで登録するのなら、
こちらでも同じように返り値を設定しなければなりません。

返り値を必要としないのなら、新しい関数を作る「#defcfunc」ではなく、
新しい命令を作る「#deffunc」を使ってはどうですか、ということです。
(#deffuncでも返り値を設定することはできますが、しなくても構いません。
 詳しくはマニュアルやヘルプを参照してください)

たとえば今回の例で言えば、

#defcfunc sc int _score_


#deffunc sc int _score_
に変えて、「sc+=10」を「sc 10」とすれば、
これで点数が10点加算され、ついでにハイスコア更新チェックも行える、
という処理ができます。
(それ以外の「if hi<sc :hi=sc」等は、scをScoreに変えるなどの変更を行う)

>大文字と小文字は同一文字として認識されるって事ですか?
その通りです。HSPでは大文字と小文字は区別されません。



リンク

2021/12/26(Sun) 12:25:35|NO.94768

わかりません



donadona

リンク

2021/12/26(Sun) 23:56:05|NO.94781

沢渡さん!ありがとうございます!
#deffuncにしたらエラー消えました!
新しく書いたもの貼ります。
;scの定義
#deffunc sc int _score_ a+=_score_ if(a>Hi):Hi=a return
毎度のごとく現れるエラーですが
mes "SCORE:"+sc,8,8 :mes "HISCORE:"+hi,160,8

この文法が間違っているらしくて... もうわかりません!再度助けていただけないでしょうか? ずさんも返信ありがとうございます。難しいです(泣)



沢渡

リンク

2021/12/27(Mon) 00:13:39|NO.94782

「sc」は#deffuncで「scという名前の命令」になったのだから、
変数として使おうとすれば当然エラーになります。
そのエラーが出るところのscもScoreに置き換えてください。

一度マニュアルやヘルプで#deffuncや#defcfuncの使い方について
おさらいすることをお勧めします。



donadona

リンク

2021/12/27(Mon) 02:27:26|NO.94784

もう一度命令の意味から見直します。
scoreに変更したところ見事エラーが消えました!感謝です。
まだまだ聞きたいことあるんですけど、ご教授願えますか?



沢渡

リンク

2021/12/27(Mon) 17:03:03|NO.94790

聞きたいこととは、どのような内容でしょう?



donadona

リンク

2021/12/29(Wed) 21:50:54|NO.94824

すいません、風邪で寝込んでてしばらく出来そうにないので
また新しくスレッド立てて質問します。沢渡さん、また来年お願いしますm(_ _)m



donadona

リンク

2021/12/31(Fri) 20:09:03|NO.94839

みなさん、良いお年を!
また来年もよろしくお願いしますm(_ _)m



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