#include <stdio.h>
#include <Windows.h>
#include <easyx.h>
#include <conio.h>
#include <time.h>
#include <graphics.h>
#include <stdlib.h>
#include <iostream>
int main() {
//定义玩家
struct Player {
int x;
int y; //位置
int dirx;
int diry; //移动方向
unsigned long t1, t2, dt; //控制速度
};
struct Player player, player1;
//初始化玩家
//玩家1
player.x = 25;
player.y = 25;
player.dirx = 1;
player.diry = 0;
player.t1 = GetTickCount64(); //获取系统时间
player.dt = 5; //ms为单位
//玩家2
player1.x = 25;
player1.y = 25;
player1.dirx = 1;
player1.diry = 0;
player1.t1 = GetTickCount64(); //获取系统时间
player1.dt = 5; //ms为单位
setfillcolor(WHITE);
fillcircle(player.x, player.y, 7);
fillcircle(player1.x, player1.y, 7);
//1.手动变化
//改变方向
char key;
if (_kbhit()) //如果有按键动作
{
key = _getch(); //接收按键动作
switch (key)
{
case 72: //上
player.dirx = 0, player.diry = -1;
break;
case 80: //下
player.dirx = 0, player.diry = 1;
break;
case 75: //左
player.dirx = -1, player.diry = 0;
break;
case 77: //右
player.dirx = 1, player.diry = 0;
break;
case 'A':
player1.dirx = -1, player.diry = 0;
break;
case 'D':
player1.dirx = 1, player.diry = 0;
break;
case 'W':
player1.dirx = 0, player.diry = -1;
break;
case 'S':
player1.dirx = 0, player.diry = 1;
break;
}
}
//2.自动变化
//玩家数据变化
//玩家1
//移动
player.t2 = GetTickCount64();
if (player.t2 - player.t1 >= player.dt) //每间隔5ms动一次
{
player.x += 1 * player.dirx;
player.y += 1 * player.diry;
player.t1 = player.t2; //控制间隔时间一样
}
//玩家碰到墙壁 方向相反
//此处需要或取玩家图片的大小以及地图的布置大小
int cen_x1 = player.x + 7; //7是图片长宽的一半
int cen_y1 = player.y + 7;
if (player.dirx == 1) //右
{
for (int yy1 = cen_y1 - 6; yy1 <= cen_y1 + 6; yy1++) {
//if (getpixel(cen_x1 + 9, yy1) != BLACK) //获取该位置处像素的颜色
player.dirx = -player.dirx;
break;
}
}
else if (player.dirx == -1) //左
{
for (int yy1 = cen_y1 - 6; yy1 <= cen_y1 + 6; yy1++) {
if (getpixel(cen_x1 - 9, yy1) != BLACK) //获取该位置处像素的颜色
player.dirx = -player.dirx;
break;
}
}
else if (player.diry == 1)
{
for (int xx1 = cen_x1 - 6; xx1 <= cen_x1 + 6; xx1++) {
if (getpixel(xx1, cen_y1 + 9) != BLACK) //获取该位置处像素的颜色
player.diry = -player.diry;
break;
}
}
else if (player.diry == -1)
{
for (int xx1 = cen_x1 - 6; xx1 <= cen_x1 + 6; xx1++) {
if (getpixel(xx1, cen_y1 - 9) != BLACK) //获取该位置处像素的颜色
player.diry = -player.diry;
break;
}
}
//玩家2
//移动
player1.t2 = GetTickCount64();
if (player1.t2 - player1.t1 >= player1.dt) //每间隔5ms动一次
{
player1.x += 1 * player1.dirx;
player1.y += 1 * player1.diry;
player1.t1 = player1.t2; //控制间隔时间一样
}
//玩家碰到墙壁 方向相反
//此处需要或取玩家图片的大小以及地图的布置大小
int cen_x2 = player1.x + 7; //7是图片长宽的一半
int cen_y2 = player1.y + 7;
if (player1.dirx == 1) //右
{
for (int yy2 = cen_y2 - 6; yy2 <= cen_y2 + 6; yy2++) {
if (getpixel(cen_x2 + 9, yy2) != BLACK) //获取该位置处像素的颜色
player1.dirx = -player1.dirx;
break;
}
}
else if (player1.dirx == -1) //左
{
for (int yy2 = cen_y2 - 6; yy2 <= cen_y2 + 6; yy2++) {
if (getpixel(cen_x2 - 9, yy2) != BLACK) //获取该位置处像素的颜色
player1.dirx = -player1.dirx;
break;
}
}
else if (player1.diry == 1)
{
for (int xx2 = cen_x2 - 6; xx2 <= cen_x2 + 6; xx2++) {
if (getpixel(xx2, cen_y2 + 9) != BLACK) //获取该位置处像素的颜色
player1.diry = -player1.diry;
break;
}
}
else if (player1.diry == -1)
{
for (int xx2 = cen_x2 - 6; xx2 <= cen_x2 + 6; xx2++) {
if (getpixel(xx2, cen_y2 - 9) != BLACK) //获取该位置处像素的颜色
player1.diry = -player1.diry;
break;
}
}
return 0;
}
为什么以上代码在执行到39行setfillcolor(WHITE);时发生访问异常:
0x00ED597C 处(位于 player.exe 中)引发的异常: 0xC0000005: 读取位置 0x00000000 时发生访问冲突。