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


HSPTV!掲示板


未解決 解決 停止 削除要請

2016
0726
mmプログラム詳しい方至急お願いします7解決


mm

リンク

2016/7/26(Tue) 12:00:51|NO.76351


//------------------------------------------------------------------------------ // シューティング・ゲームのミニ講座 for HSP(Ver.3.3.2) //============================================================================== // 第9回「完成ソース」by 科学太郎 //------------------------------------------------------------------------------ //-------------------------------------- // メイン部 //-------------------------------------- *Init ;スコアの管理 dim Score ;現在スコア dim HiScore ;最高スコア ;自機の管理 dim x ;自機の横軸 dim y ;自機の縦軸 dim fight ;自機の残機数 dim blast ;自機の爆発カウンタ ;弾丸の管理 dim tamaF,10 ;有無フラグ dim tamaX,10 ;弾丸の横軸 dim tamaY,10 ;弾丸の縦軸 ;敵機の管理 dim enemyF,20 ;有無フラグ dim enemyX,20 ;敵機の横軸 dim enemyY,20 ;敵機の縦軸 dim enemyZ,20 ;敵機の爆発カウンタ ;流星の管理 dim starF,50 ;有無フラグ dim starX,50 ;流星の横軸 dim starY,50 ;流星の縦軸 ;スコアの初期化 Score=0 HiScore=9900 ;自機の初期化 x=(600-50)/2 y=(400-50)-16 fight=3 blast=0 *Start screen 0,600,400,SCREEN_FIXEDSIZE title "シューティング・ゲームのミニ講座" redraw 0 color:boxf color $00,$FF,$FF:font "HG明朝E",50:pos (600-50*11)/2,100:mes "シューティング・ゲーム" color $FF,$FF,$00:font "HG明朝E",30:pos (600-30* 6)/2,180:mes "〜ミニ講座〜" color $FF,$FF,$FF:font "HG明朝E",16:pos (600- 8*15)/2,250:mes "[SPC]キーで開始" color $FF,$FF,$FF:font "HG明朝E",16:pos (600- 8*15)/2,282:mes "[ESC]キーで終了" redraw 1 repeat stick key if(key & $10):break if(key & $80):end await 20 loop *Main font MSGOTHIC,50 randomize repeat redraw 0 stick key,%11111 gosub *EnemyBirth gosub *StarBirth gosub *StarDraw gosub *FightDraw gosub *EnemyDraw gosub *TamaDraw gosub *TelopDraw redraw 1 await (1000/60) loop stop //-------------------------------------- // 自機の描画 //-------------------------------------- *FightDraw if(blast==0){ if(key&1):x-=5:if(x<0):x=0 if(key&2):y-=5:if(y<0):y=0 if(key&4):x+=5:if(x>550):x=550 if(key&8):y+=5:if(y>350):y=350 if(key&16):gosub *TamaBirth color $00,$FF,$00:pos x,y:mes "山" } else:if(blast>1){ blast-- color $FF,$00,$00:pos x,y if(blast\10<5):mes "※":else:mes "*" } else:if(fight){ fight-- blast=0 x=(600-50)/2 y=(400-50)-16 } else{ dialog "もう一度、ゲームを行いますか?",3,"ゲームオーバー" if(stat==7):end ;スコアの初期化 Score=0 ;自機の初期化 x=(600-50)/2 y=(400-50)-16 fight=3 blast=0 ;配列の初期化 dim starF,50 dim tamaF,10 dim enemyF,20 } return //-------------------------------------- // 流星の発生 //-------------------------------------- *StarBirth if(starCycle):starCycle--:return foreach starF if(starF(cnt)==0){ starF(cnt)=1 starX(cnt)=rnd(600) starY(cnt)=0 break } loop starCycle=3 return //-------------------------------------- // 流星の描画 //-------------------------------------- *StarDraw color $00,$00,$00:boxf foreach starF if starF(cnt){ starY(cnt)+=2:if(starY(cnt)>=400):starF(cnt)=0:continue color $FF,$FF,$00 pset starX(cnt),starY(cnt) } loop return //-------------------------------------- // 弾丸の発生 //-------------------------------------- *TamaBirth if(tamaTrigg):tamaTrigg--:return foreach tamaF if(tamaF(cnt)==0){ tamaF(cnt)=1 tamaX(cnt)=x tamaY(cnt)=y break } loop tamaTrigg=8 return //-------------------------------------- // 弾丸の描画 //-------------------------------------- *TamaDraw foreach tamaF if tamaF(cnt){ tamaY(cnt)-=8:if(tamaY(cnt)<-50):tamaF(cnt)=0:continue pos tamaX(cnt),tamaY(cnt) color $FF,$FF,$00:mes ":" } loop return //-------------------------------------- // 敵機の発生 //-------------------------------------- *EnemyBirth if(enemyCycle):enemyCycle--:return foreach enemyF if(enemyF(cnt)==0){ enemyF(cnt)=1 enemyX(cnt)=rnd(600/50)*50 enemyY(cnt)=-50 enemyZ(cnt)=0 break } loop enemyCycle=30 return //-------------------------------------- // 敵機の描画 //-------------------------------------- *EnemyDraw foreach enemyF if enemyF(cnt){ if(enemyZ(cnt)==0){ enemyY(cnt)+=3:if(enemyY(cnt)>400) :enemyF(cnt)=0:continue if FightCrash(enemyX(cnt),enemyY(cnt)) :enemyZ(cnt)=60:ScoreCalc 100:continue if TamaCrash(enemyX(cnt),enemyY(cnt)) :enemyZ(cnt)=60:ScoreCalc 100:continue pos enemyX(cnt),enemyY(cnt) color $00,$FF,$FF:mes "Ж" } else:if(enemyZ(cnt)>1){ enemyZ(cnt)-- color $FF,$00,$00:pos enemyX(cnt),enemyY(cnt) if(enemyZ(cnt)\10<5):mes "※":else:mes "*" } else{ enemyF(cnt)=0 } } loop return randomize screen 0,400,400 //弾の情報を保持する配列 dim tama,20 ddim tx,10,20 ddim ty,10,20 ddim tvx,10,20 ddim tvy,10,20 //-------------------------------------- // テロップの描画 //-------------------------------------- *TelopDraw msg="" repeat fight msg+="山" loop y(1)=0:x(1)=(20) y(2)=0:x(2)=(600-20)-(16*11) x(3)=0:y(3)=(400-20) font MSGOTHIC,20,1 color $FF,$FF,$00:pos x(1),y(1):mes strf("Score:%08d",Score) color $FF,$FF,$00:pos x(2),y(2):mes strf("HiScore:%08d",HiScore) color $00,$FF,$00:pos x(3),y(3):mes msg font MSGOTHIC,50 return //-------------------------------------- // スコアの加算 //-------------------------------------- #deffunc ScoreCalc int _score_ Score+=_score_ if(Score>HiScore):HiScore=Score return //-------------------------------------- // 自機の衝突判定 //-------------------------------------- #defcfunc FightCrash int _x_,int _y_ if(blast==0)and(abs(x-_x_)<50)and(abs(y-_y_)<50){ blast=60 return 1 } return 0 //-------------------------------------- // 自機弾の衝突判定 //-------------------------------------- #defcfunc TamaCrash int _x_,int _y_ n=0 foreach tamaF if tamaF(cnt){ if(abs(tamaX(cnt)-_x_)<50)and(abs(tamaY(cnt)-_y_)<50){ tamaF(cnt)=0 n=1 break } } loop return n //------------------------------------------------------------------------------ // End of lesson-9.hsp //------------------------------------------------------------------------------




