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


HSPTV!掲示板


未解決 解決 停止 削除要請

2026
0217
中坊このバグだらけのプログラムを何とか動くところまでもっていって!!!21解決


中坊

リンク

2026/2/17(Tue) 00:20:36|NO.104721

AIに頼んで作りました。東方の弾幕を再現しようとしてます。2/18水曜の夜までに完成させたいです
#include "hspdef.as"

screen 0,640,480
title "RESONANCE"

randomize

#const MAX_BULLET 256
#const MAX_PSHOT 128
#const MAX_BOMB 16
#const INV_TIME 120

inp_up=0:inp_down=0:inp_left=0:inp_right=0
inp_ok=0:inp_cancel=0:inp_shot=0:inp_slow=0

#deffunc input_update
stick key,511
inp_up = (key&8)!=0
inp_down = (key&1)!=0
inp_left = (key&2)!=0
inp_right = (key&4)!=0
inp_ok = (key&16)!=0
inp_cancel= (key&32)!=0
inp_shot = (key&64)!=0
inp_slow = (key&256)!=0
return

player_x=320
player_y=400

player_speed=4
player_slow=2
player_hit_r=3

player_life=3
player_inv=0
player_dead=0
death_timer=0

#deffunc player_update
if player_dead=1:return

spd=player_speed
if inp_slow:spd=player_slow

if inp_up:player_y-=spd
if inp_down:player_y+=spd
if inp_left:player_x-=spd
if inp_right:player_x+=spd

if player_x<10:player_x=10
if player_x>630:player_x=630
if player_y<10:player_y=10
if player_y>470:player_y=470

if player_inv>0:player_inv--

return

#deffunc player_draw
if player_dead=1:return

if player_inv>0{
color 120,180,255
}else{
color 255,80,120
}

boxf player_x-4,player_y-2,player_x+4,player_y+6
boxf player_x-6,player_y-4,player_x-2,player_y+2
boxf player_x+2,player_y-4,player_x+6,player_y+2
boxf player_x-2,player_y+6,player_x+2,player_y+10

if inp_slow{
color 255,255,255
circle player_x-player_hit_r,player_y-player_hit_r,player_x+player_hit_r,player_y+player_hit_r,1
}

return

dim ps_x,MAX_PSHOT
dim ps_y,MAX_PSHOT
dim ps_v,MAX_PSHOT
dim ps_alive,MAX_PSHOT

shot_cool=0

#deffunc shot_update
if player_dead=1:return

if shot_cool>0:shot_cool--

if inp_shot & (shot_cool=0){
repeat MAX_PSHOT
if ps_alive(cnt)=0{
ps_alive(cnt)=1
ps_x(cnt)=player_x
ps_y(cnt)=player_y-10
ps_v(cnt)=8
shot_cool=4
break
}
loop
}

repeat MAX_PSHOT
if ps_alive(cnt)=1{
ps_y(cnt)-=ps_v(cnt)
if ps_y(cnt)<0:ps_alive(cnt)=0
}
loop

return

#deffunc shot_draw
color 100,255,255
repeat MAX_PSHOT
if ps_alive(cnt)=1{
boxf ps_x(cnt)-2,ps_y(cnt)-6,ps_x(cnt)+2,ps_y(cnt)+6
}
loop
return

enemy_x=320
enemy_y=-80

enemy_phase=0
enemy_phase_hp=80
enemy_phase_max=80

dim b_x,MAX_BULLET
dim b_y,MAX_BULLET
dim b_vx,MAX_BULLET
dim b_vy,MAX_BULLET
dim b_alive,MAX_BULLET

#deffunc bullet_spawn double x,double y,double vx,double vy
repeat MAX_BULLET
if b_alive(cnt)=0{
b_alive(cnt)=1
b_x(cnt)=x
b_y(cnt)=y
b_vx(cnt)=vx
b_vy(cnt)=vy
break
}
loop
return

#deffunc shoot_angle double ang
spd=2.5
vx=cos(ang*3.14159/180)*spd
vy=sin(ang*3.14159/180)*spd
bullet_spawn enemy_x,enemy_y,vx,vy
return

#deffunc shoot_circle
repeat 12
ang=cnt*360/12
shoot_angle ang
loop
return

#deffunc bullet_update
repeat MAX_BULLET
if b_alive(cnt)=1{
b_x(cnt)+=b_vx(cnt)
b_y(cnt)+=b_vy(cnt)
if b_x(cnt)<-20 or b_x(cnt)>660 or b_y(cnt)<-20 or b_y(cnt)>500{
b_alive(cnt)=0
}
}
loop
return

#deffunc bullet_draw
color 255,220,120
repeat MAX_BULLET
if b_alive(cnt)=1{
circle b_x(cnt)-4,b_y(cnt)-4,b_x(cnt)+4,b_y(cnt)+4,0
}
loop
return

#deffunc player_hitcheck
if player_dead=1:return
if player_inv>0:return

repeat MAX_BULLET
if b_alive(cnt)=1{
dx=b_x(cnt)-player_x
dy=b_y(cnt)-player_y
if dx*dx+dy*dy<player_hit_r*player_hit_r{

player_life--
player_inv=INV_TIME

repeat MAX_BULLET
dx2=b_x(cnt)-player_x
dy2=b_y(cnt)-player_y
if dx2*dx2+dy2*dy2<80*80:b_alive(cnt)=0
loop

if player_life<=0{
player_dead=1
death_timer=0
}

break
}
}
loop
return

#deffunc shot_hitcheck
repeat MAX_PSHOT
if ps_alive(cnt)=1{
dx=ps_x(cnt)-enemy_x
dy=ps_y(cnt)-enemy_y
if dx*dx+dy*dy<20*20{
ps_alive(cnt)=0
enemy_phase_hp--
}
}
loop

if enemy_phase_hp<=0:gosub *next_phase

return

*next_phase
enemy_phase++

repeat MAX_BULLET
b_alive(cnt)=0
loop

if enemy_phase=1{
enemy_phase_max=80:enemy_phase_hp=80
}
if enemy_phase=2{
enemy_phase_max=120:enemy_phase_hp=120
}
if enemy_phase=3{
enemy_phase_max=160:enemy_phase_hp=160
}
if enemy_phase>=4:gosub *clear

ptn_timer=0 ; ← return より前に移動した

return

ptn_timer=0

#deffunc pattern_update
if enemy_phase=0:gosub *pattern_easy
if enemy_phase=1:gosub *pattern_ring
if enemy_phase=2:gosub *pattern_aim
if enemy_phase=3:gosub *pattern_rage
return

*pattern_easy
ptn_timer++
if ptn_timer>40{
shoot_circle
ptn_timer=0
}
return

*pattern_ring
ptn_timer++
if ptn_timer>25{
repeat 16
ang=cnt*360/16
shoot_angle ang
loop
ptn_timer=0
}
return

