作者:叫我小小小火枪的天空_603 | 来源:互联网 | 2023-06-14 10:56
很久没懂的东西。平时想着打游戏~~现在来说说使用js类的好处~~~这是我写的一个人物移动的小demo~~~仿java类~首先第一个类GameFrame~1varGame
很久没懂的东西。平时想着打游戏~~
现在来说说使用js类的好处~~~
这是我写的一个人物移动的小demo~~~
仿java类~
首先第一个类GameFrame~
1 var GameFrame = JSC.createClass({
2 initialize:function(){
3 this.myCanvas = document.createElement("canvas");
4 this.myCanvas.setAttribute("id", "mainFrame");
5 this.myCanvas.setAttribute("width", "800");
6 this.myCanvas.setAttribute("height", "600");
7 this.myCanvas.setAttribute("onClick", "gameFrame.frameClick(event)");
8 var canvasNav = document.getElementById("mainFrameNav");
9 canvasNav.appendChild(this.myCanvas);
10 this.cxt = this.myCanvas.getContext("2d");
11 this.player = new Role(this,"test",15,15);
12 this.cMap = new Map(this,0,0);
13 },
14 print:function(frame){
15 frame.clean(frame.cxt);
16 frame.cMap.draw(frame.cxt);
17 frame.player.draw(frame.cxt);
18 frame.draw(frame.cxt);
19 },
20 clean:function(cxt){
21 this.cxt.fill;
22 this.cxt.fillRect(0,0,this.myCanvas.getAttribute("width"),this.myCanvas.getAttribute("height"));
23 },
24 frameClick:function(e){
25 var t = e.target || e.srcElement;
26 var x = t.offsetLeft + t.clientLeft;
27 var y = t.offsetTop + t.clientTop;
28 this.player.moveTo(e.clientX-x,e.clientY-y);
29 },
30 draw:function(cxt){
31 cxt
32 }
33 });
这是游戏主窗口控制类~这里有一个我很郁闷的地方。就是print。js的定时器的使用问题。就不讨论了。
然后是地图类Map~
1 var Map = JSC.createClass({
2 initialize:function(frame,x,y){
3 //外框架对象
4 this.frame = frame;
5 //开始截图的坐标
6 this.x = x;
7 this.y = y;
8 //地图载入
9 this.cImg = new Image();
10 this.cImg.src = "images/20.jpg";
11 this.switchArray = new Array();
12 this.switchArray[1] = new Switch(this,1500,1000);
13 },
14 draw:function(cxt){
15 cxt.drawImage(
16 this.cImg,
17 this.x,
18 this.y,
19 this.frame.myCanvas.getAttribute("width"),
20 this.frame.myCanvas.getAttribute("height"),
21 0,
22 0,
23 this.frame.myCanvas.getAttribute("width"),
24 this.frame.myCanvas.getAttribute("height")
25 );
26 for(var switchObj in this.switchArray){
27 this.switchArray[switchObj].draw(cxt);
28 }
29
30 },
31 swicthMap:function(path){
32 this.cImg.src = path;
33 },
34 canMoveX:function(stepx){
35 if(stepx > 0 && (this.x+Number(this.frame.myCanvas.getAttribute("width"))+stepx) <= this.cImg.width){
36 this.x = this.x + stepx;
37 return true;
38 }else if(stepx <0 && (this.x + stepx) >= 0){
39 this.x = this.x + stepx;
40 return true;
41 }else if(stepx > 0) {
42 this.x = this.cImg.width - Number(this.frame.myCanvas.getAttribute("width"));
43 return false;
44 }else {
45 this.x = 0;
46 return false;
47 }
48 },
49 canMoveY:function(stepy){
50 if(stepy > 0 && (this.y+Number(this.frame.myCanvas.getAttribute("height"))+stepy) <= this.cImg.height){
51 this.y = this.y + stepy;
52 return true;
53 }else if(stepy <0 && (this.y + stepy) >= 0){
54 this.y = this.y + stepy;
55 return true;
56 }else if(stepy > 0) {
57 this.y = this.cImg.height - Number(this.frame.myCanvas.getAttribute("height"));
58 return false;
59 }else {
60 this.y = 0;
61 return false;
62 }
63 }
64 });
这是游戏地图类~
接下来是人物类Role~
var Role = new JSC.createClass({
initialize:function(frame,name,x,y){
this.frame = frame;
//角色名
this.name = name;
//角色屏幕坐标
this.x = x;
this.y = y;
//角色地图坐标
this.wx = x;
this.wy = y;
//角色需要移动到的屏幕坐标
this.px;
this.py;
//角色需要移动到的地图坐标
this.pwx;
this.pwy;
//角色的移速
this.speed = 5;
//角色的步伐
this.step = 0;
//角色x坐标步伐
this.stepx = 0;
//角色Y坐标步伐
this.stepy = 0;
},
draw: function(cxt) {
this.move();
cxt.fillStyle="#FF0000";
cxt.beginPath();
cxt.arc(this.x,this.y,15,0,Math.PI*2,true);
cxt.closePath();
cxt.fill();
},
move: function(){
if(Math.abs(this.wx-this.pwx)>this.speed){
var cx = this.x + this.stepx;
if(this.stepx > 0){
if(this.x >= (this.frame.myCanvas.getAttribute("width")/2)) {
if(this.frame.cMap.canMoveX(this.stepx)) this.x = this.x;
else this.x = cx;
}else {
this.x = cx;
}
}else {
if(this.x <= (this.frame.myCanvas.getAttribute("width")/2)) {
if(this.frame.cMap.canMoveX(this.stepx)) this.x = this.x;
else this.x = cx;
}else {
this.x = cx;
}
}
this.wx = this.wx + this.stepx;
}
if(Math.abs(this.wy-this.pwy)>this.speed){
var cy = this.y + this.stepy;
if(this.stepy > 0){
if(cy >= (this.frame.myCanvas.getAttribute("height")/2)) {
if(this.frame.cMap.canMoveY(this.stepy)) this.y = this.y;
else this.y = cy;
}else {
this.y = cy;
}
}else {
if(cy <= (this.frame.myCanvas.getAttribute("height")/2)) {
if(this.frame.cMap.canMoveY(this.stepy)) this.y = this.y;
else this.y = cy;
}else {
this.y = cy;
}
}
this.wy = this.wy + this.stepy;
}
},
moveTo: function(x,y){
this.px = x;
this.py = y;
this.pwx = this.wx + (this.px - this.x);
this.pwy = this.wy + (this.py - this.y);
var dis = Math.sqrt(Math.pow((this.px-this.x), 2) + Math.pow((this.py-this.y), 2));
this.step = dis/this.speed;
this.stepx = (this.px-this.x)/this.step;
this.stepy = (this.py-this.y)/this.step;
}
});
这是人物类~
接下来是地图切换类~
1 var Switch = JSC.createClass({
2 initialize:function(map,x,y){
3 this.x = x;
4 this.y = y;
5 this.r = 30;
6 this.map = map;
7 },
8 draw:function(cxt){
9 if(this.canSee()){
10 cxt.fill;
11 cxt.beginPath();
12 cxt.arc(this.x-this.map.x,this.y-this.map.y,this.r,0,Math.PI*2,true);
13 cxt.closePath();
14 }
15
16 },
17 swicthMap:function(path){
18 this.cImg.src = path;
19 },
20 canSee:function(){
21 if(this.map.x <= (this.x+this.r) &&
22 this.map.y <= (this.y+this.r) &&
23 (this.map.frame.myCanvas.getAttribute("width")+this.map.x) >= (this.x-30) &&
24 (this.map.frame.myCanvas.getAttribute("height")+this.map.y) >= (this.y-this.r)
25 )
26 return true;
27 return false;
28 }
29 });
切换地图没有实现~
大概就是这样子。使用了js类之后开发起来感觉就是在开发C或者java代码。不过很多事件触发还是没有。。。
当然这只是小例子~不代表这可以开发游戏。
附件:小demo