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


