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


HSPTV!掲示板


未解決 解決 停止 削除要請

2014
0122
横坂 雄浬hmm.dllのサンプルゲームの音楽ファイルはどのように埋め込まれているのか?3解決


横坂 雄浬

リンク

2014/1/22(Wed) 00:55:46|NO.59456

つい最近も質問しましたが、疑問が出たので・・・
非常に長いソースなのですが、どこを省略しても大丈夫なのかわからないので全部載せます。
申し訳ございません。
下記のソースで、音楽ファイルを読み込む記述があるのですが、同じフォルダに読み込むための音楽ファイル、
#packなどの記述も無いのにきちんと音が鳴ってゲームができます。
そこで質問です。音楽ファイル(game.mid、shot.wavなど)はどのように入れているのですか?
#include "hmm.as"
#define SCR_X 640 #define SCR_Y 320 #define _DEBUG 1 #define POS_X 0 #define POS_Y 1 #define VEC_X 2 #define VEC_Y 3 #define PIC_SX 4 #define PIC_SY 5 #define PIC_SIZE_X 6 #define PIC_SIZE_Y 7 #define ANI_CNT 8 #define ANI_NOW_CNT 9 #define ANI_PTN 10 #define ANI_NOW_PTN 11 #define SP_TYPE 12 #define MAX_HP 13 #define NOW_HP 14 #define HIT_AREA_SX 15 #define HIT_AREA_SY 16 #define HIT_AREA_SIZE_X 17 #define HIT_AREA_SIZE_Y 18 #define SP_SHIP 1 #define SP_BULLET 2 #define SP_ENEMY_RED 3 #define SP_ENEMY_GREEN 4 #define SP_ENEMY_BULE 5 #define SP_ENEMY_BULLET 6 #define BULLET_MAX 128 #define ENEMY_MAX 32 #define SCR_BIT 0 ;0 = FULL , 1 = PAL #define AWAIT_FPS 30 #define STREAM_ID 1024 #define BOMB_MAX 4 #define LVUP_KILL 10 ;□□ 初期化 □□ *INIT title "samplestg" gsel 0, -1 screen 0, SCR_X, SCR_Y, SCR_BIT hmminit 7 ;プラグインの初期化 digetjoynum ;ジョイスティックは何本繋がっているの? if stat <= 0 : dialog "not use joystick !!" joynum = stat ;BGMを鳴らす exist "game.mid" if strsize > 0 { sdim buf, strsize bload "game.mid", buf, strsize dmloadmemory buf, strsize ;ここでは、EXEファイルに埋め込むため dmplay 65535 } else { dialog "not play midi !!" } ;SEの読み込み fname = "shot.wav" exist fname if strsize > 0 { sdim buf, strsize bload fname, buf, strsize dsloadmemory buf, 0 } else { dialog "not play wave !!" } fname = "bang.wav" exist fname if strsize > 0 { sdim buf, strsize bload fname, buf, strsize dsloadmemory buf, 1 } else { dialog "not play wave !!" } fname = "hit.wav" exist fname if strsize > 0 { sdim buf, strsize bload fname, buf, strsize dsloadmemory buf, 2 } else { dialog "not play wave !!" } fname = "lvup.wav" exist fname if strsize > 0 { sdim buf, strsize bload fname, buf, strsize dsloadmemory buf, 3 } else { dialog "not play wave !!" } buffer 2, , 54, SCR_BIT picload "ship2.bmp", 1 buffer 3, SCR_X, SCR_Y, SCR_BIT picload "bullet.bmp" buffer 4, SCR_X, SCR_Y, SCR_BIT picload "enemy.bmp" buffer 5, SCR_X, SCR_Y, SCR_BIT repeat 32 b += 4 color b, 128-b, 128 boxf 0, SCR_Y/32*cnt, SCR_X, SCR_Y/32*( cnt+1 ) loop buffer 6, SCR_X, SCR_Y, SCR_BIT color 1, 1, 1 boxf 0, 0, SCR_X, SCR_Y buffer 7 picload "bomb.bmp" buffer 8 picload "hitefc.bmp" buffer 9 picload "fire.bmp" ;ハイスコア exist "highscore.dat" if strsize == -1 { highscore = 0 ;point } else { bload "highscore.dat", highscore, 4 } gosub *GAMEINIT ;□□ メインループ □□ *MAIN await 1000/AWAIT_FPS ginfo 1 if prmx != 0 : goto *MAIN hmmgetfps fps debugstr = fps if replayflg == 0 { gosub *MOVEENEMY gosub *ANIMATION gosub *KEYJOYCHECK gosub *MOVEBULLET gosub *CREATEENEMY gosub *ENEMYACTION redraw 0 gosub *DRAW redraw 1 gosub *HITCHECK if replayflg = 1 : gosub *REPGAMEINIT } else { gosub *MOVEENEMY gosub *ANIMATION gosub *REPKEYJOYCHECK gosub *MOVEBULLET gosub *REPCREATEENEMY gosub *ENEMYACTION redraw 0 gosub *DRAW redraw 1 gosub *REPHITCHECK if replayflg == 0 : gosub *GAMEINIT } if _DEBUG { str debugstr title "FPS "+debugstr } goto *MAIN ;□□ キーボードとジョイスティックの判定 □□ *KEYJOYCHECK ;キーボードの入力チェック digetkeystate key, 0 ;ゲーム用キーの入力チェック ;ジョイスティックの入力チェック digetjoystate joy, 0 ;リプレイ用 memcpy repkey, key, 4, keyoffset, 0 keyoffset += 4 memcpy repjoy, joy, 4, joyoffset, 0 joyoffset += 4 ;自機の移動 ;上チェック hmmbitcheck key, KEY_UP_BIT hr1 = stat hmmbitcheck joy, JOY_UP_BIT hr2 = stat if hr1 || hr2 { if ship.pos_y-ship.vec_y <= 0xFF { ship.pos_y = 0xFF } else { ship.pos_y -= ship.vec_y } } ;下チェック hmmbitcheck key, KEY_DOWN_BIT hr1 = stat hmmbitcheck joy, JOY_DOWN_BIT hr2 = stat if hr1 || hr2 { y = ( SCR_Y-ship.pic_size_y )<<8 if ship.pos_y+ship.vec_y >= y { ship.pos_y = y } else { ship.pos_y += ship.vec_y } } ;左チェック hmmbitcheck key, KEY_LEFT_BIT hr1 = stat hmmbitcheck joy, JOY_LEFT_BIT hr2 = stat if hr1 || hr2 { if ship.pos_x-ship.vec_x <= 0xFF { ship.pos_x = 0xFF } else { ship.pos_x -= ship.vec_x } } ;右チェック hmmbitcheck key, KEY_RIGHT_BIT hr1 = stat hmmbitcheck joy, JOY_RIGHT_BIT hr2 = stat if hr1 || hr2 { x = ( SCR_X-ship.pic_size_x )<<8 if ship.pos_x+ship.vec_x >= x { ship.pos_x = x } else { ship.pos_x += ship.vec_x } } ;弾 hmmbitcheck key, KEY_Z_BIT hr1 = stat hmmbitcheck joy, JOY_BTN1_BIT hr2 = stat if hr1 || hr2 { if keywait == 0 { type = SP_BULLET gosub *CREATEBULLET if res == 1 : dsplay 0 } keywait++ keywait = keywait\5 } else { keywait = 0 } ;ボム hmmbitcheck key, KEY_X_BIT hr1 = stat if hr1 == 0 : keepkey = 0 hmmbitcheck joy, JOY_BTN2_BIT hr2 = stat if hr2 == 0 : keepjoy = 0 if ( ( hr1 == 1 ) || ( hr2 == 1 ) ) && ( bomb_num > 0 ) && ( keepkey == 0 ) && ( keepjoy == 0 ) { bomb_flg = 1 keepkey = 1 } ;リプレイモード digetmomentkeystate key, 0 hmmbitcheck key, KEY_SPACE_BIT if stat { replayflg = 1 } hmmbitcheck key, KEY_ESC_BIT ;ESCが押されているかチェック if stat : end ;押されていたら終了 return ;□□ 描画 □□ *DRAW gsel 0 gmode 1 ;BG pos 0, 0 gcopy 5, 0, 0, SCR_X, SCR_Y ;得点とLVの表示 pos 540, 240 s = lv mes "LV "+s s = point str s mes s+"点" gmode 2 ;bomb repeat bomb_num pos bomb.0.pic_size_x*cnt+10, SCR_Y-bomb.0.pic_size_y-10 gcopy 3, bomb.0.pic_sx, bomb.0.pic_sy, bomb.0.pic_size_x, bomb.0.pic_size_y loop ;自機の表示 x = ship.pos_x>>8 y = ship.pos_y>>8 pos x, y gcopy 2, ship.pic_size_x*ship.ani_now_ptn+ship.pic_sx, 0, ship.pic_size_x, ship.pic_size_y ;enemy repeat ENEMY_MAX if enemy.cnt.sp_type == 0 : continue x = enemy.cnt.pos_x>>8 y = enemy.cnt.pos_y>>8 pos x, y gcopy 4, enemy.cnt.pic_size_x*enemy.cnt.ani_now_ptn+enemy.cnt.pic_sx, enemy.cnt.pic_sy, enemy.cnt.pic_size_x, enemy.cnt.pic_size_y loop ;ヒットエフェクト color 0, 0, 0 repeat BULLET_MAX if hiteffect.cnt.sp_type = 0 : continue x = ( hiteffect.cnt.pos_x>>8 )-10 y = ( hiteffect.cnt.pos_y>>8 )-16 pos x, y gmode 4, , , hiteffect.cnt.ani_now_cnt if hiteffect.cnt.sp_type == 1 { gcopy 8, 0, 0, 48, 48 } else { gcopy 9, 0, 0, 48, 48 } if hiteffect.cnt.ani_now_cnt-8 <= 0 { hiteffect.cnt.sp_type = 0 } else { hiteffect.cnt.ani_now_cnt -= 8 } loop gmode 2 color 255, 255, 255 ;弾の表示 repeat BULLET_MAX if bullet.cnt.sp_type == 0 : continue x = bullet.cnt.pos_x>>8 y = bullet.cnt.pos_y>>8 pos x, y gcopy 3, bullet.cnt.pic_size_x*bullet.cnt.ani_now_ptn+bullet.cnt.pic_sx, bullet.cnt.pic_sy, bullet.cnt.pic_size_x, bullet.cnt.pic_size_y loop ;ボムエフェクト if bomb_flg { gsel 6 color 255, 255, 255 boxf 0, 0, SCR_X, SCR_Y gsel 0 pos 0, 20 gcopy 7, 0, 0, 256, 256 redraw 1 wait 120 pos 0, 0 dsplay 0 repeat 64 gmode 3, , , cnt redraw 0 gcopy 6, 0, 0, SCR_X, SCR_Y redraw 1 loop gsel 6 color 1, 1, 1 boxf 0, 0, SCR_X, SCR_Y bomb_flg = 0 bomb_num-- dim enemy, ENEMY_MAX, 20 dim bullet, BULLET_MAX, 20 dim hiteffect, BULLET_MAX, 20 repeat BULLET_MAX hiteffect.cnt.pic_sx = 0 hiteffect.cnt.pic_sy = 0 hiteffect.cnt.pic_size_x = 48 hiteffect.cnt.pic_size_y = 48 loop } return *ANIMATION ship.ani_now_cnt++ if ship.ani_now_cnt == ship.ani_cnt { ship.ani_now_ptn = ship.ani_now_ptn+1\ship.ani_ptn ship.ani_now_cnt = 0 } repeat ENEMY_MAX if enemy.cnt.sp_type == 0 : continue enemy.cnt.ani_now_cnt++ if enemy.cnt.ani_now_cnt == enemy.cnt.ani_cnt { enemy.cnt.ani_now_ptn = enemy.cnt.ani_now_ptn+1\enemy.cnt.ani_ptn enemy.cnt.ani_now_cnt = 0 } loop repeat BULLET_MAX if bullet.cnt.sp_type == 0 : continue bullet.cnt.ani_now_cnt++ if bullet.cnt.ani_now_cnt == bullet.cnt.ani_cnt { bullet.cnt.ani_now_ptn = bullet.cnt.ani_now_ptn+1\bullet.cnt.ani_ptn bullet.cnt.ani_now_cnt = 0 } loop return ;□□ 弾の生成 □□ *CREATEBULLET if type == SP_BULLET { ;自機の弾 repeat BULLET_MAX if bullet.cnt.sp_type == 0 { id = cnt break } if cnt == BULLET_MAX-1 : id = BULLET_MAX loop if id == BULLET_MAX : return bullet.id.pos_x = ship.pos_x+( ship.pic_size_x<<8/2 ) bullet.id.pos_y = ship.pos_y+( ship.pic_size_y<<8/2 ) bullet.id.vec_x = 0x480 bullet.id.vec_y = 0x0000 bullet.id.pic_sx = 0 bullet.id.pic_sy = 0 bullet.id.pic_size_x = 16 bullet.id.pic_size_y = 16 bullet.id.ani_cnt = 5 bullet.id.ani_now_cnt = 0 bullet.id.ani_ptn = 4 bullet.id.ani_now_ptn = 0 bullet.id.sp_type = SP_BULLET bullet.id.hit_area_sx = 4 bullet.id.hit_area_sy = 4 bullet.id.hit_area_size_x = 12 bullet.id.hit_area_size_y = 8 res = 1 } else { ;敵の弾 } return ;□□ 弾の移動 □□ *MOVEBULLET repeat BULLET_MAX if bullet.cnt.sp_type == 0 : continue x = SCR_X<<8 y = SCR_Y<<8 if bullet.cnt.sp_type == SP_BULLET { if ( bullet.cnt.pos_x+bullet.cnt.vec_x ) <= x { bullet.cnt.pos_x += bullet.cnt.vec_x } else { bullet.cnt.sp_type = 0 continue } if ( bullet.cnt.pos_y+bullet.cnt.vec_y ) <= y { bullet.cnt.pos_y += bullet.cnt.vec_y } else { bullet.cnt.sp_type = 0 continue } } if bullet.cnt.sp_type == SP_ENEMY_BULLET { if ( ( bullet.cnt.pos_x+bullet.cnt.vec_x ) >= 0xFF ) && ( bullet.cnt.pos_x <= x ) { bullet.cnt.pos_x += bullet.cnt.vec_x } else { bullet.cnt.sp_type = 0 continue } if ( ( bullet.cnt.pos_y+bullet.cnt.vec_y ) <= y ) && ( bullet.cnt.pos_y >= 0xFF ){ bullet.cnt.pos_y += bullet.cnt.vec_y } else { bullet.cnt.sp_type = 0 continue } } loop return ;□□ 敵の生成 □□ *CREATEENEMY if creatwait < 0x20 { creatwait++ return } else { creatwait = 0 } repeat ENEMY_MAX if enemy.cnt.sp_type == 0 { rnd a, 256 enemy.cnt.sp_type = a\( 5-2 )+3 ;リプレイ memcpy repenemy, enemy.cnt.sp_type, 4, enemyoffset, 0 enemyoffset += 4 if enemy.cnt.sp_type == SP_ENEMY_RED { enemy.cnt.pic_sx = 0 enemy.cnt.pic_sy = 0 enemy.cnt.pic_size_x = 32 enemy.cnt.pic_size_y = 32 enemy.cnt.pos_x = SCR_X<<8 rnd enemy.cnt.pos_y, ( SCR_Y-enemy.cnt.pic_size_y ) if enemy.cnt.pos_y < 10 : enemy.cnt.pos_y += 10 enemy.cnt.pos_y = enemy.cnt.pos_y<<8 memcpy repenemy, enemy.cnt.pos_y, 4, enemyoffset, 0 enemyoffset += 4 enemy.cnt.vec_x = 0x200 enemy.cnt.vec_y = 0x000 enemy.cnt.ani_cnt = 5 enemy.cnt.ani_now_cnt = 0 enemy.cnt.ani_ptn = 5 enemy.cnt.ani_now_ptn = 0 enemy.cnt.max_hp = 1+lv enemy.cnt.now_hp = enemy.cnt.max_hp enemy.cnt.hit_area_sx = 4 enemy.cnt.hit_area_sy = 8 enemy.cnt.hit_area_size_x = 20 enemy.cnt.hit_area_size_y = 20 break } if enemy.cnt.sp_type == SP_ENEMY_GREEN { enemy.cnt.pic_sx = 0 enemy.cnt.pic_sy = 64 enemy.cnt.pic_size_x = 32 enemy.cnt.pic_size_y = 32 enemy.cnt.pos_x = SCR_X<<8 rnd enemy.cnt.pos_y, ( SCR_Y-enemy.cnt.pic_size_y ) if enemy.cnt.pos_y < 10 : enemy.cnt.pos_y += 10 enemy.cnt.pos_y = enemy.cnt.pos_y<<8 memcpy repenemy, enemy.cnt.pos_y, 4, enemyoffset, 0 enemyoffset += 4 enemy.cnt.vec_x = 0x100 enemy.cnt.vec_y = 0x000 enemy.cnt.ani_cnt = 10 enemy.cnt.ani_now_cnt = 0 enemy.cnt.ani_ptn = 5 enemy.cnt.ani_now_ptn = 0 enemy.cnt.max_hp = 2+lv enemy.cnt.now_hp = enemy.cnt.max_hp enemy.cnt.hit_area_sx = 4 enemy.cnt.hit_area_sy = 8 enemy.cnt.hit_area_size_x = 20 enemy.cnt.hit_area_size_y = 20 break } if enemy.cnt.sp_type == SP_ENEMY_BULE { enemy.cnt.pic_sx = 0 enemy.cnt.pic_sy = 128 enemy.cnt.pic_size_x = 32 enemy.cnt.pic_size_y = 32 enemy.cnt.pos_x = SCR_X<<8 rnd enemy.cnt.pos_y, ( SCR_Y-enemy.cnt.pic_size_y ) if enemy.cnt.pos_y < 10 : enemy.cnt.pos_y += 10 enemy.cnt.pos_y = enemy.cnt.pos_y<<8 memcpy repenemy, enemy.cnt.pos_y, 4, enemyoffset, 0 enemyoffset += 4 enemy.cnt.vec_x = 0x180 enemy.cnt.vec_y = 0x200 rnd a, 2 if a : enemy.cnt.vec_y = enemy.cnt.vec_y*-1 memcpy repenemy, enemy.cnt.vec_y, 4, enemyoffset, 0 enemyoffset += 4 enemy.cnt.ani_cnt = 5 enemy.cnt.ani_now_cnt = 0 enemy.cnt.ani_ptn = 5 enemy.cnt.ani_now_ptn = 0 enemy.cnt.max_hp = lv enemy.cnt.now_hp = enemy.cnt.max_hp enemy.cnt.hit_area_sx = 4 enemy.cnt.hit_area_sy = 8 enemy.cnt.hit_area_size_x = 20 enemy.cnt.hit_area_size_y = 20 break } } loop return ;□□ 敵の移動 □□ *MOVEENEMY repeat ENEMY_MAX if enemy.cnt.sp_type == 0 : continue x = SCR_X<<8 y = SCR_Y<<8 if enemy.cnt.sp_type == SP_ENEMY_RED || enemy.cnt.sp_type == SP_ENEMY_GREEN { if enemy.cnt.pos_x-enemy.cnt.vec_x >= 0xFF { enemy.cnt.pos_x -= enemy.cnt.vec_x } else { enemy.cnt.sp_type = 0 continue } } else { if enemy.cnt.pos_x-enemy.cnt.vec_x >= 0xFF { enemy.cnt.pos_x -= enemy.cnt.vec_x } else { enemy.cnt.sp_type = 0 continue } if enemy.cnt.pos_y+enemy.cnt.vec_y <= 0x00 { enemy.cnt.vec_y = enemy.cnt.vec_y*-1 } if enemy.cnt.pos_y+enemy.cnt.vec_y >= ( SCR_Y-enemy.cnt.pic_size_y<<8 ) { enemy.cnt.vec_y = enemy.cnt.vec_y*-1 } enemy.cnt.pos_y += enemy.cnt.vec_y } loop return ;□□ 当たり判定 □□ *HITCHECK ;弾と敵のあたり判定 repeat BULLET_MAX if bullet.cnt.sp_type == 0 : continue if bullet.cnt.sp_type == SP_ENEMY_BULLET : continue id = cnt sx = bullet.cnt.pos_x+( bullet.cnt.hit_area_sx<<8 ) ex = sx+( bullet.cnt.hit_area_size_x<<8 ) sy = bullet.cnt.pos_y+( bullet.cnt.hit_area_sy<<8 ) ey = sy+( bullet.cnt.hit_area_size_y<<8 ) repeat ENEMY_MAX if enemy.cnt.sp_type == 0 : continue sx2 = enemy.cnt.pos_x+( enemy.cnt.hit_area_sx<<8 ) ex2 = sx2+( enemy.cnt.hit_area_size_x<<8 ) sy2 = enemy.cnt.pos_y+( enemy.cnt.hit_area_sy<<8 ) ey2 = sy2+( enemy.cnt.hit_area_size_y<<8 ) if ( ( sx <= sx2 ) && ( ex >= sx2 ) ) || ( ( sx <= ex2 ) && ( ex >= ex2 ) ) { if ( ( sy <= sy2 ) && ( ey >= sy2 ) ) || ( ( sy <= ey2 ) && ( ey >= ey2 ) ) { id2 = cnt repeat BULLET_MAX if hiteffect.cnt.sp_type != 0 : continue hiteffect.cnt.sp_type = 1 hiteffect.cnt.pos_x = enemy.id2.pos_x hiteffect.cnt.pos_y = bullet.id.pos_y hiteffect.cnt.ani_now_cnt = 128 id2 = cnt break loop if enemy.cnt.now_hp-1 == 0 { enemy.cnt.sp_type = 0 if killenemy+1 == LVUP_KILL { int lv lv++ dsplay 3 if bomb_num < BOMB_MAX { bomb_num++ } } hiteffect.id2.sp_type = 2 killenemy = ( killenemy+1 )\LVUP_KILL dsplay 1 int point oldtype = enemy.cnt.sp_type point += 10 } else { enemy.cnt.now_hp-- dsplay 2 } bullet.id.sp_type = 0 } } else { if ( ( sx2 <= sx ) && ( ex2 >= sx ) ) || ( ( sx2 <= ex ) && ( ex2 >= ex ) ) { if ( ( sy2 <= sy ) && ( ey2 >= sy ) ) || ( ( sy2 <= ey ) && ( ey2 >= ey ) ) { id2 = cnt repeat BULLET_MAX if hiteffect.cnt.sp_type != 0 : continue hiteffect.cnt.sp_type = 1 hiteffect.cnt.pos_x = enemy.id2.pos_x hiteffect.cnt.pos_y = bullet.id.pos_y hiteffect.cnt.ani_now_cnt = 128 id2 = cnt break loop if enemy.cnt.now_hp-1 == 0 { enemy.cnt.sp_type = 0 if killenemy+1 == LVUP_KILL { int lv lv++ dsplay 3 if bomb_num < BOMB_MAX { bomb_num++ } } hiteffect.id2.sp_type = 2 killenemy = ( killenemy+1 )\LVUP_KILL dsplay 1 int point oldtype = enemy.cnt.sp_type point += 10 } else { enemy.cnt.now_hp-- dsplay 2 } bullet.id.sp_type = 0 } } } loop loop res = 0 ;自機と敵の弾とのあたり判定 sx = ship.pos_x+( ship.hit_area_sx<<8 ) ex = sx+( ship.hit_area_size_x<<8 ) sy = ship.pos_y+( ship.hit_area_sy<<8 ) ey = sy+( ship.hit_area_size_y<<8 ) repeat BULLET_MAX if ( bullet.cnt.sp_type == 0 ) || ( bullet.cnt.sp_type == SP_BULLET ) : continue sx2 = bullet.cnt.pos_x+( bullet.cnt.hit_area_sx<<8 ) ex2 = sx2+( bullet.cnt.hit_area_size_x<<8 ) sy2 = bullet.cnt.pos_y+( bullet.cnt.hit_area_sy<<8 ) ey2 = sy2+( bullet.cnt.hit_area_size_y<<8 ) if ex2 <= 0x1300 : continue if ( ( sx <= sx2 ) && ( ex >= sx2 ) ) || ( ( sx <= ex2 ) && ( ex >= ex2 ) ) { if ( ( sy <= sy2 ) && ( ey >= sy2 ) ) || ( ( sy <= ey2 ) && ( ey >= ey2 ) ) { wait 300 gosub *GAMEOVER res = 1 break } } else { if ( ( sx2 <= sx ) && ( ex2 >= sx ) ) || ( ( sx2 <= ex ) && ( ex2 >= ex ) ) { if ( ( sy2 <= sy ) && ( ey2 >= sy ) ) || ( ( sy2 <= ey ) && ( ey2 >= ey ) ) { wait 300 gosub *GAMEOVER res = 1 break } } } loop ;自機と敵の当たり判定 repeat ENEMY_MAX if enemy.cnt.sp_type == 0 : continue sx2 = enemy.cnt.pos_x+( enemy.cnt.hit_area_sx<<8 ) ex2 = sx2+( enemy.cnt.hit_area_size_x<<8 ) sy2 = enemy.cnt.pos_y+( enemy.cnt.hit_area_sy<<8 ) ey2 = sy2+( enemy.cnt.hit_area_size_y<<8 ) if ( ( sx <= sx2 ) && ( ex >= sx2 ) ) || ( ( sx <= ex2 ) && ( ex >= ex2 ) ) { if ( ( sy <= sy2 ) && ( ey >= sy2 ) ) || ( ( sy <= ey2 )&& ( ey >= ey2 ) ) { wait 300 gosub *GAMEOVER res = 1 break } } else { if ( ( sx2 <= sx ) && ( ex2 >= sx ) ) || ( ( sx2 <= ex ) && ( ex2 >= ex ) ) { if ( ( sy2 <= sy ) && ( ey2 >= sy ) ) || ( ( sy2 <= ey ) && ( ey2 >= ey ) ) { wait 300 gosub *GAMEOVER res = 1 break } } } loop if res == 1 : res = 0 : gosub *GAMEINIT return ;□□ 敵の思考 □□ *ENEMYACTION creatbulletwait++ if creatbulletwait\0x20 : return repeat ENEMY_MAX ;敵は3パターンいるので if enemy.cnt.sp_type == SP_ENEMY_RED { id = cnt repeat BULLET_MAX if bullet.cnt.sp_type == 0 { bullet.cnt.pos_x = enemy.id.pos_x bullet.cnt.pos_y = enemy.id.pos_y+( enemy.id.pic_size_y<<8/2 ) bullet.cnt.vec_x = 0x300*-1 if ( ship.pos_x-enemy.id.pos_x ) >= 0 { bullet.cnt.vec_x = bullet.cnt.vec_x*-1 } bullet.cnt.vec_y = 0x0000 bullet.cnt.pic_sx = 64 bullet.cnt.pic_sy = 0 bullet.cnt.pic_size_x = 16 bullet.cnt.pic_size_y = 16 bullet.cnt.ani_cnt = 5 bullet.cnt.ani_now_cnt = 0 bullet.cnt.ani_ptn = 4 bullet.cnt.ani_now_ptn = 0 bullet.cnt.hit_area_sx = 4 bullet.cnt.hit_area_sy = 4 bullet.cnt.hit_area_size_x = 8 bullet.cnt.hit_area_size_y = 8 bullet.cnt.sp_type = SP_ENEMY_BULLET break } loop } if enemy.cnt.sp_type == SP_ENEMY_GREEN { id = cnt a = 0 repeat BULLET_MAX if bullet.cnt.sp_type == 0 { bullet.cnt.pos_x = enemy.id.pos_x bullet.cnt.pos_y = enemy.id.pos_y+( enemy.id.pic_size_y<<8/2 ) bullet.cnt.pic_sx = 64 bullet.cnt.pic_sy = 0 bullet.cnt.pic_size_x = 16 bullet.cnt.pic_size_y = 16 bullet.cnt.ani_cnt = 5 bullet.cnt.ani_now_cnt = 0 bullet.cnt.ani_ptn = 4 bullet.cnt.ani_now_ptn = 0 bullet.cnt.hit_area_sx = 4 bullet.cnt.hit_area_sy = 4 bullet.cnt.hit_area_size_x = 8 bullet.cnt.hit_area_size_y = 8 bullet.cnt.sp_type = SP_ENEMY_BULLET if a == 0 { if ( ship.pos_x-enemy.id.pos_x ) < 0 { bullet.cnt.vec_y = 0x200 bullet.cnt.vec_x = 0x200*-1 } else { bullet.cnt.vec_y = 0x200 bullet.cnt.vec_x = 0x200 } a++ continue } if a == 1 { if ( ship.pos_x-enemy.id.pos_x ) < 0 { bullet.cnt.vec_x = 0x200*-1 bullet.cnt.vec_y = 0x200*-1 } else { bullet.cnt.vec_x = 0x200 bullet.cnt.vec_y = 0x200*-1 } ;もっと難しいほうがいい場合はコメントを外してください。 ;a++ ;continue break } ;激ムズ if a == 2 { if ( ship.pos_x-enemy.id.pos_x ) < 0 { bullet.cnt.vec_x = 0x200*-1 bullet.cnt.vec_y = 0x00 } else { bullet.cnt.vec_x = 0x200 bullet.cnt.vec_y = 0x00 } a = 0 break } } loop } if enemy.cnt.sp_type == SP_ENEMY_BULE { id = cnt repeat BULLET_MAX if bullet.cnt.sp_type == 0 { bullet.cnt.pos_x = enemy.id.pos_x bullet.cnt.pos_y = enemy.id.pos_y+( enemy.id.pic_size_y<<8/2 ) if ( ship.pos_x-enemy.id.pos_x ) < 0 { bullet.cnt.vec_x = 0x300*-1 } else { bullet.cnt.vec_x = 0x300 } if ( ship.pos_y-enemy.id.pos_y ) < 0 { bullet.cnt.vec_y = 0x180*-1 } else { bullet.cnt.vec_y = 0x180 } bullet.cnt.pic_sx = 64 bullet.cnt.pic_sy = 0 bullet.cnt.pic_size_x = 16 bullet.cnt.pic_size_y = 16 bullet.cnt.ani_cnt = 5 bullet.cnt.ani_now_cnt = 0 bullet.cnt.ani_ptn = 4 bullet.cnt.ani_now_ptn = 0 bullet.cnt.hit_area_sx = 4 bullet.cnt.hit_area_sy = 4 bullet.cnt.hit_area_size_x = 8 bullet.cnt.hit_area_size_y = 8 bullet.cnt.sp_type = SP_ENEMY_BULLET break } loop } loop return *GAMEOVER gsel 0 pos 0, 0 repeat 64 gmode 3, , , cnt redraw 0 gcopy 6, 0, 0, SCR_X, SCR_Y redraw 1 loop wait 120 color 255, 0, 0 text 0x20 ;ハイスコア表示 int point if point > highscore { highscore = point ;ハイスコアの更新 s = point mes "HIGHSCOR "+s+"点" bsave "replay.dat", repkey, 1024*1024 bsave "replay.dat", repjoy, 1024*1024, 1024*1024 bsave "replay.dat", repenemy, 1024*1024, 1024*1024*2 bsave "highscore.dat", highscore, 4 } else { s = highscore mes "HIGHSCORE "+s+"点" } ;現在のスコア表示 s = lv str s mes "LV "+s s = point str s mes s+"点" mes "GAME OVER" wait 240 return *GAMEINIT ;ゲームの初期化 dim ship, 20 ;pos_x ;pos_y ;vec_x ;vec_y ;pic_pos_sx ;pic_pos_sy ;pic_size_x ;pic_size_y ;ani_cnt ;ani_now_cnt ;ani_ptn ship.pos_x = 0x00 ship.pos_y = 0x00 ship.vec_x = 0x380 ship.vec_y = 0x380 ship.pic_sx = 0 ship.pic_sy = 0 ship.pic_size_x = 32 ship.pic_size_y = 54 ship.ani_cnt = 30 ship.ani_now_cnt = 0 ship.ani_ptn = 2 ship.ani_now_ptn = 0 ship.sp_type = SP_SHIP ship.max_hp = 3 ship.now_hp = ship.max_hp ship.hit_area_sx = 14 ship.hit_area_sy = 29 ship.hit_area_size_x = 4 ship.hit_area_size_y = 4 ;bomb bomb_num = 0 dim bomb, BOMB_MAX, 20 bomb.0.pic_sx = 128 bomb.0.pic_sy = 16 bomb.0.pic_size_x = 48 bomb.0.pic_size_y = 48 ;bullet dim bullet, BULLET_MAX, 20 ;enemy dim enemy, ENEMY_MAX, 20 ;hiteffect dim hiteffect, BULLET_MAX, 20 repeat BULLET_MAX hiteffect.cnt.pic_sx = 0 hiteffect.cnt.pic_sy = 0 hiteffect.cnt.pic_size_x = 48 hiteffect.cnt.pic_size_y = 48 loop killenemy = 0 lv = 1 point = 0 randomize 100 gsel 0, 1 text 0 font "MS ゴシック", 32, 16 color 255, 255, 255 ;リプレイ用 oldrepkey = 0 oldrepjoy = 0 sdim repkey, 1024*1024 sdim repjoy, 1024*1024 sdim repenemy, 1024*1024 repkeycnt = 0 repjoycnt = 0 keyoffset = 0 joyoffset = 0 enemyoffset = 0 creatwait = 0 creatbulletwait = 0 keywait = 0 return #include "samplestg2.as"