*pattern_aim
ptn_timer++
if ptn_timer>18{
dx=player_x-enemy_x
dy=player_y-enemy_y
ang=atan(dy,dx)*180/3.14159
repeat 5
shoot_angle ang
ang+=10
loop
ptn_timer=0
}
return

*pattern_rage
ptn_timer++
if ptn_timer>6{
repeat 32
ang=rnd(360)
shoot_angle ang
loop
ptn_timer=0
}
return

dim bomb_x,MAX_BOMB
dim bomb_y,MAX_BOMB
dim bomb_vy,MAX_BOMB
dim bomb_alive,MAX_BOMB

#deffunc bomb_update
repeat MAX_BOMB
if bomb_alive(cnt)=1{
bomb_y(cnt)+=bomb_vy(cnt)
if bomb_y(cnt)>480:bomb_alive(cnt)=0
}
loop
return

#deffunc bomb_draw
repeat MAX_BOMB
if bomb_alive(cnt)=1{
color 120,255,120
circle bomb_x(cnt)-8,bomb_y(cnt)-8,bomb_x(cnt)+8,bomb_y(cnt)+8,0
}
loop
return

game_state=0
fade=0
talk_step=0

#deffunc title_update
color 0,0,0:boxf
color 255,255,255
pos 220,150:mes "BULLET HEART"
pos 200,220:mes "Z : START"

if key_z=1{
game_state=1
fade=0
enemy_y=-80
}

return

#deffunc intro_update
color 0,0,0:boxf
if fade<255:fade+=4

color fade,fade,fade
circle enemy_x-20,enemy_y-20,enemy_x+20,enemy_y+20,0

if enemy_y<120:enemy_y+=2

if enemy_y>=120 and fade>=255{
game_state=2
talk_step=0
}

return

#deffunc talk_update
color 0,0,0:boxf

color 255,255,255
circle enemy_x-20,enemy_y-20,enemy_x+20,enemy_y+20,0

color 255,255,255
boxf 80,300,560,460

color 0,0,0
pos 100,320

if talk_step=0:mes "???「ここまで来たのね。」"
if talk_step=1:mes "ボス「私は弾幕の管理者。」"
if talk_step=2:mes "ボス「あなたに避けきれるかしら?」"
if talk_step=3:mes "(Zキーで会話送り)"

if key_z=1{
talk_step++
await 150
}

if talk_step>=4{
game_state=3
}

return

#deffunc battle_update
color 0,0,20:boxf

gosub *draw_enemy

player_update
shot_update
bullet_update
bomb_update

pattern_update

player_hitcheck
shot_hitcheck

bullet_draw
shot_draw
bomb_draw
player_draw

gosub *draw_ui

if player_dead=1{
game_state=4
death_timer=0
}

return

*draw_enemy
color 255,120,120
circle enemy_x-20,enemy_y-20,enemy_x+20,enemy_y+20,0
return

*draw_ui
color 255,255,255
pos 10,10:mes "LIFE:"+player_life

color 255,80,80
boxf 150,10,150+enemy_phase_hp*2,20

return

#deffunc death_update
color 0,0,0:boxf
color 255,0,0
pos 260,200:mes "YOU DIED"
death_timer++

if death_timer>60:game_state=5

return

#deffunc continue_update
color 0,0,0:boxf
color 255,255,255
pos 220,200:mes "CONTINUE?"
pos 200,260:mes "Z: YES X: NO"

if key_z=1{
player_life=3
player_dead=0
player_inv=180
game_state=1
}
if key_x=1{
game_state=0
}

return

*clear
game_state=6
return

#deffunc clear_update
color 0,0,0:boxf
color 255,255,0
pos 240,200:mes "STAGE CLEAR!"
pos 180,260:mes "Z: TITLE"

if key_z=1:game_state=0

return

*main
stick key,15
key_z=(key&16)!=0
key_x=(key&32)!=0

input_update

if game_state=0:title_update
if game_state=1:intro_update
if game_state=2:talk_update
if game_state=3:battle_update
if game_state=4:death_update
if game_state=5:continue_update
if game_state=6:clear_update

await 16
goto *main



この記事に返信する


中坊

リンク

2026/2/17(Tue) 00:23:12|NO.104722

まだ動いてません。エラーがずっと出てます。私自身はプログラム初心者で学校の授業で初めてこれを触りました
皆様の力でこのプログラムを完成させてください!!!



kinokawa

リンク

2026/2/17(Tue) 13:15:49|NO.104723

AIプログラムの修正をこの場でお願いするのはなかなか難しい気がしますが、
ちょっと見てみたところ突っ込みどころが多いプログラムとは思います



ABATBeliever

リンク

2026/2/17(Tue) 14:31:40|NO.104724

一応、最初の#deffuncの上に「#module」、*mainの上に「#global」を置けば、
とりあえず最初の部分は出てきますね。

しかし、なんかいろいろめちゃくちゃなのでこれでは無理だと思いますし、
仮に動いても、意味あるのでしょうか。

HSPみたいなマイナー言語はAIに作らせるのに向いていませんし、HSP言語をAIにすべて任せて書かせても、何の力にもなりません。

HSP言語で作りたいならサンプルコード探したり自分で勉強するのがいいですよ。
すぐに動くものが欲しいなら、「単一のindex.htmlで、HTMLとCSSとjavascriptで東方風の弾幕ゲームを作ってください。外部jsライブラリを利用する場合はCloudFlareのCDNから読み込んでください。」である程度の物を作ってくれるでしょう。



naya

リンク

2026/2/17(Tue) 20:37:02|NO.104725

ここまではがんばってみました(^^)まだまだ不具合が満載です。


