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


HSPTV!掲示板


未解決 解決 停止 削除要請

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


中坊

リンク

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



記事削除

記事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.