この記事に返信する


MillkeyStars

リンク

2014/1/22(Wed) 08:38:52|NO.59457

#pack #epack などのプリプロセッサ命令は、コンパイラなどの独自設定などと考えてください。
スクリプト実体とはまったく別ものと考えてもいいです。

上記 #pack は、実行ファイル自動生成(CTRL + F9) にてパックファイル(PACKFILE)の登録をするに、コンパイラへ作業指示をしてるに過ぎません。
また、質問者が提示したスクリプトは、通常でのPACKFILEの生成(エディタ[ツール]→[PACKFILE編集])を行い、実行ファイルに音楽ファイルを埋め込んでいます。

[普通の実行ファイルの作り方]
1,まず、スクリプトを書く。
2,F5 などで、コンパイル。(ここをしなくてもいいかわからないけど、HSP2.6時代の慣れ)
3,start.ax を作る。
4,PACKFILE で、start.ax / game.mid などを埋め込む。
5,実行ファイルを作る。

[実行ファイル自動生成にての実行ファイルの作り方]
1,#pack などのプリプロセッサをスクリプト先頭に記載。
2,CTRL + F9 押せば、はい出来上がり。

実行ファイル自動生成は便利なんだけど、#pack などの記載忘れがあると実行ファイルを作った時にエラーになりやすい。
同じ実行ファイルを連続で作るなら、埋め込むファイルなどがいつでも同じになる通常方式の方がいいと思う。
(共通のファイルなど readme.txt・onitama.ini など。)