#include "hspdef.as" #const MAX_BULLET 256 #const MAX_PSHOT 128 #const MAX_BOMB 16 #const INV_TIME 120 screen 0,640,480 title "RESONANCE" randomize inp_up=0:inp_down=0:inp_left=0:inp_right=0 inp_ok=0:inp_cancel=0:inp_shot=0:inp_slow=0 dim ps_x,MAX_PSHOT dim ps_y,MAX_PSHOT dim ps_v,MAX_PSHOT dim ps_alive,MAX_PSHOT shot_cool=0 enemy_x=320 enemy_y=-80 enemy_phase=0 enemy_phase_hp=80 enemy_phase_max=80 dim b_x,MAX_BULLET dim b_y,MAX_BULLET dim b_vx,MAX_BULLET dim b_vy,MAX_BULLET dim b_alive,MAX_BULLET repeat MAX_BULLET b_alive(cnt)=0 b_x(cnt)=0 b_y(cnt)=0 b_vx(cnt)=0 b_vy(cnt)=0 loop player_x=320 player_y=400 player_speed=4 player_slow=2 player_hit_r=3 player_life=3 player_inv=0 player_dead=0 death_timer=0 dim bomb_x,MAX_BOMB dim bomb_y,MAX_BOMB dim bomb_vy,MAX_BOMB dim bomb_alive,MAX_BOMB game_state=0 fade=0 talk_step=0 ptn_timer=0 goto *main #deffunc input_update stick key,511 inp_up = (key&2)!=0 inp_down = (key&8)!=0 inp_left = (key&1)!=0 inp_right = (key&4)!=0 inp_ok = (key&16)!=0 inp_cancel= (key&32)!=0 inp_shot = (key&64)!=0 inp_slow = (key&256)!=0 return #deffunc player_update if player_dead=1:return spd=player_speed if inp_slow:spd=player_slow if inp_up:player_y-=spd if inp_down:player_y+=spd if inp_left:player_x-=spd if inp_right:player_x+=spd if player_x<10:player_x=10 if player_x>630:player_x=630 if player_y<10:player_y=10 if player_y>470:player_y=470 if player_inv>0:player_inv-- return #deffunc player_draw if player_dead=1:return if player_inv>0{ color 120,180,255 }else{ color 255,80,120 } boxf player_x-4,player_y-2,player_x+4,player_y+6 boxf player_x-6,player_y-4,player_x-2,player_y+2 boxf player_x+2,player_y-4,player_x+6,player_y+2 boxf player_x-2,player_y+6,player_x+2,player_y+10 if inp_slow{ color 255,255,255 circle player_x-player_hit_r,player_y-player_hit_r,player_x+player_hit_r,player_y+player_hit_r,1 } return #deffunc shot_update if player_dead=1:return if shot_cool>0:shot_cool-- if inp_shot & (shot_cool=0){ repeat MAX_PSHOT if ps_alive(cnt)=0{ ps_alive(cnt)=1 ps_x(cnt)=player_x ps_y(cnt)=player_y-10 ps_v(cnt)=8 shot_cool=4 break } loop } repeat MAX_PSHOT if ps_alive(cnt)=1{ ps_y(cnt)-=ps_v(cnt) if ps_y(cnt)<0:ps_alive(cnt)=0 } loop return #deffunc shot_draw color 100,255,255 repeat MAX_PSHOT if ps_alive(cnt)=1{ boxf ps_x(cnt)-2,ps_y(cnt)-6,ps_x(cnt)+2,ps_y(cnt)+6 } loop return #deffunc bullet_spawn int x,int y,int vx,int vy repeat MAX_BULLET if b_alive(cnt)=0{ b_alive(cnt)=1 b_x(cnt)=x b_y(cnt)=y b_vx(cnt)=vx b_vy(cnt)=vy break } loop return #deffunc shoot_angle double ang spd=2.5 vx=cos(ang*3.14159/180)*spd vy=sin(ang*3.14159/180)*spd bullet_spawn enemy_x,enemy_y,vx,vy return #deffunc shoot_circle repeat 12 ang=cnt*360/12 shoot_angle ang loop return #deffunc bullet_update repeat MAX_BULLET if b_alive(cnt)=1{ b_x(cnt)+=b_vx(cnt) b_y(cnt)+=b_vy(cnt) if b_x(cnt)<-20 or b_x(cnt)>660 or b_y(cnt)<-20 or b_y(cnt)>500{ b_alive(cnt)=0 } } loop return #deffunc bullet_draw color 255,220,120 repeat MAX_BULLET if b_alive(cnt)=1{ circle b_x(cnt)-4,b_y(cnt)-4,b_x(cnt)+4,b_y(cnt)+4,0 } loop return #deffunc player_hitcheck if player_dead=1:return if player_inv>0:return repeat MAX_BULLET if b_alive(cnt)=1{ dx=b_x(cnt)-player_x dy=b_y(cnt)-player_y if dx*dx+dy*dy<player_hit_r*player_hit_r{ player_life-- player_inv=INV_TIME repeat MAX_BULLET dx2=b_x(cnt)-player_x dy2=b_y(cnt)-player_y if dx2*dx2+dy2*dy2<80*80:b_alive(cnt)=0 loop if player_life<=0{ player_dead=1 death_timer=0 } break } } loop return #deffunc shot_hitcheck repeat MAX_PSHOT if ps_alive(cnt)=1{ dx=ps_x(cnt)-enemy_x dy=ps_y(cnt)-enemy_y if dx*dx+dy*dy<20*20{ ps_alive(cnt)=0 enemy_phase_hp-- } } loop if enemy_phase_hp<=0:gosub *next_phase return *next_phase enemy_phase++ repeat MAX_BULLET b_alive(cnt)=0 loop if enemy_phase=1{ enemy_phase_max=80:enemy_phase_hp=80 } if enemy_phase=2{ enemy_phase_max=120:enemy_phase_hp=120 } if enemy_phase=3{ enemy_phase_max=160:enemy_phase_hp=160 } if enemy_phase>=4:gosub *clear ptn_timer=0 ; ← return より前に移動した return #deffunc pattern_update if enemy_phase=0:gosub *pattern_easy if enemy_phase=1:gosub *pattern_ring if enemy_phase=2:gosub *pattern_aim if enemy_phase=3:gosub *pattern_rage return *pattern_easy ptn_timer++ if ptn_timer>40{ shoot_circle ptn_timer=0 } return *pattern_ring ptn_timer++ if ptn_timer>25{ repeat 16 ang=cnt*360/16 shoot_angle ang loop ptn_timer=0 } return *pattern_aim ptn_timer++ if ptn_timer>18{ dx=player_x-enemy_x dy=player_y-enemy_y ang=atan(dy,dx)*180/3.14159 repeat 5 shoot_angle ang ang+=10 loop ptn_timer=0 } return *pattern_rage ptn_timer++ if ptn_timer>6{ repeat 32 ang=rnd(360) shoot_angle ang loop ptn_timer=0 } return #deffunc bomb_update repeat MAX_BOMB if bomb_alive(cnt)=1{ bomb_y(cnt)+=bomb_vy(cnt) if bomb_y(cnt)>480:bomb_alive(cnt)=0 } loop return #deffunc bomb_draw repeat MAX_BOMB if bomb_alive(cnt)=1{ color 120,255,120 circle bomb_x(cnt)-8,bomb_y(cnt)-8,bomb_x(cnt)+8,bomb_y(cnt)+8,0 } loop return #deffunc title_update color 0,0,0:boxf color 255,255,255 pos 220,150:mes "BULLET HEART" pos 200,220:mes "SPACE : START" if key_z=1{ game_state=1 fade=0 enemy_y=-80 } return #deffunc intro_update color 0,0,0:boxf if fade<255:fade+=4 color fade,fade,fade circle enemy_x-20,enemy_y-20,enemy_x+20,enemy_y+20,0 if enemy_y<120:enemy_y+=2 if enemy_y>=120 and fade>=255{ game_state=2 talk_step=0 } return #deffunc talk_update color 0,0,0:boxf color 255,255,255 circle enemy_x-20,enemy_y-20,enemy_x+20,enemy_y+20,0 color 255,255,255 boxf 80,300,560,460 color 0,0,0 pos 100,320 if talk_step=0:mes "???「ここまで来たのね。」" if talk_step=1:mes "ボス「私は弾幕の管理者。」" if talk_step=2:mes "ボス「あなたに避けきれるかしら?」" if talk_step=3:mes "(SPACEキーで会話送り)" if key_z=1{ talk_step++ await 150 } if talk_step>=4{ game_state=3 } return #deffunc battle_update color 0,0,20:boxf gosub *draw_enemy player_update shot_update bullet_update bomb_update pattern_update player_hitcheck shot_hitcheck bullet_draw shot_draw bomb_draw player_draw gosub *draw_ui if player_dead=1{ game_state=4 death_timer=0 } return *draw_enemy color 255,120,120 circle enemy_x-20,enemy_y-20,enemy_x+20,enemy_y+20,0 return *draw_ui color 255,255,255 pos 10,10:mes "LIFE:"+player_life color 255,80,80 boxf 150,10,150+enemy_phase_hp*2,20 return #deffunc death_update color 0,0,0:boxf color 255,0,0 pos 260,200:mes "YOU DIED" death_timer++ if death_timer>60:game_state=5 return #deffunc continue_update color 0,0,0:boxf color 255,255,255 pos 220,200:mes "CONTINUE?" pos 200,260:mes "SPACE: YES ESC: NO" if key_z=1{ player_life=3 player_dead=0 player_inv=180 game_state=1 } if key_x=1{ game_state=0 } return *clear game_state=6 return #deffunc clear_update color 0,0,0:boxf color 255,255,0 pos 240,200:mes "STAGE CLEAR!" pos 180,260:mes "SPACE: TITLE" if key_z=1:game_state=0 return *main stick key,15 key_z=(key&16)!=0 key_x=(key&32)!=0 input_update redraw 0 if game_state=0:title_update if game_state=1:intro_update if game_state=2:talk_update if game_state=3:battle_update if game_state=4:death_update if game_state=5:continue_update if game_state=6:clear_update redraw 1 await 16 goto *main



