質問が多いので1つだけ答えていただくだけでも結構です。
また解説と一緒にこのプログラムに合ったソースコードを載せてくれるとありがたいです。
質問は3つあって1つ目はゲーム背景を描画したいのですがどこにどのように入れたらいいか分かりません。 2つ目はHキーを押したらハイパーマンに切り替わるようにしたいのですが、押し続けないと画像がハイパーマンの状態になりません。
どうしたら一回で切り替わりますか?
if (CheckHitKey(KEY_INPUT_H) != 0)
{
DrawGraph(bx, by, LoadGraph("ハイパーマン.jpg"), TRUE); // バー絵画
}
画像ファイルは主人公が2倍の長さのときを”スーパーマン2.jpg”、1/2倍のときを”スーパーマン1/2.jpg”としています。
下記がソースコード全体です。
#include "DxLib.h"
#include "SceneMgr.h"
#include "Keyboard.h"
#include "Start.h"
#include "End.h"
typedef struct
{
int x; //ボールX座標
int y; //ボールY座標
int dx; //Xスピード
int dy; //Yスピード
int r; //円の直半径
int flag; //発射フラグ
}ch_t;
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) {
ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen(DX_SCREEN_BACK); //ウィンドウモード変更と初期化と裏画面設定
while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0) {//画面更新 & メッセージ処理 & 画面消去
Keyboard_Update(); //キーボードの更新
SceneMgr_Update(); //更新
SceneMgr_Draw(); //描画
if (CheckHitKey(KEY_INPUT_S) != 0 || CheckHitKey(KEY_INPUT_H) != 0)//SかHキーでループ回避
{
break;
}
}
ChangeWindowMode(TRUE);
DxLib_Init();
SetDrawScreen(DX_SCREEN_BACK);
ch_t ball;
ball.dx = 0;//ボールXスピード
ball.dy = 0;//ボールYスピード
ball.r = 5;//
ball.flag = 0;
int blocksum = 0; //壊したブロック合計
int blockflag[4][8], blockcolor[4][8];//ブロック表示のための配列
int bx = 270; //バーX座標
int by = 455; //バーY座標
int blong = 100; //バーの長さ
int color = GetColor(255, 255, 255); //ボールの色
char key[256]; //キー入力の配列
int ballmax = 0, wcount = 0, scount = 0; //ボール発射関係
ball.x = 320; //ボールX座標
ball.y = 450; //ボールY座標
int i, j; //for文用
//ブロックの色設定
for (i = 0; i<4; i++) {
for (j = 0; j<8; j++) {
blockcolor[i][j] = GetColor(GetRand(255), GetRand(255), GetRand(255));
}
}
//ブロック初期化 表示フラグを1に
for (i = 0; i<4; i++) {
for (j = 0; j<8; j++) {
blockflag[i][j] = 1;
}
}
while (ProcessMessage() != -1)
{
ClearDrawScreen();
GetHitKeyStateAll(key);
SetDrawBright(255, 255, 255);
if (key[KEY_INPUT_ESCAPE])
{
break;
}
// 発射
if (key[KEY_INPUT_SPACE] && scount == 0)
{
ball.flag = 1;
ball.dx = 7;
ball.dy = -7;
scount = 1;
wcount = 0;
}
// バー移動と発射前ボール移動
if (key[KEY_INPUT_RIGHT])
{
if (ball.flag == 0) ball.x += 8;
bx += 8;
}
if (key[KEY_INPUT_LEFT])
{
if (ball.flag == 0) ball.x -= 8;
bx -= 8;
}
// バー移動範囲と発射前ボール範囲
if (bx > 640 - blong)
{
if (ball.flag == 0) ball.x = 640 - blong / 2;
bx = 640 - blong;
}
if (bx < 0)
{
if (ball.flag == 0) ball.x = blong / 2;
bx = 0;
}
//特殊効果 Sキーでバーの長さを伸ばす
if (key[KEY_INPUT_S] == 1) DrawGraph(bx, by, LoadGraph("NEW主人公.png"), TRUE); // バー絵画;
//特殊効果 Aキーでバーの長さを短くする
if (key[KEY_INPUT_A] == 1) {
blong = 30;
bx = 280;
}
//特殊効果 Dキーでバーの長さを元に戻す
if (key[KEY_INPUT_D] == 1) blong = 100;
//特殊効果 ZとX同時押しでボール数リセット
if (key[KEY_INPUT_Z] == 1 && key[KEY_INPUT_X] == 1) {
ballmax = 0;
SetDrawBright(255, 255, 0);
}
// ボールの移動 壁との当たり判定
if (ball.flag == 1)
{
// 移動距離計算
ball.x += ball.dx;
ball.y += ball.dy;
// 移動範囲
if (ball.x < 5 || ball.x > 640 - 5)
{
ball.dx *= -1;
}
if (ball.y < 0)
{
ball.dy *= -1;
}
if (by <= ball.y && by + 10 >= ball.y && bx <= ball.x && bx + blong >= ball.x)
{
ball.dy *= -1;
}
}
//ブロックとの当たり判定
for (i = 0; i<4; i++) {
for (j = 0; j<8; j++) {
if (blockflag[i][j] == 1 && ball.y - 5 <= i * 30 + 30 && ball.y - 5 >= i * 30 && ball.x >= j * 82 && ball.x <= j * 82 + 64) {
blockflag[i][j] = 0;
ball.dy *= -1;
blocksum += 1;
}
}
}
//ボールが下に落ちた時
if (ball.y>480 && wcount == 0 && ballmax<3) {
ballmax += 1;
wcount = 1;
ball.flag = 0;
ball.y = 455;
ball.x = bx + blong / 2;
scount = 0;
}
if (ball.y>480 && wcount == 0 && ballmax == 3) ballmax += 1;
//ブロック絵画
for (i = 0; i<4; i++) {
for (j = 0; j<8; j++) {
if (blockflag[i][j] == 1) {
DrawBox(j * 82 + 5, i * 30 + 10, j * 82 + 64, i * 30 + 30, blockcolor[i][j], TRUE);
}
}
}
DrawGraph(bx, by, LoadGraph("スーパーマン.jpg"), TRUE); // バー絵画
if (CheckHitKey(KEY_INPUT_H) != 0)
{
DrawGraph(bx, by, LoadGraph("ハイパーマン.jpg"), TRUE); // バー絵画
}
//その他絵画
DrawCircle(ball.x, ball.y, ball.r, color, TRUE); // ボール絵画
if (ballmax <= 3)DrawFormatString(0, 460, color, "ボール残り%d", 3 - ballmax);//ボール残り数表示
if (ballmax == 4 && blocksum != 32)
{
DrawString(0, 460, "GAME OVER 続ける→Z+X 終了→Esc", color, TRUE);
}
if (blocksum == 32) {
ClearDrawScreen();
DrawString(250, 230, "ゲームクリア", color, TRUE);
}
ScreenFlip();
}
DxLib_End();
return 0;
}