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


HSPTV!掲示板


未解決 解決 停止 削除要請

2016
0809
ぺーぺーabsでヘルプ6解決


ぺーぺー

リンク

2016/8/9(Tue) 02:04:18|NO.76562

if (abs(ifmuki - int(log2(key))) = 1)

という判定式を作成し、走らせると配列の要素が無効です。となってしまい動きません。
各変数の型
ifmuki…int
key…キーコード(int)

log2…"hspmath.as"より
配列の要素と言われるとこれまでは型が対応していなかったりだったのですが、今回はすべて整数型にしているはずなので原因が分かりません。
どうかお願いします。



この記事に返信する


MillkeyStars

リンク

2016/8/9(Tue) 04:37:38|NO.76563

>>log2…"hspmath.as"より
と書かれてますが、include してませんでしたとかはないよね・・・

include してあれば、正しく log2(?) は機能するはずですけどね。
してない場合は、log2(?) を配列として解釈しますので、配列の要素は無効です。のエラーになります。



掘木

リンク

2016/8/9(Tue) 07:54:04|NO.76564

気になるので補足

記載されている処理はどのような意図を持っているのでしょうか。
keyにはstickやビットシフトのORで生成された値が入ると推測でき、
一つ飛ばした2つのビットに関連性があることを示唆するコードのように見えます。が、
上位ビットの入力がその判定を妨げます。keyがビット並びによる判定優先順位をもち、同時押しの時は下位ビットを無視するのです。。
(さんぷるでよくある、stickでキーコードを取り、左右で移動しながらスペースで弾が打てますみたいなのでもう動かない)

用途、用法に見合った処理でしょうか?



ぺーぺー

リンク

2016/8/9(Tue) 12:34:40|NO.76567

>>MillkeyStars
includeはしています

>>掘木
キャラクターの方向転換用のものでキーは一つしか押さないことを前提にしています。(どれも非トリガーキーです)
左 上 右 下
1 2 4 8 ←キーコード
0 1 2 3 ←指数(2の何乗か)、キャラクターの向きも同様

となっていて上下、左右の移動なら現在の向きとキーコードで減算し絶対値にすると2となります。また、同じ方向に移動し続ける場合は0となり1のみが「曲がる」という行為を行うので別の判定式も組んでいます。



掘木

リンク

2016/8/10(Wed) 22:16:46|NO.76588

hspmath.asは中身を見るとわかるけどもglobal宣言されていないので、
モジュール内で使う場合はモジュール内でインクルードしないといけませんよ。とエスパーしてみる。

下向きの時に左入力、左向きの時に下入力時は曲がる扱いにしないってことでいいのかな?

与えられた向き、キーの数値情報から直感的な挙動をビット演算で実装するとこうなる。

#module #defcfunc GetTurnStr int key, int dir if ( key & ((%10001<<dir)>>0) & %1111 ) : return "直進" if ( key & ((%10001<<dir)>>1) & %1111 ) : return "左折" if ( key & ((%10001<<dir)>>2) & %1111 ) : return "逆走" if ( key & ((%10001<<dir)>>3) & %1111 ) : return "右折" return "不動" #global // 以降テスト用 #module #deffunc TEST_STREQ str testname,str expect,str factval,local resultstr if ( expect == factval ) : resultstr = " ○ " : else : resultstr = "[!]" mes strf("%s:%s 期待値[%s] 実効値[%s]",resultstr,testname,expect,factval) return #global #const KEY_NONE 0 #const KEY_LEFT 1 #const KEY_UP 2 #const KEY_RIGHT 4 #const KEY_DOWN 8 #const DIRECTION_LEFT 0 #const DIRECTION_UP 1 #const DIRECTION_RIGHT 2 #const DIRECTION_DOWN 3 TEST_STREQ "左向きでの無入力","不動",GetTurnStr(KEY_NONE ,DIRECTION_LEFT ) TEST_STREQ "上向きでの無入力","不動",GetTurnStr(KEY_NONE ,DIRECTION_UP ) TEST_STREQ "右向きでの無入力","不動",GetTurnStr(KEY_NONE ,DIRECTION_RIGHT) TEST_STREQ "下向きでの無入力","不動",GetTurnStr(KEY_NONE ,DIRECTION_DOWN ) TEST_STREQ "左向きでの左入力","直進",GetTurnStr(KEY_LEFT ,DIRECTION_LEFT ) TEST_STREQ "左向きでの上入力","右折",GetTurnStr(KEY_UP ,DIRECTION_LEFT ) TEST_STREQ "左向きでの右入力","逆走",GetTurnStr(KEY_RIGHT,DIRECTION_LEFT ) TEST_STREQ "左向きでの下入力","左折",GetTurnStr(KEY_DOWN ,DIRECTION_LEFT ) TEST_STREQ "上向きでの左入力","左折",GetTurnStr(KEY_LEFT ,DIRECTION_UP ) TEST_STREQ "上向きでの上入力","直進",GetTurnStr(KEY_UP ,DIRECTION_UP ) TEST_STREQ "上向きでの右入力","右折",GetTurnStr(KEY_RIGHT,DIRECTION_UP ) TEST_STREQ "上向きでの下入力","逆走",GetTurnStr(KEY_DOWN ,DIRECTION_UP ) TEST_STREQ "右向きでの左入力","逆走",GetTurnStr(KEY_LEFT ,DIRECTION_RIGHT) TEST_STREQ "右向きでの上入力","左折",GetTurnStr(KEY_UP ,DIRECTION_RIGHT) TEST_STREQ "右向きでの右入力","直進",GetTurnStr(KEY_RIGHT,DIRECTION_RIGHT) TEST_STREQ "右向きでの下入力","右折",GetTurnStr(KEY_DOWN ,DIRECTION_RIGHT) TEST_STREQ "下向きでの左入力","右折",GetTurnStr(KEY_LEFT ,DIRECTION_DOWN ) TEST_STREQ "下向きでの上入力","逆走",GetTurnStr(KEY_UP ,DIRECTION_DOWN ) TEST_STREQ "下向きでの右入力","左折",GetTurnStr(KEY_RIGHT,DIRECTION_DOWN ) TEST_STREQ "下向きでの下入力","直進",GetTurnStr(KEY_DOWN ,DIRECTION_DOWN )
適当に単体テストもしておきましょう。単体テスト間違えてて再投稿した人が言えるセリフじゃないけど。



ぺーぺー

リンク

2016/8/10(Wed) 23:52:29|NO.76593

>>堀木
そうだったんですね。知りませんでした。
少し急いでいたものでlogfで代用しなんとか解決しました。
いつもありがとうございます



KA

リンク

2016/8/10(Wed) 23:57:04|NO.76594

>>if (abs(ifmuki - int(log2(key))) = 1)
>>という判定式を作成し、走らせると配列の要素が無効です。となってしまい動きません。
>>「曲がる」という行為を行うので別の判定式も組んでいます。

典型的な、「他は悪くない」という思い込みでは?
エラーが出た時点の変数内容はデバッグウインドウで調べられます。
その値を使って

>>ifmuki=○
>>key=○
>>if (abs(ifmuki - int(log2(key))) = 1)

「これでエラーになるのは何故?」という風に、他人が検証できるスクリ
プトで質問しましょう。

多分、文法的なミスで関係ない部分でエラーが出ていると思われます。

間違っても「どこが悪いのか分からないから全部貼ります!」はやらな
いように。



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