naya

リンク

2026/2/17(Tue) 20:45:47|NO.104726

逆にAIすげぇなと思いました(^-^;)

時間が無いので後のバグ消しは他の方に託します。



kinokawa

リンク

2026/2/17(Tue) 21:40:53|NO.104728

naya様、おつかれさまです。本来の動きはこうだったのですね。

そして、このプログラムの内容が気になりましたので
AIにプログラムの解説とコメントを書いてもらったりしてみました。
ただ、まだ内容のチェックはしていません
間違っているかもしれないですが、そのまま貼ります。
本当はAIの書いたのをチェックしなくてはならないのですが・・・

; ============================================================== ; RESONANCE / BULLET HEART - HSP製 縦スクロールシューティング ; ============================================================== ; 【ゲーム概要】 ; プレイヤーが敵(ボス)と戦う弾幕シューティングゲーム。 ; 敵はHPが減るごとに4段階のフェーズ(弾幕パターン)が変化する。 ; ライフが0になると死亡 → コンティニュー画面へ。 ; 全フェーズを撃破するとステージクリア。 ; ; 【game_state の値と画面の対応】 ; 0 = タイトル画面 ; 1 = イントロ(敵登場演出) ; 2 = 会話(セリフ表示) ; 3 = バトル(メインゲーム) ; 4 = 死亡演出 ; 5 = コンティニュー選択 ; 6 = クリア画面 ; ============================================================== #include "hspdef.as" ; HSP標準定義ファイルの読み込み ; --- 定数定義 --- #const MAX_BULLET 256 ; 敵弾の最大数 #const MAX_PSHOT 128 ; 自機弾の最大数 #const MAX_BOMB 16 ; ボムエフェクトの最大数(現在描画のみ使用) #const INV_TIME 120 ; 被弾後の無敵フレーム数(約2秒) ; --- ウィンドウ設定 --- screen 0,640,480 ; 640×480 ピクセルのゲーム画面を作成 title "RESONANCE" ; ウィンドウタイトル randomize ; 乱数シードを初期化(ランダム弾に使用) ; ============================================================== ; 入力フラグ(各フレームで更新される) ; ============================================================== inp_up=0:inp_down=0:inp_left=0:inp_right=0 ; 方向キー inp_ok=0:inp_cancel=0:inp_shot=0:inp_slow=0 ; ショット・低速移動など ; ============================================================== ; 自機弾(プレイヤーショット)データ配列 ; ============================================================== dim ps_x,MAX_PSHOT ; 各弾のX座標 dim ps_y,MAX_PSHOT ; 各弾のY座標 dim ps_v,MAX_PSHOT ; 各弾の移動速度(上方向) dim ps_alive,MAX_PSHOT ; 各弾の生存フラグ(0=なし, 1=存在) shot_cool=0 ; ショットのクールタイム(連射制限カウンタ) ; ============================================================== ; 敵(ボス)の状態 ; ============================================================== enemy_x=320 ; 敵X座標(画面中央) enemy_y=-80 ; 敵Y座標(最初は画面外上方) enemy_phase=0 ; 現在の攻撃フェーズ(0?3) enemy_phase_hp=80 ; 現フェーズの残りHP enemy_phase_max=80 ; 現フェーズの最大HP(HPバー描画用) ; ============================================================== ; 敵弾データ配列 ; ============================================================== dim b_x,MAX_BULLET ; 各弾のX座標 dim b_y,MAX_BULLET ; 各弾のY座標 dim b_vx,MAX_BULLET ; 各弾のX方向速度 dim b_vy,MAX_BULLET ; 各弾のY方向速度 dim b_alive,MAX_BULLET ; 各弾の生存フラグ(0=なし, 1=存在) ; 敵弾を全て初期化 repeat MAX_BULLET b_alive(cnt)=0 b_x(cnt)=0 b_y(cnt)=0 b_vx(cnt)=0 b_vy(cnt)=0 loop ; ============================================================== ; プレイヤーの状態 ; ============================================================== player_x=320 ; プレイヤーX座標(初期値:中央) player_y=400 ; プレイヤーY座標(初期値:画面下方) player_speed=4 ; 通常移動速度(ピクセル/フレーム) player_slow=2 ; 低速移動速度(Shiftキー等で使用) player_hit_r=3 ; 当たり判定の半径(ドット) player_life=3 ; 残機数 player_inv=0 ; 無敵タイマー(0より大きければ無敵) player_dead=0 ; 死亡フラグ(1=死亡中) death_timer=0 ; 死亡演出の経過フレーム数 ; ============================================================== ; ボムエフェクトデータ配列(現状は描画・移動のみ実装) ; ============================================================== dim bomb_x,MAX_BOMB dim bomb_y,MAX_BOMB dim bomb_vy,MAX_BOMB dim bomb_alive,MAX_BOMB ; ============================================================== ; ゲーム全体の状態管理 ; ============================================================== game_state=0 ; 現在の画面状態(0=タイトルから開始) fade=0 ; フェードイン用の輝度値(0?255) talk_step=0 ; 会話シーンの進行ステップ ptn_timer=0 ; 弾幕パターン用のタイマー goto *main ; 初期化終了後、メインループへジャンプ ; ============================================================== ; 【サブルーチン群】 ; ============================================================== ; -------------------------------------------------------------- ; input_update : キー入力の取得と各フラグへの変換 ; -------------------------------------------------------------- ; stick命令でキー状態を取得し、各方向・アクションのフラグに変換する。 ; ビットマスクで各キーを判定:上=2, 下=8, 左=1, 右=4, ; Z(決定)=16, X(キャンセル)=32, ショット=64, 低速=256 ; -------------------------------------------------------------- #deffunc input_update stick key,511 ; キー入力を取得(511=全キー対応) inp_up = (key&2)!=0 ; 上キー inp_down = (key&8)!=0 ; 下キー inp_left = (key&1)!=0 ; 左キー inp_right = (key&4)!=0 ; 右キー inp_ok = (key&16)!=0 ; Zキー(決定) inp_cancel= (key&32)!=0 ; Xキー(キャンセル) inp_shot = (key&64)!=0 ; Zキー(ショット) inp_slow = (key&256)!=0 ; Shiftキー(低速移動) return ; -------------------------------------------------------------- ; player_update : プレイヤーの移動処理と画面端クランプ ; -------------------------------------------------------------- ; 死亡中はスキップ。低速キーが押されていれば遅い速度で移動。 ; 画面外に出ないよう座標を制限(クランプ)する。 ; また無敵タイマーをカウントダウンする。 ; -------------------------------------------------------------- #deffunc player_update if player_dead=1:return ; 死亡中は処理しない spd=player_speed if inp_slow:spd=player_slow ; 低速ボタンで速度を切り替え ; 方向キーで座標を更新 if inp_up :player_y-=spd if inp_down :player_y+=spd if inp_left :player_x-=spd if inp_right:player_x+=spd ; 画面端に到達したら押し返す(クランプ処理) if player_x<10 :player_x=10 if player_x>630:player_x=630 if player_y<10 :player_y=10 if player_y>470:player_y=470 if player_inv>0:player_inv-- ; 無敵フレームをカウントダウン return ; -------------------------------------------------------------- ; player_draw : プレイヤーの描画 ; -------------------------------------------------------------- ; 死亡中はスキップ。無敵中は青色、通常時はピンク色で描画。 ; boxfで4つの矩形を組み合わせて機体形状を表現。 ; 低速移動中は当たり判定の円も白色で表示する。 ; -------------------------------------------------------------- #deffunc player_draw if player_dead=1:return ; 死亡中は描画しない ; 無敵中:青色 / 通常:ピンク色 if player_inv>0{ color 120,180,255 }else{ color 255,80,120 } ; 機体の形状を矩形の組み合わせで描画 boxf player_x-4,player_y-2,player_x+4,player_y+6 ; 胴体 boxf player_x-6,player_y-4,player_x-2,player_y+2 ; 左翼 boxf player_x+2,player_y-4,player_x+6,player_y+2 ; 右翼 boxf player_x-2,player_y+6,player_x+2,player_y+10 ; 後部ノズル ; 低速移動中:当たり判定の半径を白い円で可視化 if inp_slow{ color 255,255,255 circle player_x-player_hit_r,player_y-player_hit_r,player_x+player_hit_r,player_y+player_hit_r,1 } return ; -------------------------------------------------------------- ; shot_update : 自機ショットの発射・移動処理 ; -------------------------------------------------------------- ; 死亡中はスキップ。クールタイムが0のときにShotキーで弾を生成。 ; 生存中の弾を上方向に移動させ、画面外に出たら消滅させる。 ; -------------------------------------------------------------- #deffunc shot_update if player_dead=1:return if shot_cool>0:shot_cool-- ; クールタイムをカウントダウン ; ショットキーを押していてクールタイムが0なら弾を生成 if inp_shot & (shot_cool=0){ repeat MAX_PSHOT if ps_alive(cnt)=0{ ; 未使用スロットを探す ps_alive(cnt)=1 ps_x(cnt)=player_x ps_y(cnt)=player_y-10 ; 機体の少し前方から発射 ps_v(cnt)=8 ; 上方向への速度 shot_cool=4 ; 次の弾まで4フレーム待つ break } loop } ; 全弾の位置を更新 repeat MAX_PSHOT if ps_alive(cnt)=1{ ps_y(cnt)-=ps_v(cnt) ; 上方向に移動 if ps_y(cnt)<0:ps_alive(cnt)=0 ; 画面外で消滅 } loop return ; -------------------------------------------------------------- ; shot_draw : 自機ショットの描画 ; -------------------------------------------------------------- ; シアン色の縦長矩形で弾を描画する。 ; -------------------------------------------------------------- #deffunc shot_draw color 100,255,255 ; シアン色 repeat MAX_PSHOT if ps_alive(cnt)=1{ boxf ps_x(cnt)-2,ps_y(cnt)-6,ps_x(cnt)+2,ps_y(cnt)+6 } loop return ; -------------------------------------------------------------- ; bullet_spawn : 敵弾の生成(引数で座標・速度を指定) ; -------------------------------------------------------------- ; 未使用の弾スロットを探して弾を生成する。 ; 引数: x, y = 発射座標 / vx, vy = X・Y方向の速度 ; -------------------------------------------------------------- #deffunc bullet_spawn int x,int y,int vx,int vy repeat MAX_BULLET if b_alive(cnt)=0{ ; 未使用スロットを探す b_alive(cnt)=1 b_x(cnt)=x b_y(cnt)=y b_vx(cnt)=vx b_vy(cnt)=vy break } loop return ; -------------------------------------------------------------- ; shoot_angle : 指定角度方向へ敵弾を1発発射 ; -------------------------------------------------------------- ; 度数法の角度を受け取り、三角関数でXY速度に変換して発射。 ; 引数: ang = 発射角度(度数法、右=0, 下=90) ; -------------------------------------------------------------- #deffunc shoot_angle double ang spd=2.5 ; 弾の速さ vx=cos(ang*3.14159/180)*spd ; X方向速度 vy=sin(ang*3.14159/180)*spd ; Y方向速度 bullet_spawn enemy_x,enemy_y,vx,vy return ; -------------------------------------------------------------- ; shoot_circle : 全方向へ12発均等に弾を発射(円形弾幕) ; -------------------------------------------------------------- #deffunc shoot_circle repeat 12 ang=cnt*360/12 ; 360度を12等分した角度 shoot_angle ang loop return ; -------------------------------------------------------------- ; bullet_update : 敵弾の移動と画面外消滅処理 ; -------------------------------------------------------------- ; 全弾を速度ベクトル分だけ移動させ、画面外に出たら消滅させる。 ; -------------------------------------------------------------- #deffunc bullet_update repeat MAX_BULLET if b_alive(cnt)=1{ b_x(cnt)+=b_vx(cnt) b_y(cnt)+=b_vy(cnt) ; 画面外に出た弾を消滅させる(少し余裕を持たせた判定) if b_x(cnt)<-20 or b_x(cnt)>660 or b_y(cnt)<-20 or b_y(cnt)>500{ b_alive(cnt)=0 } } loop return ; -------------------------------------------------------------- ; bullet_draw : 敵弾の描画 ; -------------------------------------------------------------- ; 黄色い円で敵弾を描画する。 ; -------------------------------------------------------------- #deffunc bullet_draw color 255,220,120 ; 黄色 repeat MAX_BULLET if b_alive(cnt)=1{ circle b_x(cnt)-4,b_y(cnt)-4,b_x(cnt)+4,b_y(cnt)+4,0 } loop return ; -------------------------------------------------------------- ; player_hitcheck : プレイヤーと敵弾の当たり判定 ; -------------------------------------------------------------- ; 死亡中・無敵中はスキップ。 ; 各弾との距離を二乗距離で判定(sqrt不要で高速)。 ; ヒット時:残機を減らし、無敵タイマーをセット。 ; さらに半径80px以内の弾を一掃する(ミス時クリア)。 ; 残機が0になったら死亡フラグをセット。 ; -------------------------------------------------------------- #deffunc player_hitcheck if player_dead=1:return if player_inv>0 :return ; 無敵中はスキップ repeat MAX_BULLET if b_alive(cnt)=1{ dx=b_x(cnt)-player_x dy=b_y(cnt)-player_y ; 二乗距離で当たり判定(player_hit_r の円範囲内か) if dx*dx+dy*dy<player_hit_r*player_hit_r{ player_life-- ; 残機を1減らす player_inv=INV_TIME ; 無敵タイマーをセット ; 近くの弾(半径80px以内)を全消去 repeat MAX_BULLET dx2=b_x(cnt)-player_x dy2=b_y(cnt)-player_y if dx2*dx2+dy2*dy2<80*80:b_alive(cnt)=0 loop ; 残機が0以下なら死亡 if player_life<=0{ player_dead=1 death_timer=0 } break ; 1フレームに1ヒットのみ処理 } } loop return ; -------------------------------------------------------------- ; shot_hitcheck : 自機弾と敵の当たり判定 ; -------------------------------------------------------------- ; 自機弾が敵に命中したら弾を消してHPを減らす。 ; HPが0以下になったら次フェーズへ移行する。 ; -------------------------------------------------------------- #deffunc shot_hitcheck repeat MAX_PSHOT if ps_alive(cnt)=1{ dx=ps_x(cnt)-enemy_x dy=ps_y(cnt)-enemy_y ; 敵との距離が20px以内なら命中 if dx*dx+dy*dy<20*20{ ps_alive(cnt)=0 ; 弾を消す enemy_phase_hp-- ; 敵HPを1減らす } } loop if enemy_phase_hp<=0:gosub *next_phase ; HP0でフェーズ移行 return ; -------------------------------------------------------------- ; *next_phase : 敵フェーズの移行処理 ; -------------------------------------------------------------- ; フェーズ番号を進め、全弾を消去してHPを再設定する。 ; フェーズ4以上でクリア処理へ。 ; -------------------------------------------------------------- *next_phase enemy_phase++ ; フェーズを1つ進める ; フェーズ移行時に画面上の弾を全消去 repeat MAX_BULLET b_alive(cnt)=0 loop ; フェーズごとのHP設定(後半ほど高HP) if enemy_phase=1{ enemy_phase_max=80 :enemy_phase_hp=80 } if enemy_phase=2{ enemy_phase_max=120:enemy_phase_hp=120 } if enemy_phase=3{ enemy_phase_max=160:enemy_phase_hp=160 } if enemy_phase>=4:gosub *clear ; 全フェーズ撃破でクリア ptn_timer=0 ; パターンタイマーをリセット return ; ============================================================== ; 【弾幕パターン群】 ; ============================================================== ; pattern_update : フェーズに応じてパターンを呼び分け ; -------------------------------------------------------------- #deffunc pattern_update if enemy_phase=0:gosub *pattern_easy ; フェーズ0:全方向弾 if enemy_phase=1:gosub *pattern_ring ; フェーズ1:16方向リング if enemy_phase=2:gosub *pattern_aim ; フェーズ2:自機狙い扇 if enemy_phase=3:gosub *pattern_rage ; フェーズ3:高速ランダム return ; -------------------------------------------------------------- ; *pattern_easy : 40フレームごとに12方向弾(全方位円形) ; -------------------------------------------------------------- *pattern_easy ptn_timer++ if ptn_timer>40{ shoot_circle ; 12方向に弾を発射 ptn_timer=0 } return ; -------------------------------------------------------------- ; *pattern_ring : 25フレームごとに16方向弾(密なリング) ; -------------------------------------------------------------- *pattern_ring ptn_timer++ if ptn_timer>25{ repeat 16 ang=cnt*360/16 ; 360度を16等分 shoot_angle ang loop ptn_timer=0 } return ; -------------------------------------------------------------- ; *pattern_aim : 18フレームごとに自機方向へ5Way扇状弾 ; -------------------------------------------------------------- *pattern_aim ptn_timer++ if ptn_timer>18{ dx=player_x-enemy_x dy=player_y-enemy_y ang=atan(dy,dx)*180/3.14159 ; 自機方向の角度を計算 ; 中心±20度の範囲に5発(10度間隔)発射 repeat 5 shoot_angle ang ang+=10 loop ptn_timer=0 } return ; -------------------------------------------------------------- ; *pattern_rage : 6フレームごとに32発のランダム弾(激しい弾幕) ; -------------------------------------------------------------- *pattern_rage ptn_timer++ if ptn_timer>6{ repeat 32 ang=rnd(360) ; ランダムな角度に発射 shoot_angle ang loop ptn_timer=0 } return ; ============================================================== ; ボム関連 ; ============================================================== ; -------------------------------------------------------------- ; bomb_update : ボムエフェクトの移動と消滅 ; -------------------------------------------------------------- #deffunc bomb_update repeat MAX_BOMB if bomb_alive(cnt)=1{ bomb_y(cnt)+=bomb_vy(cnt) ; 下方向に移動 if bomb_y(cnt)>480:bomb_alive(cnt)=0 ; 画面外で消滅 } loop return ; -------------------------------------------------------------- ; bomb_draw : ボムエフェクトの描画(緑色の円) ; -------------------------------------------------------------- #deffunc bomb_draw repeat MAX_BOMB if bomb_alive(cnt)=1{ color 120,255,120 circle bomb_x(cnt)-8,bomb_y(cnt)-8,bomb_x(cnt)+8,bomb_y(cnt)+8,0 } loop return ; ============================================================== ; 【各画面の更新処理】 ; ============================================================== ; -------------------------------------------------------------- ; title_update : タイトル画面 ; -------------------------------------------------------------- ; "BULLET HEART" とスタート案内を表示。 ; Zキーでイントロへ移行。 ; -------------------------------------------------------------- #deffunc title_update color 0,0,0:boxf ; 画面を黒でクリア color 255,255,255 pos 220,150:mes "BULLET HEART" pos 200,220:mes "SPACE : START" if key_z=1{ game_state=1 ; イントロへ移行 fade=0 enemy_y=-80 ; 敵を画面外上に戻す } return ; -------------------------------------------------------------- ; intro_update : イントロ演出(敵の登場シーン) ; -------------------------------------------------------------- ; フェードインしながら敵が上から降りてくる演出。 ; 敵がy=120に到達しフェードインが完了したら会話画面へ。 ; -------------------------------------------------------------- #deffunc intro_update color 0,0,0:boxf if fade<255:fade+=4 ; フェードインカウンタを加算(最大255) color fade,fade,fade ; フェード輝度で敵を描画(徐々に明るく) circle enemy_x-20,enemy_y-20,enemy_x+20,enemy_y+20,0 if enemy_y<120:enemy_y+=2 ; 敵を上から降下させる ; 敵が所定位置に来てフェードインが終わったら会話画面へ if enemy_y>=120 and fade>=255{ game_state=2 talk_step=0 } return ; -------------------------------------------------------------- ; talk_update : 会話シーン ; -------------------------------------------------------------- ; ダイアログボックスにセリフを表示。 ; Zキーで次のセリフへ進む。4ステップ終了でバトル開始。 ; ※ セリフはShift-JISでエンコードされたマルチバイト文字列 ; -------------------------------------------------------------- #deffunc talk_update color 0,0,0:boxf ; 敵キャラを表示 color 255,255,255 circle enemy_x-20,enemy_y-20,enemy_x+20,enemy_y+20,0 ; セリフウィンドウ(白い矩形) color 255,255,255 boxf 80,300,560,460 color 0,0,0 pos 100,320 ; talk_step に応じてセリフを切り替え if talk_step=0:mes "!!!「ここまで来たのね。」" if talk_step=1:mes "ボス「私は弾幕の管理者。」" if talk_step=2:mes "ボス「あなたに敗けきれるかしら?」" if talk_step=3:mes "(SPACEキーで会話送り)" if key_z=1{ talk_step++ await 150 ; 連続入力防止のための待機 } if talk_step>=4{ game_state=3 ; バトル画面へ移行 } return ; -------------------------------------------------------------- ; battle_update : バトル画面(メインゲームループ) ; -------------------------------------------------------------- ; 背景描画 → 敵描画 → 各種更新処理 → 描画 → UI表示 の順で処理。 ; プレイヤーが死亡したら死亡演出画面へ移行。 ; -------------------------------------------------------------- #deffunc battle_update color 0,0,20:boxf ; 濃紺の背景でクリア gosub *draw_enemy ; 敵を描画 ; --- 更新処理 --- player_update ; プレイヤー移動 shot_update ; 自機弾の更新 bullet_update ; 敵弾の更新 bomb_update ; ボムの更新 pattern_update ; 弾幕パターンの更新(弾の生成) ; --- 当たり判定 --- player_hitcheck ; 自機と敵弾の判定 shot_hitcheck ; 自機弾と敵の判定 ; --- 描画処理 --- bullet_draw ; 敵弾を描画 shot_draw ; 自機弾を描画 bomb_draw ; ボムを描画 player_draw ; 自機を描画 gosub *draw_ui ; UIを最前面に描画 ; 死亡していたら死亡演出画面へ if player_dead=1{ game_state=4 death_timer=0 } return ; -------------------------------------------------------------- ; *draw_enemy : 敵の描画(赤い円) ; -------------------------------------------------------------- *draw_enemy color 255,120,120 circle enemy_x-20,enemy_y-20,enemy_x+20,enemy_y+20,0 return ; -------------------------------------------------------------- ; *draw_ui : UIの描画(残機表示・HPバー) ; -------------------------------------------------------------- *draw_ui ; 残機数の表示 color 255,255,255 pos 10,10:mes "LIFE:"+player_life ; 敵HPバー(赤い矩形):残HP×2 の幅で描画 color 255,80,80 boxf 150,10,150+enemy_phase_hp*2,20 return ; -------------------------------------------------------------- ; death_update : 死亡演出画面 ; -------------------------------------------------------------- ; "YOU DIED" を表示し、60フレーム後にコンティニュー画面へ。 ; -------------------------------------------------------------- #deffunc death_update color 0,0,0:boxf color 255,0,0 pos 260,200:mes "YOU DIED" death_timer++ if death_timer>60:game_state=5 ; 約1秒後にコンティニュー画面へ return ; -------------------------------------------------------------- ; continue_update : コンティニュー選択画面 ; -------------------------------------------------------------- ; ZキーでYES(ゲーム再開)、XキーでNO(タイトルへ)。 ; -------------------------------------------------------------- #deffunc continue_update color 0,0,0:boxf color 255,255,255 pos 220,200:mes "CONTINUE?" pos 200,260:mes "SPACE: YES ESC: NO" if key_z=1{ player_life=3 ; 残機を3に回復 player_dead=0 ; 死亡フラグをリセット player_inv=180 ; 復活直後の無敵タイム(約3秒) game_state=1 ; イントロからやり直し } if key_x=1{ game_state=0 ; タイトルに戻る } return ; -------------------------------------------------------------- ; *clear : クリア処理(ゲーム状態をクリア画面に移行) ; -------------------------------------------------------------- *clear game_state=6 return ; -------------------------------------------------------------- ; clear_update : クリア画面 ; -------------------------------------------------------------- ; "STAGE CLEAR!" を表示し、ZキーでタイトルへHobbiesに戻る。 ; -------------------------------------------------------------- #deffunc clear_update color 0,0,0:boxf color 255,255,0 ; 黄色で表示 pos 240,200:mes "STAGE CLEAR!" pos 180,260:mes "SPACE: TITLE" if key_z=1:game_state=0 ; タイトルへ戻る return ; ============================================================== ; 【メインループ】 ; ============================================================== ; 毎フレーム(約16ms / 約60fps)実行される。 ; 1. キー入力取得 ; 2. 画面バッファをロック(redraw 0) ; 3. game_state に応じた画面更新関数を呼ぶ ; 4. バッファを表示(redraw 1) ; 5. 16ms待機してループ ; ============================================================== *main stick key,15 ; 基本キー入力を取得(15=方向+ZX) key_z=(key&16)!=0 ; Zキー(スペース)フラグ key_x=(key&32)!=0 ; Xキー(エスケープ)フラグ input_update ; 詳細な入力フラグを更新 redraw 0 ; 描画バッファをロック(ちらつき防止) ; game_state に応じて各画面を更新 if game_state=0:title_update ; タイトル画面 if game_state=1:intro_update ; イントロ演出 if game_state=2:talk_update ; 会話シーン if game_state=3:battle_update ; バトル(メインゲーム) if game_state=4:death_update ; 死亡演出 if game_state=5:continue_update ; コンティニュー画面 if game_state=6:clear_update ; クリア画面 redraw 1 ; バッファを画面に表示 await 16 ; 約16ms待機(約60fps) goto *main ; ループ先頭へ



