ウィンドウの点滅
Posted: 2011年7月19日(火) 18:37
プログラミング講座http://www.nhk.or.tv/kow/program/index.php
のテトリスの部分を一通んでみたので、参考にさせてもらい、というかほとんど同じように
テトリスのプログラムを組み立ててみました。GameMainという関数にすべての処理をまとめて、それだけをWinMainで
ループするよう組み立てたのですが、
実行してみるとゲームや何やらの前に、Windows\system32\cmd.exeというウィンドウが点滅して何も始まりません。
ゲーム以前の問題なのですが、参考にしたサイトが『APIを使わない』と書いてあったので
参考の仕方が間違っていたのかもしれません。
のテトリスの部分を一通んでみたので、参考にさせてもらい、というかほとんど同じように
テトリスのプログラムを組み立ててみました。GameMainという関数にすべての処理をまとめて、それだけをWinMainで
ループするよう組み立てたのですが、
実行してみるとゲームや何やらの前に、Windows\system32\cmd.exeというウィンドウが点滅して何も始まりません。
ゲーム以前の問題なのですが、参考にしたサイトが『APIを使わない』と書いてあったので
参考の仕方が間違っていたのかもしれません。
#include "DxLib.h"
#include <stdio.h>
#include <stdlib.h>
int Key[256];
int GetHitKeyStateAll_2(int GetHitKeyStateAll_InputKey[]){
char GetHitKeyStateAll_Key[256];
GetHitKeyStateAll( GetHitKeyStateAll_Key );
for(int i=0;i<256;i++){
if(GetHitKeyStateAll_Key[i]==1) GetHitKeyStateAll_InputKey[i]++;
else GetHitKeyStateAll_InputKey[i]=0;
}
return 0;
}
int MAP[21][12] = {0};
int Block[4][4] = {{0,0,0,0},
{0,1,1,0},
{0,1,1,0},
{0,0,0,0}};
int field[21][12] = {0};
//グローバル変数
int X=120, Y=0;
int time=0;
int gameover = 0;
//関数
void Initialize();
int CreateBlock();
void ShowGameField();
void MoveBlock(int, int);
int CheckOverlap(int, int);
void LockBlock();
//ブロック画像ロード
int block[8] = {
LoadGraph( "image/block1.png" ),//ブロック1~7+壁
LoadGraph( "image/block2.png" ),
LoadGraph( "image/block3.png" ),
LoadGraph( "image/block4.png" ),
LoadGraph( "image/block5.png" ),
LoadGraph( "image/block6.png" ),
LoadGraph( "image/block7.png" ),
LoadGraph( "image/block0.png" )};
//メインゲーム
int GameMain(){
int GetJoypadInputState( int InputType ) ;
time=0;//タイムの初期化
Initialize(); //ステージの初期化
while(!gameover) {//ゲームオーバーじゃない場合
if(time<=60 && gameover==0 ){//タイムを加算
time++;
}else{
//重なりがなければ移動
if(!CheckOverlap(X, Y+1)) {
MoveBlock(X, Y+1);
}
//重なりがあれば壁にする
else{
LockBlock();
CreateBlock();
ShowGameField();
}
time=0; //1秒ごとにタイムループ
}
}
return 0;
}
void Initialize()
{
int i, j; //forループ制御用変数
//画面と壁を初期設定
for(i = 0; i <= 20; i++) {
for(j = 0; j <= 11; j++) {
if((j == 0) || (j == 11) || (i == 20)) {
field[i][j] = MAP[i][j] = 9;
}
else {
field[i][j] = MAP[i][j] = 0;
}
}
}
CreateBlock(); //初期位置の設定
ShowGameField(); //ゲーム直後の画面を描画
}
int CreateBlock()
{
X=120, Y=0;//ブロックの初期位置
int i, j;
for(i = 0; i<4; i++) {
for(j = 0; j<4; j++) {
field[i][j+4] = MAP[i][j+4] + Block[i][j];
//初期位置に固定ブロックがあったらゲームオーバー
if(field[i][j+4] > 1) {
gameover = 1;
return 1;
}
}
}
return 0;
}
//画面表示
void ShowGameField()
{
//画面を一旦クリア
system("cls");
//マップ描画
for(int y=0;y<21;y++){
for(int x=0;x<12;x++){
if(MAP[y][x] != 0){
DrawGraph( x*20, y*20, block[MAP[y][x]-1], TRUE );
DrawGraph( x*20, y*20, block[Block[y][x]-1], TRUE );
}
}
}
if(gameover){ //ゲームオーバー処理
}
}
void MoveBlock(int x2, int y2)
{
int i, j; //forループ制御用変数
//今までのブロックを消して
for(i = 0; i<4; i++) {
for(j = 0; j<4; j++) {
field[Y+i][X+j] -= Block[i][j];
}
}
//ブロックの座標を更新
X = x2;
Y = y2;
//新しい座標でブロックを入れなおす
for(i = 0; i<4; i++) {
for(j = 0; j<4; j++) {
field[Y+i][X+j] += Block[i][j];
}
}
ShowGameField();
}
int CheckOverlap(int x2, int y2)
{
int i, j; //forループ制御用変数
//ブロックが向かう位置に固定ブロックもしくは壁があるかどうかを検査
for(i = 0; i<4; i++) {
for(j = 0; j<4; j++) {
if(Block[i][j]) {
if(MAP[y2 + i][x2 + j] != 0) {
return 1;
}
}
}
}
return 0;
}
void LockBlock()
{
int i, j; //forループ制御用変数
//ブロックを壁に加える
for(i = 0; i<21; i++) {
for(j = 0; j<12; j++) {
MAP[i][j] = field[i][j];
}
}
}
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ){
SetMainWindowText("テトリス");
ChangeWindowMode(TRUE);
SetGraphMode(560,420,32);
if( DxLib_Init() == -1 ) return -1;
SetDrawScreen( DX_SCREEN_BACK );
while(ProcessMessage()==0 && ClearDrawScreen()==0 && GetHitKeyStateAll_2(Key)==0 && Key[KEY_INPUT_ESCAPE]==0){
//↑メッセージ処理 ↑画面をクリア ↑入力状態を保存 ↑ESCが押されていない
GameMain();
ScreenFlip();
}
DxLib_End();
return 0;
}