の敵から、





randomize screen 0,400,400 //弾の情報を保持する配列 dim tama,20 ddim tx,10,20 ddim ty,10,20 ddim tvx,10,20 ddim tvy,10,20 *main color 0,0,0 : boxf 0,0,400,400 color 255,0,0 : pos 190,10 : mes "●" time++ if time \ 20 = 0 :gosub *create_circle_bullet //弾の処理 color 255,255,255 repeat 10 if tama(cnt) > 0 { tama(cnt)++ if tama(cnt) > 120 :tama(cnt) = 0 //画面から消えて時間が経った弾を消去 i = cnt repeat 20 tx(i,cnt) += tvx(i,cnt) ty(i,cnt) += tvy(i,cnt) pset tx(i,cnt),ty(i,cnt) loop } loop redraw 1 : wait 3 : redraw 0 goto *main //弾の生成 *create_circle_bullet v = 4.0 //弾の速度 a = 0.0 gosub *bullet_check repeat 20 tx(i,cnt) = 195.0 ty(i,cnt) = 15.0 tvx(i,cnt) = v * cos(a) tvy(i,cnt) = v * sin(a) a += 0.162 loop return //空いている弾の配列を探す *bullet_check repeat 20 if tama(cnt) = 0 : i = cnt : break loop if tama(i) = 1 :return tama(i) = 1 return






のような弾幕を張りたいです。
ですがやり方が分からないので詳しい方至急やり方を教えてください。
お願いします。
   分かりずらくて申し訳ない。



この記事に返信する


bellyoshi

リンク

2016/7/26(Tue) 12:50:50|NO.76352

こんなんでどうでしょう?

//------------------------------------------------------------------------------
// シューティング・ゲームのミニ講座 for HSP(Ver.3.3.2)
//==============================================================================
// 第9回「完成ソース」by 科学太郎
//------------------------------------------------------------------------------

//--------------------------------------
// メイン部
//--------------------------------------
*Init
;スコアの管理

dim HiScore ;最高スコア
;自機の管理
dim x ;自機の横軸
dim y ;自機の縦軸
dim fight ;自機の残機数
dim blast ;自機の爆発カウンタ
;弾丸の管理
dim tamaF,10 ;有無フラグ
dim tamaX,10 ;弾丸の横軸
dim tamaY,10 ;弾丸の縦軸
;敵機の管理
dim enemyF,20 ;有無フラグ
dim enemyX,20 ;敵機の横軸
dim enemyY,20 ;敵機の縦軸
dim enemyZ,20 ;敵機の爆発カウンタ
dim enemyShotTime, 20
;流星の管理
dim starF,50 ;有無フラグ
dim starX,50 ;流星の横軸
dim starY,50 ;流星の縦軸
;敵の弾の情報を保持する配列
dim tama,20
ddim tx,10,20
ddim ty,10,20
ddim tvx,10,20
ddim tvy,10,20