naya

リンク

2026/2/17(Tue) 21:47:20|NO.104729

>kinokawaさん
おお、素晴らしい!
AIさん、優秀だなぁ。



窓月らら

リンク

2026/2/18(Wed) 09:48:18|NO.104731

宿題は自分でやらないといけません。
AIはHSP3のことはあまり知らないんで、そのままで動作するのはあまりでないかもしれません。
仮にAIが出してくれたのが動いても、最初から最後まで自分で解析していって理解するのが大事です。
AIがミスした場合は、人間が修正していけば精度は上がってきます。
つまり、AIも使う側がわかっていないとダメということになります。



naya

リンク

2026/2/18(Wed) 16:32:36|NO.104732

窓月ららさんのおっしゃる通りです。

自分は今回のプログラムに知的な興味が湧いたので修正をさせていただきました。
そして、非プログラマーがAIでHSPを使える未来もあるのかなと、勝手に妄想しています(^^)。

ライトユーザーがHSPプログラミングに興味を持つきっかけになればいいなとも思いました。
まあ、今回は大目に見てやってくださいね。



中坊

リンク

2026/2/18(Wed) 21:15:47|NO.104733

nayaさんkinokawaさんABATBelieverさん窓月ららさんご指摘と修正ありがとうございます!!
他課題等で時間が取れないのと、やっぱり自分で書くよりAIが書いたほうがマシなものが
作れてしまうのでそっちを選んでしまいます。先輩方はどうやってプログラム等を習得していますか?
やっぱり小さいものから自分で調べて書いて経験をためたほうがいいんですか?
また、おすすめの練習方法を教えてください



