Java 鼠标控制人物移动,地图随人物移动 200
想做一个Java小游戏,实现在地图上点击,人物会往那个方向移动,人物移动的过程中,如果地图很大,视野也会移到哪里。不是点击一下鼠标,人物就直接飞到哪里,我这个我会,主要问...
想做一个Java小游戏,实现在地图上点击,人物会往那个方向移动,人物移动的过程中,如果地图很大,视野也会移到哪里。
不是点击一下鼠标,人物就直接飞到哪里,我这个我会,主要问题是不能正确获取到路径的坐标,我试过两点一直线的公式计算得到的坐标点,存在小数误差,最后跑偏了。这个问题搞了好久没成功。
如果有解决了上面的问题,追加几倍财富。求大神帮帮,我只是一个业余Java爱好者,是java忠实的粉丝,希望大神帮帮忙。 展开
不是点击一下鼠标,人物就直接飞到哪里,我这个我会,主要问题是不能正确获取到路径的坐标,我试过两点一直线的公式计算得到的坐标点,存在小数误差,最后跑偏了。这个问题搞了好久没成功。
如果有解决了上面的问题,追加几倍财富。求大神帮帮,我只是一个业余Java爱好者,是java忠实的粉丝,希望大神帮帮忙。 展开
3个回答
展开全部
去学习A星寻路,可以得到最短路径,其中也包括了绕开障碍物的代码,然后就是动画的图片切换了,如果说要地图跟随主角移动,那个应该是滚屏操作,也就是说你主角往右走,超过窗口或者屏幕(全屏)坐标一半的时候,地图整个往左移动,速度和主角的一样就出来效果了。如果你看不懂A星的话,那咂就给你一段BFS的C++语言代码,自己转换成JAVA代码写法(就是改些关键字,有不少经典的游戏算法都来自C/C++)就可以了,这个是简化版的A星寻路,一样可以找到最近的路径,你把path 这个路径记录下来再换算成像素位置就可以得到行走的具体步伐了...
#include "stdafx.h"
#include <iostream>
using namespace std;
const int rows = 10;//行数
const int cols = 10;//列数
const int nummax = 4;//每一步,下一步可以走的方向:4个
//四种移动方向(左、右、上、下)对x、y坐标的影响
//x坐标:竖直方向,y坐标:水平方向
const char dx[nummax] = {0,0,-1,1};
const char dy[nummax] = {-1,1,0,0};
//障碍表
char block[rows][cols] = {
0,1,0,0,0,0,0,0,0,0,
0,1,1,0,1,1,1,0,0,0,
0,0,0,0,0,0,0,0,0,0,
1,0,1,0,0,0,0,0,0,0,
0,0,0,0,0,0,1,1,1,0,
0,1,0,0,0,0,1,0,0,0,
0,0,0,0,0,0,1,1,0,1,
0,1,0,0,0,1,0,1,0,1,
0,1,1,1,0,0,0,1,0,1,
0,0,0,0,0,0,0,0,0,0,
};
char block2[rows][cols] = {
0,1,0,0,0,0,0,0,0,0,
0,1,1,0,1,1,1,0,0,0,
0,0,0,0,0,0,0,0,0,0,
1,0,1,0,0,0,0,0,0,0,
0,0,0,0,0,0,1,1,1,0,
0,1,0,0,0,0,1,0,0,0,
0,0,0,0,0,0,1,1,0,1,
0,1,0,0,0,1,0,1,0,1,
0,1,1,1,0,0,0,1,0,1,
0,0,0,0,0,0,0,0,0,0,
};
char path[rows][cols] = {0};//记录路径
int startX = 0,startY = 0;//起始点坐标
int endX = rows - 1,endY = cols - 1;//目标点坐标
//保存节点位置坐标的数据结构
typedef struct tagQNode{
char x,y;
int parentNode;//父节点索引
}QNode;
//打印路径
void printPath()
{
cout << "" << endl;
for (int i = 0;i < rows;++i)
{
for (int j = 0;j < cols;++j)
{
if (1 == path[i][j])
{
cout << "♀";
}
else if(block2[i][j]==0)
cout << "∷";
else if(block2[i][j]==1)
cout << "■";
}
cout << endl;
}
cout << endl;
cout << endl;
}
void BFS()
{
int num = rows * cols;
//利用数组来模拟队列
QNode *queue = (QNode *)malloc(num * sizeof(QNode));
//起始点入队列
queue[0].x = queue[0].y = 0;
queue[0].parentNode = -1;//起始点没有父节点
int front = 0,rear = 1;//队列的头和尾
while(front != rear)//队列不为空
{
for (int i = 0;i < nummax;++i)
{
char nextX,nextY;//下一步的坐标
nextX = queue[front].x + dx[i];
nextY = queue[front].y + dy[i];
//下一个节点可行
if (nextX >= 0 && nextX < rows && nextY >= 0 && nextY < cols && 0 == block[nextX][nextY])
{
//寻找到目标点
if (nextX == endX && nextY == endY)
{
//生成路径
path[nextX][nextY] = 1;
int ParIn = front;
while(ParIn != -1)
{
path[queue[ParIn].x][queue[ParIn].y] = 1;
ParIn = queue[ParIn].parentNode;
}
//printPath();
}
//入栈
queue[rear].x = nextX;
queue[rear].y = nextY;
queue[rear].parentNode = front;
++rear;
//标记此点已被访问
block[nextX][nextY] = 1;
}
}
++front;
}
free(queue);
}
int _tmain(int argc, _TCHAR* argv[])
{
BFS();
printPath();
system("pause");
return 0;
}
2017-10-22
展开全部
我没学过java没有发言权,但是如zlsf321大牛所说,纯手工真的能累死,为毛,你一个动作就要写几十行代码,而这些代码大部分都是来处理用户操作出错了的解决方案,纯属蛋疼。。。相关的可以百度些做的公开课,有的培训机构会公开的或一些爱好者也会共享。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
用框架吧,纯java能写死你。
做游戏主要是主循环
做游戏主要是主循环
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询