;スコアの初期化
Score=0
HiScore=9900
;自機の初期化
x=(600-50)/2
y=(400-50)-16
fight=3
blast=0
*Start
screen 0,600,400,SCREEN_FIXEDSIZE
title "シューティング・ゲームのミニ講座"
redraw 0
color:boxf
color $00,$FF,$FF:font "HG明朝E",50:pos (600-50*11)/2,100:mes "シューティング・ゲーム"
color $FF,$FF,$00:font "HG明朝E",30:pos (600-30* 6)/2,180:mes "〜ミニ講座〜"
color $FF,$FF,$FF:font "HG明朝E",16:pos (600- 8*15)/2,250:mes "[SPC]キーで開始"
color $FF,$FF,$FF:font "HG明朝E",16:pos (600- 8*15)/2,282:mes "[ESC]キーで終了"
redraw 1
repeat
stick key
if(key & $10):break
if(key & $80):end
await 20
loop
*Main
font MSGOTHIC,50
randomize
repeat
redraw 0
stick key,%11111
gosub *EnemyBirth
gosub *enemyTamaUtu
gosub *StarBirth
gosub *StarDraw
gosub *FightDraw
gosub *EnemyDraw
gosub *TamaDraw
gosub *TelopDraw
gosub *enemyTamaDraw
redraw 1
await (1000/60)
loop
stop
//--------------------------------------
// 自機の描画
//--------------------------------------
*FightDraw
if(blast==0){
if(key&1):x-=5:if(x<0):x=0
if(key&2):y-=5:if(y<0):y=0
if(key&4):x+=5:if(x>550):x=550
if(key&8):y+=5:if(y>350):y=350
if(key&16):gosub *TamaBirth
color $00,$FF,$00:pos x,y:mes "山"
}
else:if(blast>1){
blast--
color $FF,$00,$00:pos x,y
if(blast\10<5):mes "※":else:mes "*"
}
else:if(fight){
fight--
blast=0
x=(600-50)/2
y=(400-50)-16
}
else{
dialog "もう一度、ゲームを行いますか?",3,"ゲームオーバー"
if(stat==7):end
;スコアの初期化
Score=0
;自機の初期化
x=(600-50)/2
y=(400-50)-16
fight=3
blast=0
;配列の初期化
dim starF,50
dim tamaF,10
dim enemyF,20
}
return
//--------------------------------------
// 流星の発生
//--------------------------------------
*StarBirth
if(starCycle):starCycle--:return
foreach starF
if(starF(cnt)==0){
starF(cnt)=1
starX(cnt)=rnd(600)
starY(cnt)=0
break
}
loop
starCycle=3
return
//--------------------------------------
// 流星の描画
//--------------------------------------
*StarDraw
color $00,$00,$00:boxf
foreach starF
if starF(cnt){
starY(cnt)+=2:if(starY(cnt)>=400):starF(cnt)=0:continue
color $FF,$FF,$00
pset starX(cnt),starY(cnt)
}
loop
return
//--------------------------------------
// 弾丸の発生
//--------------------------------------
*TamaBirth
if(tamaTrigg):tamaTrigg--:return
foreach tamaF
if(tamaF(cnt)==0){
tamaF(cnt)=1
tamaX(cnt)=x
tamaY(cnt)=y
break
}
loop
tamaTrigg=8
return
//--------------------------------------
// 弾丸の描画
//--------------------------------------
*TamaDraw
foreach tamaF
if tamaF(cnt){
tamaY(cnt)-=8:if(tamaY(cnt)<-50):tamaF(cnt)=0:continue
pos tamaX(cnt),tamaY(cnt)
color $FF,$FF,$00:mes ":"
}
loop
return
//--------------------------------------
// 敵機の発生
//--------------------------------------
*EnemyBirth
if(enemyCycle):enemyCycle--:return
foreach enemyF
if(enemyF(cnt)==0){
enemyF(cnt)=1
enemyX(cnt)=rnd(600/50)*50
enemyY(cnt)=-50
enemyZ(cnt)=0
break
}
loop
enemyCycle=30
return
//--------------------------------------
// 敵機の描画
//--------------------------------------
*EnemyDraw
foreach enemyF
if enemyF(cnt){
if(enemyZ(cnt)==0){
enemyY(cnt)+=3:if(enemyY(cnt)>400) :enemyF(cnt)=0:continue
if FightCrash(enemyX(cnt),enemyY(cnt)) :enemyZ(cnt)=60:ScoreCalc 100:continue
if TamaCrash(enemyX(cnt),enemyY(cnt)) :enemyZ(cnt)=60:ScoreCalc 100:continue
pos enemyX(cnt),enemyY(cnt)
color $00,$FF,$FF:mes "Ж"
}
else:if(enemyZ(cnt)>1){
enemyZ(cnt)--
color $FF,$00,$00:pos enemyX(cnt),enemyY(cnt)
if(enemyZ(cnt)\10<5):mes "※":else:mes "*"
}
else{
enemyF(cnt)=0
}
}
loop
return



//--------------------------------------
// テロップの描画
//--------------------------------------
*TelopDraw
msg=""
repeat fight
msg+="山"
loop
y(1)=0:x(1)=(20)
y(2)=0:x(2)=(600-20)-(16*11)
x(3)=0:y(3)=(400-20)
font MSGOTHIC,20,1
color $FF,$FF,$00:pos x(1),y(1):mes strf("Score:%08d",Score)
color $FF,$FF,$00:pos x(2),y(2):mes strf("HiScore:%08d",HiScore)
color $00,$FF,$00:pos x(3),y(3):mes msg
font MSGOTHIC,50
return
//--------------------------------------
// スコアの加算
//--------------------------------------
#deffunc ScoreCalc int _score_
Score+=_score_
if(Score>HiScore):HiScore=Score
return
//--------------------------------------
// 自機の衝突判定
//--------------------------------------
#defcfunc FightCrash int _x_,int _y_
if(blast==0)and(abs(x-_x_)<50)and(abs(y-_y_)<50){
blast=60
return 1
}
return 0
//--------------------------------------
// 自機弾の衝突判定
//--------------------------------------
#defcfunc TamaCrash int _x_,int _y_
n=0
foreach tamaF
if tamaF(cnt){
if(abs(tamaX(cnt)-_x_)<50)and(abs(tamaY(cnt)-_y_)<50){
tamaF(cnt)=0
n=1
break
}
}
loop
return n
//------------------------------------------------------------------------------
// End of lesson-9.hsp
//------------------------------------------------------------------------------
//弾の処理
*enemyTamaDraw