naya

リンク

2026/2/18(Wed) 21:42:19|NO.104734

>中坊さん

一度に「○○みたいなゲームが作りたい」というのではなく、

「画面のここに赤い文字を表示したい」とか
「この場所に自分で描いた絵を表示してみたい」

のように、少しずつ自分で出来ることを増やしていくと良いと思いますよ!

掲示板などに質問をする前にはマニュアルをしっかりと調べてみましょう(^^)
高度な処理でない限りはマニュアルを調べることでほとんどが解決できますから。

まあ、焦らずにマイペースで勉強していってくださいねv(^_^)



中坊

リンク

2026/2/18(Wed) 22:23:13|NO.104735

わかりました!!ありがとうございます!1



窓月らら

リンク

2026/2/20(Fri) 01:15:16|NO.104737

プログラムはとにかく小さいパーツの積み重ねです。
サンプルプログラムが付属していますから、まずはそれをよく見て解析することですね。
HSPスクリプトエディタでF1を押すとリファレンスマニュアルがでます。
まずはこれをよく読むことからです。
読む時間がないとかは言い訳なのです・・そんなすぐにできるもんじゃないので。
何年もかかって書けるようになるのが通常なんでがんばってみてください。



窓月らら

リンク

2026/2/20(Fri) 01:18:14|NO.104738

