跳ね返りができません。

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ハナブトオオトカゲ

跳ね返りができません。

#1

投稿記事 by ハナブトオオトカゲ » 15年前

#include "DxLib.h"

typedef struct{
int x,y,z,img,flag,down,up;
}ch_t;

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode( TRUE ) ; // ウインドウモードに変更
if( DxLib_Init() == -1 ) return -1; // DXライブラリ初期化処理 エラーが起きたら終了

ch_t ball;//構造体ball
ball.x=320;
ball.y=450;
ball.z=10;
ball.up=0;
ball.down=0;
int bx=270;//bx:バーのX座標
int bcolor; bcolor=GetColor(255,255,255);//バーの色の設定
char key[256];
SetDrawScreen( DX_SCREEN_BACK ) ;
int start=0;//発射確認
while(1){
if(ProcessMessage()==-1) break;
ClearDrawScreen();
GetHitKeyStateAll(key);
if(key[KEY_INPUT_SPACE]==1){
ball.flag=1;
}
if(key[KEY_INPUT_RIGHT]==1){ bx+=5; if(ball.flag==0) ball.x+=5;};//右キーでバーを右に+ボール操作
if(key[KEY_INPUT_LEFT]==1){ bx-=5; if(ball.flag==0) ball.x-=5;}//左キーでバーを左に+ボール操作
if(bx>540){ bx=540; if(ball.flag==0) ball.x=590;}
if(bx<0){ bx=0;if(ball.flag==0) ball.x=50;}
if(ball.flag==1){
if(ball.x==0&&ball.down==1&&ball.y>=5){
ball.x+=5;
ball.y-=5;
ball.up=0;
ball.down=1;
}

if(ball.x==640&&ball.down==0&&ball.y>=5){
ball.x-=5;
ball.y-=5;
ball.up=1;
ball.down=0;
}
if(ball.y<5&&ball.up==1){
ball.x-=5;
ball.y+=5;
ball.up=1;
ball.down=0;
}
else {
ball.x+=5;
ball.y-=5;
ball.up=1;
ball.down=0;
}
}
DrawBox(bx,460,bx+100,470,bcolor,TRUE);
DrawCircle(ball.x,ball.y,ball.z,bcolor,TRUE);
ScreenFlip();
}
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}

スペースでボール発射
ball.upはボールが上へ向かっている状態
ball.downはボールが下へ向かっている状態です。

どうしたらいいか教えてください。

ru

Re:跳ね返りができません。

#2

投稿記事 by ru » 15年前

見辛い
#include "DxLib.h" 

typedef struct
{ 
    int x;
    int y;
    int dx;
    int dy;
    int r;
    int flag;
}ch_t; 
  
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    ChangeWindowMode(TRUE);
    DxLib_Init();
    SetDrawScreen(DX_SCREEN_BACK);

    ch_t ball;
    ball.x = 320;
    ball.y = 450;
    ball.dx = 0;
    ball.dy = 0;
    ball.r = 10;
    ball.flag = 0;

    int bx = 270;
    int by = 460;
    int color = GetColor(255, 255, 255);
    char key[256];
    int start = 0;

    while(ProcessMessage() != -1)
    { 
        ClearDrawScreen();
        GetHitKeyStateAll(key);

        if(key[KEY_INPUT_ESCAPE])
        {
            break;
        }

        // 発射
        if(key[KEY_INPUT_SPACE])
        {
            ball.flag=1;
            ball.dx = 5;
            ball.dy = -5;
        }
        // バー移動
        if(key[KEY_INPUT_RIGHT])
        {
            bx += 5;
        }
        if(key[KEY_INPUT_LEFT])
        {
            bx -= 5;
        }
        // バー移動範囲
        if(bx > 540)
        {
            bx = 540;
        }
        if(bx < 0)
        {
            bx = 0;
        }
        // ボール
        if(ball.flag)
        {
            // 移動計算
            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 + 100 >= ball.x)
            {
                ball.dy *= -1;
            }
        }

        DrawBox(bx, by, bx + 100, by + 10, color, TRUE); // バー
        DrawCircle(ball.x, ball.y, ball.r, color, TRUE); // ボール

        ScreenFlip();
    }

    DxLib_End();
    return 0;
}

Tatu

Re:跳ね返りができません。

#3

投稿記事 by Tatu » 15年前

跳ね返りがうまくいかないと書かれていますが
ボールが何にもぶつかっていない状態では右上にしか
動かないようになっているみたいです。

そこで、ボールの構造体にx方向の速度、y方向の速度(または、速さと移動方向)
の変数を追加して、ボールの座標に速度を足して移動させるようにしたらどうでしょうか。

跳ね返りはボールが壁やバーにめり込み続けるような状態だったら速度を変更する
というようにすればよいでしょう。

あと、ブロック崩しのプログラムであるならば始めにそう書いておいた方がよいですよ。

ハナブトオオトカゲ

Re:跳ね返りができません。

#4

投稿記事 by ハナブトオオトカゲ » 15年前

速度の変数で移動すればいいのですね。

ありがとうございました。

ブロックなしのブロック崩しというのは書き忘れていました。

すみませんでした。

閉鎖

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