龍神録プログラミングの館を利用しています。
自分は
1自機を動かす
2敵を動かす(表示させる)
3敵に弾を撃たせる(当たり判定なし)
の部分だけをとりあえず作りたくて書いていたのですが、動かそうとすると
「 0xC0000005: 場所 0x00000014 を読み込み中にアクセス違反が発生しました。」
と出てきて何も表示されないwindowだけがでてきて止まってしまいます。
以下にコードを
キー入力について
#include"DxLib.h"
#include"keyboard.h"
int m_key[256];
void keypush(){
char tipkey[256];
GetHitKeyStateAll(tipkey);
for(int i=0;i<256;i++){
if(tipkey[i]==1){m_key[i]++;}
else{m_key[i]=0;}
}
}
int keyout(int keyname){
return m_key[keyname];
}
#ifndef PLAYER
#define PLAYER
struct player{
int img;
double x,y;
};
void player_initialize();
void player_update();
void player_draw();
void player_finalize();
#endif
#include "DxLib.h"
#include"player.h"
#include"keyboard.h"
#include"enemy.h"
#define PI 3.14159265
struct player player;
void player_initialize(){
memset(&player,0,sizeof(player));
player.img=LoadGraph("画像/キャラクタ01.png");
player.x=200;
player.y=200;
}
void player_update(){
forshot(player.x,player.y);
if(keyout(KEY_INPUT_UP)>=1){
if(keyout(KEY_INPUT_LSHIFT)>0){
player.y-=2;
}else{
player.y-=4;
}
}
if(keyout(KEY_INPUT_DOWN)>=1){
if(keyout(KEY_INPUT_LSHIFT)>0){
player.y+=2;
}else{
player.y+=4;
}
}
if(keyout(KEY_INPUT_RIGHT)>=1){
if(keyout(KEY_INPUT_LSHIFT)>0){
player.x+=2;
}else{
player.x+=4;
}
}
if(keyout(KEY_INPUT_LEFT)>=1){
if(keyout(KEY_INPUT_LSHIFT)>0){
player.x-=2;
}else{
player.x-=4;
}
}
}
void player_draw(){
DrawRotaGraphF((float)player.x,(float)player.y,1.0,0.0,player.img,TRUE);
}
void player_finalize(){
DeleteGraph(player.img);
}
#ifndef ENEMY
#define ENEMY
struct enemy{
int flag,
count,
pattern,
muki,
kind,
hp,
maxhp,
img;
double x,
y,
vx,
vy,
speed,
angle;
int bltime,
blkind,
blkind2,
color,
state,
wtime,
wait;
};
struct enemyorder{
int count,
pattern,
kind;
double x,
y,
speed;
int bltime,
blkind,
color,
hp,
blkind2,
wait;
};
struct enemybullet{
int flag,
kind,
count,
color,
state,
till,
eff;
double x,
y,
angle,
speed,
baseangle[1],
remspeed[1];
};
struct enemyshot{
int flag,
kind,
count,
num;
double baseangle[1],
basespeed[1];
enemybullet bullet[1000];
};
void enemyinitialize();
void enemypattern(int i);
void enemyenter();
void enemyact();
void enemygraph();
void enemymain();
void shotinitialize();
void forshot(double x,double y);
double shotatan2(int n);
int shot_search(int n);
void shot_main();
void entershot(int i);
void graph_bullet();
void shot_calc(int n);
int enemy_num_search();
void load_story();
#endif
#include"DxLib.h"
#include"enemy.h"
#include"player.h"
#include"math.h"
#define MAXENEMY 10
#define MAXSHOT 30
#define MAXKINDSHOT 1
#define MAXBULLET 1000
#define MAXSE 100
#define PI 3.14159265
#define MAXENEMYORDER 500
int stagecount;
int enemyimg;
struct enemy enemy[MAXENEMY];
int bulletimg[3][3];
int soundse[MAXSE];
int seflag[MAXSE];
struct enemyshot enemyshot[MAXSHOT];
double playerx,
playery;
struct enemyorder enemyorder[MAXENEMYORDER];
extern void shot_bullet_H000(int);
extern void shot_calc();
void shotinitialize(){
for(int j=0;j<MAXSHOT-1;j++){
memset(&enemyshot[j],0,sizeof(enemyshot));
}
for(int i=0;i<3;i++){
for(int j=0;j<3;j++){
bulletimg[i][j]=LoadGraph("画像/弾00.png");
}
}
}
void (*shot_bullet[MAXKINDSHOT])(int) ={
shot_bullet_H000,
};
void shot_bullet_H000(int n){
int k;
if(enemyshot[n].count==0){
if(enemyshot[n].flag!=2 && (k=shot_search(n))!=-1){
enemyshot[n].bullet[k].kind=enemy[enemyshot[n].num].blkind2;
enemyshot[n].bullet[k].angle=shotatan2(n);
enemyshot[n].bullet[k].flag=1;
enemyshot[n].bullet[k].x=enemy[enemyshot[n].num].x;
enemyshot[n].bullet[k].y=enemy[enemyshot[n].num].y;
enemyshot[n].bullet[k].color=enemy[enemyshot[n].num].color;
enemyshot[n].bullet[k].count=0;
enemyshot[n].bullet[k].speed=3;
seflag[0]=1;
}
}
}
void forshot(double x,double y){
playerx=x;
playery=y;
}
double shotatan2(int n){
return atan2(playery-enemy[enemyshot[n].num].y,playerx-enemy[enemyshot[n].num].x);
}
int shot_search(int n){
int i;
for(i=0;i<1000;i++){
if(enemyshot[n].bullet[i].flag==0){
return i;
}
}
return -1;
}
void shot_main(){
for(int i=0;i<30;i++){
if(enemyshot[i].flag!=0 && 0<=enemyshot[i].kind && enemyshot[i].kind<MAXKINDSHOT){
shot_bullet[enemyshot[i].kind](i);
shot_calc(i);
enemyshot[i].count++;
}
}
}
void entershot(int i){
for(int j=0;j<MAXSHOT;j++){
if(enemyshot[j].flag==0){
memset(&enemyshot[i],0,sizeof(enemyshot));
enemyshot[j].flag=1;
enemyshot[j].kind=enemy[i].blkind;
enemyshot[i].num=i;
return;
}
}
}
void graph_bullet(){
int i,j;
SetDrawMode( DX_DRAWMODE_BILINEAR ) ;
for(i=0;i<MAXSHOT;i++){
if(enemyshot[i].flag>0){
for(j=0;j<MAXBULLET;j++){
if(enemyshot[i].bullet[j].flag!=0){
if(enemyshot[i].bullet[j].eff==1){
SetDrawBlendMode( DX_BLENDMODE_ADD, 255) ;
}
DrawRotaGraphF(
(float)enemyshot[i].bullet[j].x, (float)enemyshot[i].bullet[j].y,
1.0, enemyshot[i].bullet[j].angle+PI/2,
bulletimg[enemyshot[i].bullet[j].kind][enemyshot[i].bullet[j].color],TRUE);
if(enemyshot[i].bullet[j].eff==1){
SetDrawBlendMode( DX_BLENDMODE_NOBLEND, 0) ;
}
}
}
}
}
SetDrawMode(DX_DRAWMODE_NEAREST);
}
void shot_calc(int n){
int i,max=0;
if(enemy[enemyshot[n].num].flag!=1)
enemyshot[n].flag=2;
for(i=0;i<MAXBULLET;i++){
if(enemyshot[n].bullet[i].flag>0){
enemyshot[n].bullet[i].x+=cos(enemyshot[n].bullet[i].angle)*enemyshot[n].bullet[i].speed;
enemyshot[n].bullet[i].y+=sin(enemyshot[n].bullet[i].angle)*enemyshot[n].bullet[i].speed;
enemyshot[n].bullet[i].count++;
if(enemyshot[n].bullet[i].x<-50 || enemyshot[n].bullet[i].x>640+50 ||
enemyshot[n].bullet[i].y<-50 || enemyshot[n].bullet[i].y>530){
if(enemyshot[n].bullet[i].till<enemyshot[n].bullet[i].count)
enemyshot[n].bullet[i].flag=0;
}
}
}
for(i=0;i<MAXBULLET;i++)
if(enemyshot[n].bullet[i].flag>0)
return;
if(enemy[enemyshot[n].num].flag!=1){
enemyshot[n].flag=0;
enemy[enemyshot[n].num].flag=0;
}
}
extern void load_story();
void enemyinitialize(){
stagecount=1;
for(int j=0;j<MAXENEMY-1;j++){
memset(&enemy[j],0,sizeof(enemy));
}
for(int i=0;i<MAXENEMY;i++){
enemy[i].img=LoadGraph("画像/弾00.png");
}
load_story();
}
void load_story(){
int n=0,num=0,fp;
int input[64];
char inputc[64];
fp = FileRead_open("enemydata/storyH0.csv");
if(fp == NULL){
printfDx("read error\n");
return;
}
for(int i=0;i<2;i++){
while(FileRead_getc(fp)!='\n');
}
while(1){
for(int i=0;i<64;i++){
inputc[i]=input[i]=FileRead_getc(fp);
if(inputc[i]=='/'){
while(FileRead_getc(fp)!='\n');
i=-1;
continue;
}
if(input[i]==',' || input[i]=='\n'){
inputc[i]='\0';
break;
}
if(input[i]==EOF){
goto EXFILE;
}
}
switch(num){
case 0: enemyorder[n].count =atoi(inputc);break;
case 1: enemyorder[n].pattern =atoi(inputc);break;
case 2: enemyorder[n].kind =atoi(inputc);break;
case 3: enemyorder[n].x =atof(inputc);break;
case 4: enemyorder[n].y =atof(inputc);break;
case 5: enemyorder[n].speed =atof(inputc);break;
case 6: enemyorder[n].bltime =atoi(inputc);break;
case 7: enemyorder[n].blkind =atoi(inputc);break;
case 8: enemyorder[n].color =atoi(inputc);break;
case 9: enemyorder[n].hp =atoi(inputc);break;
case 10:enemyorder[n].blkind2 =atoi(inputc);break;
case 11:enemyorder[n].wait =atoi(inputc);break;
}
num++;
if(num==12){
num=0;
n++;
}
}
EXFILE:
FileRead_close(fp);
}
void enemypattern(int i){
if(enemy[i].count==0){
enemy[i].vx=2.0;
}
if(enemy[i].count==60){
enemy[i].vx=0;
}
if(enemy[i].count==60+enemy[i].wait){
enemy[i].vx=-2.0;
}
}
int enemy_num_search(){
for(int i=0;i<MAXENEMY;i++){
if(enemy[i].flag==0){
return i;
}
}
return -1;
}
void enemyenter(){
int i,t;
for(t=0;t<MAXENEMYORDER;t++){
if(enemyorder[t].count==stagecount){
if((i=enemy_num_search())!=-1){
enemy[i].flag =1;
enemy[i].count =0;
enemy[i].pattern=enemyorder[t].pattern;
enemy[i].muki =1;
enemy[i].kind =enemyorder[t].kind;
enemy[i].x =enemyorder[t].x;
enemy[i].y =enemyorder[t].y;
enemy[i].speed =enemyorder[t].speed;
enemy[i].bltime =enemyorder[t].bltime;
enemy[i].blkind =enemyorder[t].blkind;
enemy[i].blkind2 =enemyorder[t].blkind2;
enemy[i].color =enemyorder[t].color;
enemy[i].wait =enemyorder[t].wait;
enemy[i].hp =enemyorder[t].hp;
enemy[i].maxhp =enemy[i].hp;
enemy[i].vx =0;
enemy[i].vy =0;
enemy[i].angle =0;
}
}
}
}
void enemyact(){
for(int i=0;i<MAXENEMY;i++){
if(enemy[i].flag==1){
enemypattern(i);
enemy[i].x+=enemy[i].vx;
enemy[i].y+=enemy[i].vy;
enemy[i].x+=cos(enemy[i].angle)*enemy[i].speed;
enemy[i].y+=sin(enemy[i].angle)*enemy[i].speed;
enemy[i].count++;
if(enemy[i].x<-50||640<enemy[i].x|| enemy[i].y<-50 || 480<enemy[i].y){
enemy[i].flag=0;}
if(enemy[i].bltime==enemy[i].count){
entershot(i);
}
}
}
}
void enemygraph(){
for(int i=0;i<MAXENEMY;i++){
if(enemy[i].flag==1){
DrawRotaGraphF((float)enemy[i].x,(float)enemy[i].y,1.0f,0.0f,enemy[i].img,TRUE);
}
}
}
void enemymain(){
enemyenter();
enemyact();
stagecount++;
}
#include "DxLib.h"
#include"player.h"
#include"keyboard.h"
#include"enemy.h"
int func_state=0;
int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
if(ChangeWindowMode(TRUE)!=0){return 0;}
if(DxLib_Init()!=0){return 0;}
if(SetDrawScreen(DX_SCREEN_BACK)!=0){
DxLib_End();
return 0;
}
SetMainWindowText("a");
while(ProcessMessage()!=-1&&ScreenFlip()!=-1&&ClearDrawScreen()!=-1){
switch(func_state){
case 0:
enemyinitialize();
player_initialize();
shotinitialize();
func_state=99;
break;
case 99:
keypush();
player_update();
enemymain();
shot_main();
player_draw();
graph_bullet();
enemygraph();
break;
default:
printfDx("不明なfunc_state\n");
break;
}
}
DxLib_End();
return 0;
}
私は考え方等がよくわからなかったので、龍神録プログラミングの館の方に載っているものをコピーし、理論を自分なりに理解して大丈夫だと思った範囲で省略や改変等を行っていたつもりだったのですが⋯
エラーについてもう少し具体的に書きますと止まった際メイン部分のwhile(~)の行の部分で「このスレッドによって現在の関数が実行された後、次に実行されるステートメントです」と言って矢印が表示されていましたので~の部分を分解して試してみたらClearDrawScreen();の部分でいつもそれが表示されるようです。
環境についてですが
windows8
VC++2010
を使っています。
どうすればエラーが出ずに自分のやりたい部分が正常に動くのか知りたいので、ご協力よろしくお願いします。