それとAIの書くコードはとりあえず動いたりはしますが、
わかってる人がみると無駄なコードが多すぎて自分で書いたほうがいいとなります。
なのでコピペで作ってそのソースを公開した場合は一発でバレると思われます。



沢渡

リンク

2026/2/20(Fri) 05:34:39|NO.104739

大昔、Netscape付属のWebページ制作ソフトでWebページ作ったら、
「見た目がそれっぽいなら別にいいでしょ」とばかりにグッチャグチャのHTMLを
吐き出された思い出があります。
あれも広い意味ではAIなんじゃないかと思いますが、その思い出のせいで
この手の「ざっくりと指示すれば自動的に何か書いてくれる」ものには、
「その場はそれでいいかもしれないが、改善したりデバッグしたりという
 細かい所を詰めるフェイズに入ると、とんでもなく苦労するんじゃないか」
という心配があったりします。
平成から卒業できてない、時代遅れな偏見なのかもしれませんが。



窓月らら

リンク

2026/2/20(Fri) 07:00:57|NO.104740

いまのAIはこちらが教えることで最適化もいちおうやってくれるんです。
うちはそういうのも試しているのですが、
結局これは扱う人間がわかっていないと最適化も指示できないというわけです。
最適化してくれ、とプロンプトで指示してもでてきたものが最適化されているかは
コードを読んで全体構造が理解できる人間がやらないと正しいか判断できませんから。

