|
|
|
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
のような弾幕を張りたいです。
ですがやり方が分からないので詳しい方至急やり方を教えてください。
お願いします。
分かりずらくて申し訳ない。
| |
|
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
| |
|
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
な感じで使います。
でゲーム的には激むずです。
|
|
2016/7/26(Tue) 17:02:39|NO.76357
>>bellyoshi様
8行目の文法が間違っています。と表示されます…
またソースのどの部分に挿入したら良いでしょうか?
すいません 初心者なもので...
|
|
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
すると、クラッシュの処理もできると思います。
|
|
2016/7/27(Wed) 15:37:41|NO.76368
ありがとうございます!
|
|
2016/7/27(Wed) 21:03:29|NO.76376
う〜ん。このソース、どっかで見たことあるような...
|
|
2016/7/28(Thu) 10:17:56|NO.76401
>Cheesehamburg7273
はい...他のサイトから持ってきました...
(他力本願)
|
|