|
 |
|
|
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
まだ動いてません。エラーがずっと出てます。私自身はプログラム初心者で学校の授業で初めてこれを触りました
皆様の力でこのプログラムを完成させてください!!!
|
|
|
2026/2/17(Tue) 13:15:49|NO.104723
AIプログラムの修正をこの場でお願いするのはなかなか難しい気がしますが、
ちょっと見てみたところ突っ込みどころが多いプログラムとは思います
|
|
|
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から読み込んでください。」である程度の物を作ってくれるでしょう。
|
|
|
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

| |
|
|
2026/2/17(Tue) 20:45:47|NO.104726
逆にAIすげぇなと思いました(^-^;)
時間が無いので後のバグ消しは他の方に託します。
|
|
|
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 ; ループ先頭へ

| |
|
|
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も使う側がわかっていないとダメということになります。
|
|
|
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が書いたほうがマシなものが
作れてしまうのでそっちを選んでしまいます。先輩方はどうやってプログラム等を習得していますか?
やっぱり小さいものから自分で調べて書いて経験をためたほうがいいんですか?
また、おすすめの練習方法を教えてください
|
|
|
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が覚えて、自分流に最適化されていきます。
|
|
|
2026/2/20(Fri) 16:38:31|NO.104743
なんのAIを使っているのですか?
もしかしたらそれが問題かもしれません
今のAIってすごいですよね!!
お仕事頑張ってください
|
|
|
2026/2/20(Fri) 22:01:27|NO.104744
私はGeminiCLIという、自分のPC内の一部フォルダ内でのみフォルダやファイルの生成、改変を
許可できるAIを使用しました。
|
|
|
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を使うとつくりやすいのかも。
|
|