for j,0,9,1
if tama(j) > 0 {
tama(j)++
if tama(j) > 120 :tama(j) = 0 //画面から消えて時間が経った弾を消去
repeat 20
tx(j,cnt) += tvx(j,cnt)
ty(j,cnt) += tvy(j,cnt) + 2
color 255,255,255
pset tx(j,cnt),ty(j,cnt)
loop
}
next
return
*enemyTamaUtu
for k,0,length(enemyF),1
if enemyF(k) {
if (enemyShotTime(k)){
enemyShotTime(k)--
_continue
}
ex = enemyX(k)
ey = enemyY(k)
gosub *create_circle_bullet
enemyShotTime(k) = 150
}
next
return
//弾の生成
*create_circle_bullet
v = 4.0 //弾の速度
a = 0.0
gosub *bullet_check
if i >= 10 : return
repeat 20
tx(i,cnt) = double(ex)
ty(i,cnt) = double(ey)
tvx(i,cnt) = v * cos(a)
tvy(i,cnt) = v * sin(a)
a += 0.162
loop
return

//空いている弾の配列を探す
*bullet_check
i = 10
repeat 20
if tama(cnt) = 0 : i = cnt : break
loop
if tama(i) = 1 :return
tama(i) = 1
return



bellyoshi

リンク

2016/7/26(Tue) 13:06:25|NO.76353

#defcfunc TekiTamaCrash int _x_,int _y_
if(blast==0)and(x < _x_ and _x_ < x + 30) and(y < _y_ and _y_ < y + 30){
blast=60
return 1
}
return 0
弾の判定
if TekiTamaCrash(tx(j,cnt),ty(j,cnt)) : ScoreCalc 100
な感じで使います。

でゲーム的には激むずです。



mm

リンク

2016/7/26(Tue) 17:02:39|NO.76357

>>bellyoshi様
 8行目の文法が間違っています。と表示されます…
またソースのどの部分に挿入したら良いでしょうか?
すいません 初心者なもので...



bellyoshi

リンク

2016/7/26(Tue) 18:20:31|NO.76358

私が、最初に投稿したものは動きましたか?

動けば、
#defcfunc TekiTamaCrash int _x_,int _y_
if(blast==0)and(x < _x_ and _x_ < x + 30) and(y < _y_ and _y_ < y + 30){
blast=60
return 1
}
return 0
を最後に追加します。
//弾の処理
*enemyTamaDraw

for j,0,9,1
if tama(j) > 0 {
tama(j)++
if tama(j) > 120 :tama(j) = 0 //画面から消えて時間が経った弾を消去
repeat 20
tx(j,cnt) += tvx(j,cnt)
ty(j,cnt) += tvy(j,cnt) + 2
if TekiTamaCrash(tx(j,cnt),ty(j,cnt)) : ScoreCalc 100 ;<<<ここに追加
color 255,255,255
pset tx(j,cnt),ty(j,cnt)
loop
}
next
return

すると、クラッシュの処理もできると思います。



mm

リンク

2016/7/27(Wed) 15:37:41|NO.76368

ありがとうございます!



Cheesehamburg7273

リンク

2016/7/27(Wed) 21:03:29|NO.76376

う〜ん。このソース、どっかで見たことあるような...



mm

リンク

2016/7/28(Thu) 10:17:56|NO.76401

>Cheesehamburg7273
はい...他のサイトから持ってきました...
(他力本願)



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