はじめまして、私はシューティング好きですが、初心者・・・いわゆるド素人です。
現在は横スクロールシューティングを作っています。
もし自分のゲームを完成したらコミケ、コンテストなどに出展しようと思っています。
ゲームプログラミングの館(昔のほう)を見て自機の移動までできましたけど、
どうも自機の傾きのプログラムがわかりません・・・。
自機を傾かせるにはどうしたらよいのでしょうか・・・?
自機はドット絵はどんな感じか、私の描いた画像を添付します。
(すいません・・・掲示板は初めてなんでどういったらいいか・・・。)
横シューティングでの自機の傾き
Re:横シューティングでの自機の傾き
傾かせるというのは、例えば下キーを押した時は添付ファイルの右上の画像が表示されるとかそういうことですか?
下キーを押したときに画像を変えるのは解りますか?
そこが解るとなると、
下キー押しっぱなしで
画像1→画像2→画像3とアニメーションさせる方法が解らないということでしょうか?
下キーを押したときに画像を変えるのは解りますか?
そこが解るとなると、
下キー押しっぱなしで
画像1→画像2→画像3とアニメーションさせる方法が解らないということでしょうか?
Re:横シューティングでの自機の傾き
http://dixq.net/g/41.html
この章の内容は解りますか?
キーがどれ位押されたかが解ります。
これを使って例えば
下キーが押されていない時は画像1
下キーが押されてから20カウントまでは画像2
下キーがおされてから20カウント以上では画像3
を表示するようにしてみてはいかがでしょうか?
この章の内容は解りますか?
キーがどれ位押されたかが解ります。
これを使って例えば
下キーが押されていない時は画像1
下キーが押されてから20カウントまでは画像2
下キーがおされてから20カウント以上では画像3
を表示するようにしてみてはいかがでしょうか?
Re:横シューティングでの自機の傾き
こんな感じでどうでしょう。
コンパイルしてないので、うまくいくかどうか分かりませんが…
typedef struct rollstruct{
int min,max;
}rollstruct;
void RollShip()
{
rollstruct r[5]={
{-20,-15},
{-15,-5},
{-5,5},
{5,15},
{15,20}
};
if(CheckHitKey(KEY_INPUT_UP) && -21<roll) roll--;
if(CheckHitKey(KEY_INPUT_DOWN) && roll<20) roll++;
if(!CheckHitKey(KEY_INPUT_UP) && !CheckHitKey(KEY_INPUT_DOWN))
{
roll<0 ? roll--:roll++;
}
for(int i=0;i<5;i++)
{
if(r.min<=roll && roll<r.max)
{
switch(i)
{
//iの値によって異なるパターンを描画する
}
}
}
}
コンパイルしてないので、うまくいくかどうか分かりませんが…
typedef struct rollstruct{
int min,max;
}rollstruct;
void RollShip()
{
rollstruct r[5]={
{-20,-15},
{-15,-5},
{-5,5},
{5,15},
{15,20}
};
if(CheckHitKey(KEY_INPUT_UP) && -21<roll) roll--;
if(CheckHitKey(KEY_INPUT_DOWN) && roll<20) roll++;
if(!CheckHitKey(KEY_INPUT_UP) && !CheckHitKey(KEY_INPUT_DOWN))
{
roll<0 ? roll--:roll++;
}
for(int i=0;i<5;i++)
{
if(r.min<=roll && roll<r.max)
{
switch(i)
{
//iの値によって異なるパターンを描画する
}
}
}
}

Re:横シューティングでの自機の傾き
もう少し改良して、自分のパソコンで動かしてみました。
ship.pngというのは、保存した画像ファイル名です。
追記:ソースファイルとデータをアップロードしました。
自由に使ってください。
#include"DxLib.h"
int image;
typedef struct Player{
float x,y;
int width,height;
}Player;
typedef struct rollstruct{
int min,max;
}rollstruct;
typedef struct NewRect{
int x,y;
}NewRect;
Player Jiki;
void DrawAndMove()
{
static int roll=0;
int i;
rollstruct r[7]={
{-20,-15},
{-15,-10},
{-10,-5},
{-5,5},
{5,10},
{10,15},
{15,20}
};
NewRect N[7]={
{96,0},
{48,0},
{0,0},
{0,0},
{0,64},
{48,64},
{96,64}
};
if(CheckHitKey(KEY_INPUT_UP)) Jiki.y-=2;
if(CheckHitKey(KEY_INPUT_DOWN)) Jiki.y+=2;
if(CheckHitKey(KEY_INPUT_LEFT)) Jiki.x-=2;
if(CheckHitKey(KEY_INPUT_RIGHT)) Jiki.x+=2;
if(CheckHitKey(KEY_INPUT_UP) && -21<roll)
{
roll--;
if(roll<-20) roll=-20;
}
if(CheckHitKey(KEY_INPUT_DOWN) && roll<20) {
roll++;
if(roll>19) roll=19;
}
if(!CheckHitKey(KEY_INPUT_UP) && !CheckHitKey(KEY_INPUT_DOWN))
{
if(roll<0) roll++;
else if(0<roll)roll--;
}
for(i=0;i<7;i++)
{
if(r.min<=roll && roll<r.max)
{
DrawRectGraph(Jiki.x,Jiki.y,N[6-i].x,N[6-i].y,Jiki.width ,Jiki.height ,
image,TRUE,FALSE);
}
}
}
void Init()
{
image=LoadGraph("./Data/ship.png");
Jiki.width=48;
Jiki.height=35;
Jiki.x=(320-Jiki.width)/2;
Jiki.y=(240-Jiki.height)/2;
}
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hP,LPSTR lpC,int nC)
{
SetGraphMode(320,240,32);
ChangeWindowMode(TRUE) ;
SetMainWindowText("横シュー"); //ウィンドウのタイトル
if(DxLib_Init() == -1) return (-1); //DXライブラリ初期化
//データ読み込み中と表示する
DrawString( 0 , 0 , "データ読み込み中" , GetColor(255,255,255) );
//各種変数の初期化など
Init();
//乱数の初期化
srand((unsigned)GetTickCount());
//メインループ
while( ProcessMessage()==0 && CheckHitKey(KEY_INPUT_ESCAPE)==0){
ClearDrawScreen();
DrawAndMove();
ScreenFlip(); //フリップする
}
DxLib_End(); //DXライブラリ終了処理
return (0); //終了
}

