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


HSPTV!掲示板


未解決 解決 停止 削除要請

2014
0518
はてな敵キャラがちらつく4未解決


はてな

リンク

2014/5/18(Sun) 15:26:13|NO.62080

敵にコインを当てて倒すゲームを作ろうとしているのですが、敵がちらついてしまいます。

プログラムは次のものです。

#include "obaq.as"

randomize
title "コイン投げゲーム"
celload "coin.bmp":texcoin=stat
celload "enemy.png",2
celdiv 2,65,65,32,32
gmode 2


score=0 ; GOALした数
throw=0 ; 発射した数

//敵の情報
dim enemy,20
dim enemy_x,20
dim enemy_y,20
dim enemy_hp,20

*start
qreset ; OBAQの初期化
qborder -80,-60,80,90 ; 画面の端を設定
qmat mat_spr, texgoal ; 画像を設定する
qtype type_bind ; 動かない(固定)オブジェクトにする


mr=M_PI ; 発射角度
mx=600:my=300+rnd(100) ; 発射位置
*main
; メインループ
;
stick key,15
if key&128 : end
if key&1 : if mr<4.5 : mr+=0.02
if key&4 : if mr>M_PI : mr-=0.02
if key&16 {

qaddpoly coin, 12, mx/4,my/4,0,5,5 ; コインを追加
qmat coin, mat_spr, texcoin ; 画像を設定する
qspeed coin, sin(mr), cos(mr)
throw++
}

//敵出現ルーチン
time++
if (time \ 200) = 0 {
repeat 20
if enemy(cnt) = 0 {
enemy(cnt) = 1
enemy_y(cnt) = rnd(361)
enemy_x(cnt) = -40
enemy_hp(cnt) = 10
break
}
loop
}


//敵の処理
repeat 20
if enemy_y(cnt) > 400 : enemy(cnt) = 0
if enemy(cnt) = 1{
enemy_x(cnt)++
pos enemy_x(cnt),enemy_y(cnt)
gcopy 2,0,0,65,65
}
loop


redraw 0 ; 画面の更新を開始
gradf ,,,,1,0,128 ; 画面クリア
qexec ; OBAQによるオブジェクトの更新
qdraw 1 ; オブジェクトの描画

color 0,255,0
pos mx,my:line mx+sin(mr)*100,my+cos(mr)*100

color 255,255,255
pos 0,0:mes "SCORE:"+score+"/"+throw

redraw 1 ; 画面の更新を終了
await 12 ; 一定時間待つ
goto *main


それと「celload "coin.bmp":texcoin=stat」の意味がわかりません。
私の知っているcelload命令は
celload "enemy.png",2
celdiv 2,65,65,32,32
このような感じで celload "ファイル名",ウィンドウID
         celdiv ウィンドウID,横幅,縦幅,x中心座標,y中心座標
と分割するceldivとセットで使うものです。
「celload "coin.bmp":texcoin=stat」はどうやって使うのでしょうか?

よろしくお願いします。



この記事に返信する


暇人

リンク

2014/5/18(Sun) 16:05:32|NO.62083

>敵がちらついてしまいます。
敵を表示してからgradfで画面全体塗りつぶせばちらつくよ
「redraw 1」の状態で敵を描画して敵が直ぐに表示される
「redraw 0」の状態で塗りつぶして「redraw 1」されて塗りつぶされた画面が表示される(上に戻る)
って感じになってる

敵描画前(ループの最初で良いけど)に
>redraw 0 ; 画面の更新を開始
>gradf ,,,,1,0,128 ; 画面クリア
を移動すれば良い

>それと「celload "coin.bmp":texcoin=stat」の意味がわかりません。
ヘルプに理由が書いてある
>p1が省略されるか、マイナス値の場合は未使用のウインドゥIDが自動的に使用されます。
>(命令実行後、システム変数statに読み込まれたウィンドウIDが代入されます。)



はてな

リンク

2014/5/18(Sun) 16:40:29|NO.62085

返信ありがとうございます!
教えていただいたとおりにやってみたらちらつきがなくなりました。
さらに質問なのですが、敵キャラにあたり判定をつけたいのですが、コインの座標がないから
敵とコインの絶対値の差であたり判定をすることができません。
どのような方法であたり判定をつけることができるのですか?

たびたびすみません。
よろしくお願いします。



あり

リンク

2014/5/18(Sun) 17:14:57|NO.62087

>コインの座標がないから

OBAQ内部で使われている座標はqgetposで取得できます。


>どのような方法であたり判定をつけることができるのですか?

主な方法は、敵もOBAQのオブジェクトで作ってコリジョン判定するか
qcnvaxisで座標を変換して比較演算で判定するかです。
(OBAQを使うなら当然前者が楽ですが)



暇人

リンク

2014/5/18(Sun) 18:20:47|NO.62091

表示されてるobaqオブジェクトを検索して座標表示

↓をメインループ内の適当なところに貼り付け

qfind 1,stat_active //グループを指定しないで作ったオブジェクトはグループが1にななので1を指定 repeat qnext oid if oid<0 {break} qgetpos oid,ob_x,ob_y,ob_angle qcnvaxis sc_x,sc_y,ob_x,ob_y,0 pos sc_x-32,sc_y+32 mes "x="+sc_x mes "y="+sc_y loop
qexecの前に貼り付けると座標取得してから
オブジェクトが動くので座標表示とオブジェクト表示位置はずれる

当たった後も物理演算させたいならOBAQのコリジョン命令使った方が良いと思うが・・・



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