うちはコードを出してもらうのではなくて、解析と会議でAIは使い始めてます。
コードは自分で書いたのをAIに見せていくことはあります。
こうするとこちらの書き方もAIが覚えて、自分流に最適化されていきます。



TERU10

リンク

2026/2/20(Fri) 16:38:31|NO.104743

なんのAIを使っているのですか?
もしかしたらそれが問題かもしれません
今のAIってすごいですよね!!
お仕事頑張ってください



中坊

リンク

2026/2/20(Fri) 22:01:27|NO.104744

私はGeminiCLIという、自分のPC内の一部フォルダ内でのみフォルダやファイルの生成、改変を
許可できるAIを使用しました。



kinokawa

リンク

2026/2/24(Tue) 21:10:59|NO.104760

>やっぱり自分で書くよりAIが書いたほうがマシなものが
>作れてしまうのでそっちを選んでしまいます。

いろんな意見があるとは思いますが、最初はそれでいいと思いますよ。
ミニゲームから初めてみて完成品を作り
達成感を少しずつ積み重ねていけばいいのではないかと思います。

F1キーでもいいですしAIに解説してもらうなりしていけば徐々に理解が深まるかと
とにかくやる気を持続することが大事ですね。

その後はAIには企画書なんか作ってもらうと励みになっていいかと

>東方の弾幕を再現しようとしてます
私が思うところ、ZUN氏は本格的なタスクシステムを作っておられるかと思います。

AIにタスクのことを聞いてみたら本当かどうかわかりませんが
>シューティングゲームのタスクシステムは、
>東方Projectの原作者ZUNさんが採用していることでも有名で、
>同人ゲーム開発でも広く使われている設計パターンです。
と言ってます。(^^;



うし

リンク

2026/2/25(Wed) 21:17:08|NO.104764

古代祐三さんが
開発に携わった新作STGが
MEGADRIVEで発売されるみたい。

16bitレトロSTGも根強い人気があるのかな。

HSPだと、libのSPRITEを使うとつくりやすいのかも。



うし

リンク

2026/2/27(Fri) 15:45:49|NO.104766

このSTGは、
magadriveの開発が、c++の環境でできるSDKでつくられてるみたい。

掲示板を見ていたら、
「HSPPP (Hot Soup Processor Plus Plus)」という
HSPユーザー向けのC++ライブラリをつくったすごい方がいますね。

■ HSPPP 完全ガイド(移行マニュアル)
https://hsp-knowledge.github.io/2026/01/03/hsppp-lib-introduction-guide.html

■ GitHubリポジトリ
https://github.com/Velgail/HSPPP_Lib

HSPで、magadriveの開発ができる可能性もあるのかな?



記事削除

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

NO.104721への返信

マスコット

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

名前

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

削除用パスワード

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

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