環境: VisualStudio 2015 Express,DXライブラリ,C++
現在、アイテム(数字)の落下、それをキャッチ、まで作りました。
まず現在の課題を先に説明しますと、
1: ステージの下端まで落下せずに途中で消えてしまうアイテム(数字)(ランダム)がある。
2: キャッチしたアイテム(数字)の合計が、1~10はそのまま合計に加算されていくが、-1 〜-5 をキャッチすると+10加算されてしま う.
以上の課題はどのように修正すればいいでしょうか。
プログラミング歴は1年ほどで、未熟者です。高校生です。
手元に参考書がありますが、よくわからないので質問させていただきました。
ソースは以下のようです。
//gamemain.cpp
#include "gamemain.h"
#include "loading.h"
#include <math.h>
int count;
int sum = 0;
int Key[STRN];//キーデータ
void GAME_MAIN() {
Operate_Basket();
Item_calc();
Graph_Basket();
Graph_Item();
}
//初期化
void Init() {
basket.x = 320;
basket.y = 360;
count = 0;
}
//キャラ描画
void Graph_Basket() {
DrawGraph(basket.x, basket.y, imghandles.basket_img, TRUE);
}
//キャラクタ移動
void Operate_Basket() {
if (Key[KEY_INPUT_LEFT] > 0)//左キーが押されていたら
basket.x -= 4;//左へ4移動
if (Key[KEY_INPUT_RIGHT] > 0)//右キーが押されていたら
basket.x += 4;//右へ4移動
if (basket.x + Pixel * 2 > STAGE_WIDTH)
basket.x = STAGE_WIDTH - Pixel * 2;
if (basket.x < (Pixel / 2))
basket.x = (Pixel / 2);
}
//アイテム登録
void Item_Enter() {
int n = GetRand(NUM_MAX - 1);
item[n].flag = 1; //アイテムの存在フラグを立てる
item[n].cnt = 0; //カウンタ初期化
item[n].speed = 2; //発射スピードを2に
item[n].angle = PI / 2; //角度は真下である90°
item[n].x = GetRand(630); //x座標は0~640のランダムな値
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);
Point(i);
return 1;
}
return 0;
}
//i番の弾幕が画面内にあるかどうかを判定する関数。
//1:画面外 0:画面内
int Item_Feeld_Exit(int i) {
//もし画面の中になければ
if (!(15 <= item[i].x && item[i].x <= 630 && 0 <= item[i].y && item[i].y <= 445))
return 1;
return 0;
}
//アイテム(軌道)計算
void Item_calc() {
int i;
if (count % 30 == 0)//30カウントに一回(モニタが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 < NUM_MAX; i++) {
if (item[i].flag > 0) {
DrawRotaGraphF(item[i].x, item[i].y, 1.0f, item[i].angle - PI / 2, imghandles.item_img[i], TRUE);
//+PI/2は弾の向きを合わせるため
}
}
}
//キーがどれ位押されたかを判定する関数
//渡されたKeyStateBufにはキーの押されたカウンタ数が入る
int GetHitKeyStateAll_2(int KeyStateBuf[]) {
char GetHitKeyStateAll_Key[STRN];
GetHitKeyStateAll(GetHitKeyStateAll_Key);
for (int i = 0; i < STRN; i++) {
if (GetHitKeyStateAll_Key[i] == 1) KeyStateBuf[i]++;
else KeyStateBuf[i] = 0;
}
return 0;
}
void Point(int k) {
if (k == 10)sum -= 1;
if (k == 11)sum -= 2;
if (k == 12)sum -= 3;
if (k == 13)sum -= 4;
if (k == 14)sum -= 5;
else sum += (k+1);
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
unsigned int Cr;
Cr = GetColor(0, 0, 255);
SetBackgroundColor(255, 255, 255);
if (DxLib_Init() == -1 || SetDrawScreen(DX_SCREEN_BACK) != 0) return -1;//初期化と裏画面化
Load();//データロード
Init();//初期化
while (ProcessMessage() == 0 && ClearDrawScreen() == 0 && GetHitKeyStateAll_2(Key) == 0 && Key[KEY_INPUT_ESCAPE] == 0) {
GAME_MAIN();
DrawFormatString(0, 0, Cr, " %d ", sum);
count++;
ScreenFlip();//裏画面反映関数
}
DxLib_End();//DXライブラリ終了処理
return 0;
}
#ifndef __GAMEMAIN_H__
#define __GAMEMAIN_H__
#include <DxLib.h>
#define Pixel 32 //ピクセルサイズ
#define STAGE_WIDTH 640 // ステージの幅
#define STAGE_HEIGHT 480 // ステージの高さ
#define NUM_MAX 15 //アイテム総数
#define PI 3.141592653589793 //円周率
#define STRN 256 //キーボード
//データ(かご)構造体
struct Basket_Data {
int x, y;
};
Basket_Data basket;
//データ(アイテム)構造体
struct Item_Data {
int flag;//フラグ
int cnt;//
double x, y;
double angle;//角度
double speed;//速さ
};
Item_Data item[NUM_MAX];
void Operate_Basket();
void Item_calc();
void Graph_Basket();
void Graph_Item();
void Point(int k);
#endif
#pragma once
#include"loading.h"
Img_Data imghandles;
Snd_Data sndhandles;
BOOL Load() {
if ((imghandles.basket_img = LoadGraph("media\\basket.png")) == -1) return FALSE;
if ((imghandles.item_img[0] = LoadGraph("media\\num_1.png")) == -1) return FALSE;
if ((imghandles.item_img[1] = LoadGraph("media\\num_2.png")) == -1) return FALSE;
if ((imghandles.item_img[2] = LoadGraph("media\\num_3.png")) == -1) return FALSE;
if ((imghandles.item_img[3] = LoadGraph("media\\num_4.png")) == -1) return FALSE;
if ((imghandles.item_img[4] = LoadGraph("media\\num_5.png")) == -1) return FALSE;
if ((imghandles.item_img[5] = LoadGraph("media\\num_6.png")) == -1) return FALSE;
if ((imghandles.item_img[6] = LoadGraph("media\\num_7.png")) == -1) return FALSE;
if ((imghandles.item_img[7] = LoadGraph("media\\num_8.png")) == -1) return FALSE;
if ((imghandles.item_img[8] = LoadGraph("media\\num_9.png")) == -1) return FALSE;
if ((imghandles.item_img[9] = LoadGraph("media\\num_10.png")) == -1) return FALSE;
if ((imghandles.item_img[10] = LoadGraph("media\\num_-1.png")) == -1) return FALSE;
if ((imghandles.item_img[11] = LoadGraph("media\\num_-2.png")) == -1) return FALSE;
if ((imghandles.item_img[12] = LoadGraph("media\\num_-3.png")) == -1) return FALSE;
if ((imghandles.item_img[13] = LoadGraph("media\\num_-4.png")) == -1) return FALSE;
if ((imghandles.item_img[14] = LoadGraph("media\\num_-5.png")) == -1) return FALSE;
sndhandles.hit = LoadSoundMem("media\\hit.mp3");
if (sndhandles.hit == -1) return FALSE;
return TRUE;
}