ship.pngというのは、保存した画像ファイル名です。
追記:ソースファイルとデータをアップロードしました。
自由に使ってください。
#include"DxLib.h"
int image;
typedef struct Player{
float x,y;
int width,height;
}Player;
typedef struct rollstruct{
int min,max;
}rollstruct;
typedef struct NewRect{
int x,y;
}NewRect;
Player Jiki;
void DrawAndMove()
{
static int roll=0;
int i;
rollstruct r[7]={
{-20,-15},
{-15,-10},
{-10,-5},
{-5,5},
{5,10},
{10,15},
{15,20}
};
NewRect N[7]={
{96,0},
{48,0},
{0,0},
{0,0},
{0,64},
{48,64},
{96,64}
};
if(CheckHitKey(KEY_INPUT_UP)) Jiki.y-=2;
if(CheckHitKey(KEY_INPUT_DOWN)) Jiki.y+=2;
if(CheckHitKey(KEY_INPUT_LEFT)) Jiki.x-=2;
if(CheckHitKey(KEY_INPUT_RIGHT)) Jiki.x+=2;
if(CheckHitKey(KEY_INPUT_UP) && -21<roll)
{
roll--;
if(roll<-20) roll=-20;
}
if(CheckHitKey(KEY_INPUT_DOWN) && roll<20) {
roll++;
if(roll>19) roll=19;
}
if(!CheckHitKey(KEY_INPUT_UP) && !CheckHitKey(KEY_INPUT_DOWN))
{
if(roll<0) roll++;
else if(0<roll)roll--;
}
for(i=0;i<7;i++)
{
if(r.min<=roll && roll<r.max)
{
DrawRectGraph(Jiki.x,Jiki.y,N[6-i].x,N[6-i].y,Jiki.width ,Jiki.height ,
image,TRUE,FALSE);
}
}
}
void Init()
{
image=LoadGraph("./Data/ship.png");
Jiki.width=48;
Jiki.height=35;
Jiki.x=(320-Jiki.width)/2;
Jiki.y=(240-Jiki.height)/2;
}
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hP,LPSTR lpC,int nC)
{
SetGraphMode(320,240,32);
ChangeWindowMode(TRUE) ;
SetMainWindowText("横シュー"); //ウィンドウのタイトル
if(DxLib_Init() == -1) return (-1); //DXライブラリ初期化
//データ読み込み中と表示する
DrawString( 0 , 0 , "データ読み込み中" , GetColor(255,255,255) );
//各種変数の初期化など
Init();
//乱数の初期化
srand((unsigned)GetTickCount());
//メインループ
while( ProcessMessage()==0 && CheckHitKey(KEY_INPUT_ESCAPE)==0){
ClearDrawScreen();
DrawAndMove();
ScreenFlip(); //フリップする
}
DxLib_End(); //DXライブラリ終了処理
return (0); //終了
}

Re:横シューティングでの自機の傾き
ところで、この画像のドット絵はどうやって描いたんですか?
Edgeで読み込もうとしたら、256色以上になってたみたいなので、
減色ソフトで256色に減色しました。
GIMPかフォトショップか何かでドット絵を描いたんですか?
Edgeで読み込もうとしたら、256色以上になってたみたいなので、
減色ソフトで256色に減色しました。
GIMPかフォトショップか何かでドット絵を描いたんですか?
Re:横シューティングでの自機の傾き
Edgeやフォトショップ以外で、
GraphicsGale Free editionというツールで描きました。
私はそのツールでしか慣れていないです。
GraphicsGale Free editionというツールで描きました。
私はそのツールでしか慣れていないです。
Re:横シューティングでの自機の傾き
TKOZさん、
ソースまでもありがとうございます!
自機を傾かせるのにどれだけ悩んだのやら・・・
後に何かあったらまた掲示板に知らせます。
また、雑談でもかまいませんが
今後ともよろしくお願いいたします!
ソースまでもありがとうございます!
自機を傾かせるのにどれだけ悩んだのやら・・・
後に何かあったらまた掲示板に知らせます。
また、雑談でもかまいませんが
今後ともよろしくお願いいたします!