ここから本文です

C++のプログラムです。カメラを使ってゲームを作ろうとしています。

kho********さん

2017/10/2213:21:56

C++のプログラムです。カメラを使ってゲームを作ろうとしています。

#pragma once
#include <tchar.h>
#include <windows.h>
#define D3D_DEBUG_INFO
#include <stdlib.h>
#include <math.h>
#include <d3dx9.h>
#include <XAudio2.h>
#include <vector>
#include <list>
#include <random>
#include <time.h>
#include "../include/WindowManager.h"
#include "../include/ars.h"
#include "touchable.h"
#include "arstest.h"
using namespace std;

void subtract_mask(Texture* result, Texture* bg, Texture* src, DWORD border);

UINT MainLoop(WindowManager *winmgr)
{
int rd[9];
int rd2[21];
//winmgr->RegisterWindow(&window2);

int a = 0;
int b = 0;

for (float i = -8.0; i <= 8.0; i += 2)
{
rd[a] = i;
a++;
}

for (float j = 5.0; j <= 85.0; j+=4)
{
rd2[b] = j;
b++;
}

ShowDebugWindow();

Window window;
winmgr->RegisterWindow(&window);

ARSG g(window.hWnd, sizex, sizey, true);
g.SetBackgroundColor(255,0,0,0);

Light light(&g);
g.Register(&light);

ARSD d;
d.Init();
d.AttachCam(0);
d.StartGraph();

Texture hitArea(&g,sizex,sizey);
Texture stored (&g,sizex,sizey);
Texture source (&g,sizex,sizey);

source.SetDrawMode(TRUE);
g.Register(&source);

srand((unsigned)time(NULL));

Plate face1(&g, L"bakudan.png");
face1.SetScale(3.0f, 3.0f, 3.5f);
face1.SetPosition(rd[rand() % 9], rd2[rand() % 21], 0.0f, GL_ABSOLUTE);
g.Register(&face1);

InputHandler *keyIn = window.GetInputHandler();

while(!d.GetCamImage(&stored));

while (!winmgr->WaitingForTermination()){
if (keyIn->GetKeyTrig('A'))
d.GetCamImage(&stored);
d.GetCamImage(&source);
if (keyIn->GetKeyTrig('Q')) break;

subtract_mask(&hitArea,&stored,&source,0x20202020);

Touchable::update(&hitArea, 100);

face1.move();

g.Draw();

}
d.StopGraph();
return 0;
}

inline void subtract_mask(Texture* result, Texture* backgrnd, Texture* src, DWORD border)
{
ARSC::diff(result,backgrnd,src,border);
ARSC::monochrome(result,result);
ARSC::thresholding(result,result,border);
}

void Plate::onTouch(Event* e)
{
VECTOR2D c = getPosition2D();
}

void Plate::move()
{
VECTOR2D c = getPosition2D();

//枠の反射
bool side = c.x < 0 || c.x > sizex;
bool ground = c.y > sizey - 50 && vy < 0;

if (!onframe_x && side){
/*vx *= -1.0f;
onframe_x = true;*/
}

else if (onframe_x && !side){ onframe_x = false; }

if (!onframe_y && ground){
//vy *= -1.0f;
onframe_y = true;
}

else if (onframe_y && !ground){ onframe_y = false; }

//自由落下または停止

if (c.y > sizey - 50 && vy < 0.03f){
vy = -1.5f;
}
else
vy = -1.5f;

//空気抵抗
vx *= 0.8f;
SetPosition(vx, vy, 0.0f, GL_RELATIVE);
}

int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
{
WindowManager program(hInstance, &MainLoop);
#ifdef DEBUG
MessageBox(NULL,L"OK?",TEXT(APPNAME), NULL);
#endif
return 0;
}

このbakudanという画像を枠の上から落としてそれを下の枠から出たらもう一度上から降らせたくていろいろやってみたのですが、全くわかりません。おそらく最後の方の
if (c.y > sizey - 50 && vy < 0.03f){
vy = -1.5f;
}
これが枠から出た時の条件なのでここに何かを書くのだとは思いますがわかりません。わかる方は詳しいソースコード(ここをこう変えてやればいい)を教えてください。よろしくお願いいたします。また、何かあればご質問ください。

閲覧数:
36
回答数:
2
お礼:
250枚

違反報告

ベストアンサーに選ばれた回答

2017/10/2214:19:55

MainLoop内で初期位置を決めている

face1.SetPosition(rd[rand() % 9], rd2[rand() % 21], 0.0f, GL_ABSOLUTE);

こいつと同じことを、「下に届いた」条件になったらやればいいんじゃないの?

  • 2017/10/2214:22:25

    vxとかvyも再初期化がいるかも。質問に書いてある範囲ではわからないけど。

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

質問した人からのコメント

2017/10/24 14:10:54

できませんでしたが、ご協力ありがとうございました。

ベストアンサー以外の回答

1〜1件/1件中

min********さん

2017/10/2213:32:43

マイナスをプラスにしたら、行けるかと
下に落とす条件にすればなるかと

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

この質問につけられたタグ

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる