現在落ちゲーを作っています。(MAKE 10 落下してくるアイテム(数字1~10)を拾い10を作っていく)
ゲーム自体はほとんど完成しています。
しかし絶対に修正しなければならない点があるのですが、自分ではどうにもできませんでした。
その問題というのが、
落下してくるアイテムが途中で突然消えてしまう。
という致命的なものです。
すべてのアイテムがそうなるわけではないのですが、ゲームのレベルが上がるにつれてそうなるアイテムが増えてきている気がします。
ちなみに、アイテムにはフラグをたてて、1なら存在0なら消滅という風に書いています。
ちなみにレベルが上がると、落ちてくるアイテムが増えていくという仕様になっています。
ゲームメインのコードは以下です。
#include"gamemain.h"
#include"loading.h"
#include<math.h>
GameState gamestate = GAME_TITLE;
int count; //カウンタ(メインループ)
int key[STRN];//キー
int sum; //合計(アイテム)
int point; //得点
int level;
int Font,Font1;
unsigned int Cr, Cr2;
//初期化
void Init()
{
sum = 0;
point = 0;
basket.x = 320;
basket.y = 360;
level = 60;
count = 0;
Cr = GetColor(255, 255, 255);
Cr2 = GetColor(65, 183, 249);
}
//かご描画
void Graph_Basket() {
DrawGraph(basket.x, basket.y, imghandles.basket, TRUE);
}
//かご移動
void Operate_Basket() {
if (key[KEY_INPUT_LEFT] > 0)
basket.x -= 8;
if (key[KEY_INPUT_RIGHT] > 0)
basket.x += 8;
if (basket.x + CHIP * 2 > STAGE_WIDTH)
basket.x = STAGE_WIDTH - CHIP * 2;
if (basket.x < (CHIP / 2))
basket.x = (CHIP / 2);
}
//アイテム登録
void Item_Enter() {
int n = GetRand((NUM_MAX - 1)); //ランダムでアイテム選択
item[n].flag = 1; //アイテムの存在フラグを立てる
item[n].cnt = 0; //カウンタ初期化
item[n].speed = 4; //発射スピードを4に
item[n].angle = PI / 2; //角度は真下である90°
item[n].x = GetRand((STAGE_WIDTH - 20)); //x座標は0~620のランダムな値
item[n].y = 0; //y座標は0
}
//i番のアイテムがかごの中にあるか
//1:ある 0:ない
int Item_Basket_Exit(int i) {
//もしカゴの中にあれば
if (basket.x - 10 < item[i].x && item[i].x < basket.x + 84 && basket.y - 10 < item[i].y&&item[i].y < basket.y + 60) {
PlaySoundMem(sndhandles.hit, DX_PLAYTYPE_BACK);
sum += (i + 1);
Draw_Score();
return 1;
}
return 0;
}
//i番の弾幕が画面内にあるか
//1:画面外 0:画面内
int Item_Feeld_Exit(int i) {
//もし画面の中になければ
if (!(26 <= item[i].x && item[i].x <= 630 && 0 <= item[i].y && item[i].y <= 450))
return 1;
return 0;
}
//軌道(アイテム)計算
void Item_calc() {
int i;
if (count % level == 0)//levelカウントに一回(モニタが60Hz、60カウントは1秒)
Item_Enter();
for (i = 0; i < NUM_MAX; i++) {
if (item[i].flag == 1) {
item[i].x += cos(item[i].angle) * item[i].speed;//x成分計算
item[i].y += sin(item[i].angle) * item[i].speed;//y成分計算
if (Item_Basket_Exit(i) == 1)//かごの中にあるか?
item[i].flag = 0;//弾を消す
if (Item_Feeld_Exit(i) == 1)//画面の中にあるか?
item[i].flag = 0;//弾を消す
}
}
}
//アイテムの描画
void Graph_Item() {
int i;
for (i = 0; i < 500; i++) {
if (item[i].flag > 0) {
DrawRotaGraphF(item[i].x, item[i].y, 1.0f, item[i].angle - PI / 2, imghandles.item[i], TRUE);
//+PI/2は弾の向きを合わせるため
}
}
}
//
void Draw_Score() {
point++;
if (sum == 10) {
point += 10;
sum = 0;
if (level > 20)
level -= 10;
}
else if (sum > 10)
{
gamestate = GAME_OVER;
}
}
//各表示
void Draw_Display() {
DrawFormatStringToHandle(25, 30, Cr, Font, "%d", sum);
DrawFormatStringToHandle(480, 30, Cr2, Font, "%d", point);
}
//ゲームメイン関数
void DrawGameMain() {
Operate_Basket();
Item_calc();
Graph_Basket();
Graph_Item();
Draw_Display();
}
//ゲームタイトル描画
void DrawGameTitle() {
DrawGraph(0, 0, imghandles.title, FALSE);
Init();
if (CheckHitKey(KEY_INPUT_RETURN) == 1) {
gamestate = GAME_MAIN;
}
}
//ゲームオーバー描画
void DrawGameOver() {
DrawGraph(0, 0, imghandles.gameover, FALSE);
DrawFormatStringToHandle(260, 200, Cr2, Font1, "%d", point);
if (CheckHitKey(KEY_INPUT_SPACE) == 1) {
gamestate = GAME_TITLE;
}
}
//キーがどれ位押されたかを判定する関数
int GetHitKeyStateAll_2(int KeyStateBuf[]) {
char GetHitKeyStateAll_key[256];
GetHitKeyStateAll(GetHitKeyStateAll_key);
for (int i = 0; i < 256; i++) {
if (GetHitKeyStateAll_key[i] == 1) KeyStateBuf[i]++;
else KeyStateBuf[i] = 0;
}
return 0;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
//ウィンドウモードにする
ChangeWindowMode(TRUE);
//ウィンドウサイズを変更する
SetGraphMode(640, 480, 32);
SetBackgroundColor(255, 255, 255);
if (DxLib_Init() == -1 || SetDrawScreen(DX_SCREEN_BACK) != 0) return -1;//初期化と裏画面化
Load();
PlaySoundMem(sndhandles.back, DX_PLAYTYPE_LOOP);
Init();
Font = CreateFontToHandle("游ゴシック", 60, 6, DX_FONTTYPE_ANTIALIASING);
Font1 = CreateFontToHandle("游ゴシック", 72, 6, DX_FONTTYPE_ANTIALIASING);
while (ProcessMessage() == 0 && ClearDrawScreen() == 0 && GetHitKeyStateAll_2(key) == 0 && key[KEY_INPUT_ESCAPE] == 0) {
ClearDrawScreen();
switch (gamestate)
{
case GAME_TITLE:
DrawGameTitle();
break;
case GAME_MAIN:
DrawGraph(4,8,imghandles.boad,FALSE) ; // 四角形を描画
DrawGameMain();
count++;
break;
case GAME_OVER:
DrawGameOver();
break;
default:
break;
}
ScreenFlip();
}
DxLib_End();
return 0;
}
1> gamemain.cpp
1>c:\users\keisuke\documents\visual studio 2015\projects\....\gamemain.cpp(100): warning C4244: '引数': 'double' から 'float' への変換です。データが失われる可能性があります。
使用しているパソコンは今年の1月に購入しました。モニタが60HZ ではないという可能性もありますでしょうか。CPUはcore i7 6500U だった気がします。