DxLibで苦戦中です

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
JJJuto
記事: 29
登録日時: 3年前

DxLibで苦戦中です

#1

投稿記事 by JJJuto » 3年前

現在、DxLibでモグラたたき風ゲームを作成中です。普通のモグラたたきはなんとか完成したのですが、少々改造しようとしているのですが、苦戦中です。
改造したいこととしては、敵であるモグラ(今回はゴーストとしています)をただ配置するのではなく、動かしたいなと思っています。

コード:

#define GHOST_NUM 10

#include"DxLib.h"
#include<stdlib.h>
#include<time.h>

struct Ghost{
	int x;
	int y;
	int r;
	int hit;
	int width;
	int height;
};

int WINAPI WinMain(HINSTANCE hI, HINSTANCE hP, LPSTR lpC, int nC)
{
	const int n = GHOST_NUM;
	struct Ghost enermy[GHOST_NUM], player;
	
	
	for (i = 0; i < n; i++) {
		enermy[i].x = rand() % 640;
		enermy[i].y = rand() % 480;
		enermy[i].r = 30;
		enermy[i].hit = 0;
		enermy[i].width = 80;
		enermy[i].height = 40;
	}
	
	player.r = 55;
	player.width = 100;
	player.height = 110;
	
	GetMousePoint(&player.x, &player.y);
		mouseInput = GetMouseInput();

		//左クリック当たり判定
		if ((mouseInput & MOUSE_INPUT_LEFT) != 0) {
			for (i = 0; i < n; i++) {
				if (enermy[i].hit == 0) {
					d[0] = player.r + enermy[i].r;
					d[1] = player.x - enermy[i].x;
					d[2] = player.y - enermy[i].y;

					if (d[0] * d[0] >= d[1] * d[1] + d[2] * d[2]) {
						enermy[i].hit = 1;
						count++;
						PlaySoundMem(hitSound, DX_PLAYTYPE_BACK);
					}
				}
			}
			
			DrawGraph(0, 0, backImg, FALSE);
		for (ghostX = 0; ghostX < 640; ghostX+=2) {
			ClearDrawScreen();
		for (i = 0; i < n; i++) {
			
				if (enermy[i].hit == 0) {
					
					DrawRotaGraph(ghostX, enermy[i].y - enermy[i].height / 2, 0.15, 0.15, ghostImg, TRUE);
					//※1
				}
			}
		}
		DrawRotaGraph(player.x - player.width / 2, player.y - player.height / 2,0.1,0.1, sword, TRUE);
		
		
長くなってしまうため、ある程度省略しつつ書きました。
今の状態だと、ゴーストがすでに動き終わった状態での表示になり、また当たり判定も本来ゴーストが配置されていたであろう場所に残ってしまいます。
※1のところにScreenFilpかなと思っていれてみたのですが、すると背景が消えてしまうので、今は消している状態です。

背景の上をゴーストが移動し、当たり判定も同時に動くようにするには、どうしたら良いですか?

Meta3

Re: DxLibで苦戦中です

#2

投稿記事 by Meta3 » 3年前

ScreenFlip(); を使ったダブルバファリングの表示の基本はわかりますか

Meta3

Re: DxLibで苦戦中です

#3

投稿記事 by Meta3 » 3年前

ここの
https://dixq.net/g/ 
1.9章までをご覧ください

JJJuto
記事: 29
登録日時: 3年前

Re: DxLibで苦戦中です

#4

投稿記事 by JJJuto » 3年前

完璧に理解はできていません。申し訳ないです。
今回書いた上記のソースは、提示していただいたサイトを読みつつ書いたものです。ですが、まだDxLibを勉強中のため、わからず行き詰まってしまいました。

Meta3

Re: DxLibで苦戦中です

#5

投稿記事 by Meta3 » 3年前

https://dxlib.xsrv.jp/dxlecture_main.html

ダブルバッファリング
https://dxlib.xsrv.jp/lecture/lecture3.html
裏画面に背景、キャラクタと静止画を描き 表画面に切り替える(ScreenFlip();)
を1秒60回とか繰り返せば動いて見える
その間に当たり判定もリアクションも出来る

JJJuto
記事: 29
登録日時: 3年前

Re: DxLibで苦戦中です

#6

投稿記事 by JJJuto » 3年前

ご丁寧にありがとうございます。少し改造して

コード:

	for (i = 0; i < n; i++) {
			ClearDrawScreen();
			DrawGraph(0, 0, backImg, FALSE);
				if (enermy[i].hit == 0) {	
					DrawRotaGraph(ghostX, enermy[i].y - enermy[i].height / 2, 0.15, 0.15, ghostImg, TRUE);
					ghostX = ghostX + 2;
				}
				DrawRotaGraph(player.x - player.width / 2, player.y - player.height / 2,0.1,0.1, sword, TRUE);
		ScreenFlip();
		WaitTimer(60);
			}
という形にしました。当たり判定の部分も自分なりに改造して、動く画像に合わせることができました。
ただ、上記のソースでは、まだ画像がちらつきます。どこを直せば良いでしょうか?

アバター
あたっしゅ
記事: 663
登録日時: 13年前
住所: 東京23区
連絡を取る:

Re: DxLibで苦戦中です

#7

投稿記事 by あたっしゅ » 3年前

東上☆海美☆「骨格を入れてみたみみ」

コード:

    // 前処理を略
    
    // DXライブラリ初期化処理
    if( DxLib_Init() == -1 ) return -1 ;

    // 変数初期化等を略

    // 描画先を裏画面にする
    SetDrawScreen( DX_SCREEN_BACK ) ;
    while( ProcessMessage()==0 && ClearDrawScreen()==0 ) {
	// ESCキーが押されたらループから抜ける
	if( CheckHitKey( KEY_INPUT_ESCAPE ) == 1 ) break;

	for (i = 0; i < n; i++) {
		DrawGraph(0, 0, backImg, FALSE);
		if (enermy[ i ].hit == 0) {	
			DrawRotaGraph(ghostX, enermy[ i ].y - enermy[ i ].height / 2, 0.15, 0.15, ghostImg, TRUE);
			ghostX = ghostX + 2;
		}
	}
	DrawRotaGraph(player.x - player.width / 2, player.y - player.height / 2,0.1,0.1, sword, TRUE);

	ScreenFlip();
	WaitTimer(60);
    }
    
    // 後処理を略
VTuber:
東上☆海美☆(とうじょう・うみみ)
http://atassyu.php.xdomain.jp/vtuber/index.html
レスがついていないものを優先して、レスするみみ。時々、見当外れなレスしみみ。

中の人:
手提鞄あたッしュ、[MrAtassyu] 手提鞄屋魚有店
http://ameblo.jp/mratassyu/
Pixiv: 666303
Windows, Mac, Linux, Haiku, Raspbery Pi, Jetson Nano, 電子ブロック 持ち。

返信

“C言語何でも質問掲示板” へ戻る