どちらの場合も、最終的には同じ実行ファイルを作るってのは、かわりません。

[質問者提示スクリプトの話]
スクリプト上に、game.mid、shot.wav のファイルを必要としている命令が複数ありますが、これに関して、HSPのファイルロード規約にしたがって処理されます。
bload "game.mid" などの記載の場合、まず hsp は パックファイルの場所に game.mid があるか調べます。
もしパックファイルにある場合は、そこからファイル情報を読み込みます。
また、なかった場合は、カレントディレクトリ上のファイルを検索し、同一ファイル名があった場合、そこから読み込みします。
それでもなかった場合、hsp は hsp エラーを発生させ、プログラムを終了します。

って、説明はこんな感じですかね。



MillkeyStars

リンク

2014/1/22(Wed) 08:55:13|NO.59458

連投で申し訳ないけど、質問者の質問見ててふと気になったことがひとつ。

>>下記のソースで、音楽ファイルを読み込む記述があるのですが、同じフォルダに読み込むための音楽ファイル、
#packなどの記述も無いのにきちんと音が鳴ってゲームができます。

これって、スクリプトを実行したわけではなく、付いてた実行ファイルを起動したって事でいいんだよね?
(スクリプトを実行して正常に起動したのなら、神ですから・・・)



横坂 雄浬

リンク

2014/1/22(Wed) 10:35:34|NO.59460

付いていた実行ファイルを起動したということです!説明不足で申し訳ないです。。。
分かりやすく答えてくれて、ありがとうございます!解決致しました!



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