HTML5面向对象的游戏开发简单实例总结

在阅读一本HTML5游戏开发相关书籍时发现一个很好的例子,通过这个例子可以对面向对象的开发进行更深入的理解。这个对象要实现的是:将一个CSS sprite中的图像绘制到canvas中。首先创建一个SpriteSheet对象,代码如下:

var SpriteSheet = new function(){
	this.map = { };
	this.load = function(spriteData,callback){
		this.image = new Image();
		this.image.onload = callback;
		this.image.src = "images/sprites.png";
	};
	this.draw = function(ctx,sprite,x,y,frame){
		var s = this.map[sprite];
		if (!frame) {
			frame = 0;
		};
		ctx.drawImage(this.image, s.sx+frame*s.w, s.sy, s.w, s.h, x, y, s.w, s.h);
	};
}

首先使用了new function(){},保证了只会有一个实例被创建。

接下来对象内部,通过this为其绑定了两个方法和一个属性。load方法起到加载image的作用,传递两个参数,第一个参数是图像信息,即要绘制的图像在sprite中的位置大小以及在画布上的位置大小。注意callback的用法,这里面的this.image.onload = callbak;当图像加载完成后执行传入的回调函数。

draw方法用来进行图像的绘制,传入canvas的上下文环境,需要绘制的图像对象信息以及图像位置。

这个对象的逻辑构造相对复杂,基本的思路就是自定义load方法,通过load方法完成图像信息的加载。这里的图像信息指的是图像在sprite中的位置、大小等。

使用该对象的方法代码如下:

function startGame(){
	SpriteSheet.load({
		ship:{sx:0, sy:0, w:18, h:35, frames:3}
	},function(){
		SpriteSheet.draw(ctx,"ship",0,0);
		SpriteSheet.draw(ctx,"ship",100,50);
		SpriteSheet.draw(ctx,"ship",150,100,1);
	});
}

这里使用load方法,首先传入所需切图部分的相关数据,接下来在回调函数中调用对象的draw方法进行图像绘制。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
好的,这是一个很不错的问题!首先,我们需要在HTML文档中引入一个JavaScript脚本,来实现动态生成添加修改删除表格的功能。以下是一个简单的HTML文档: ```html <!DOCTYPE html> <html> <head> <title>动态表格</title> </head> <body> <table id="myTable"> <thead> <tr> <th>姓名</th> <th>学科</th> <th>成绩</th> <th>操作</th> </tr> </thead> <tbody> <tr> <td>张三</td> <td>数学</td> <td>90</td> <td> <button onclick="editRow(this)">编辑</button> <button onclick="deleteRow(this)">删除</button> </td> </tr> <tr> <td>李四</td> <td>语文</td> <td>80</td> <td> <button onclick="editRow(this)">编辑</button> <button onclick="deleteRow(this)">删除</button> </td> </tr> <tr> <td>王五</td> <td>英语</td> <td>70</td> <td> <button onclick="editRow(this)">编辑</button> <button onclick="deleteRow(this)">删除</button> </td> </tr> </tbody> </table> <br /> <button onclick="addRow()">添加</button> <script src="table.js"></script> </body> </html> ``` 在这个HTML文档中,我们引入了一个JavaScript脚本“table.js”,它包含了我们所需要的逻辑代码。 接下来,让我们来看一下如何使用面向对象编程思想,将逻辑代码改写成类进行封装,以实现复用。 首先,我们可以定义一个名为“Table”的类,它包含以下方法: 1. 构造函数:用于初始化表格,并将表格中的数据存储在一个数组中。 2. 生成表格方法:用于根据数组中的数据生成表格。 3. 添加行方法:用于添加一行数据到表格中,并更新数组。 4. 编辑行方法:用于编辑表格中某一行的数据,并更新数组。 5. 删除行方法:用于删除表格中某一行的数据,并更新数组。 以下是一个简单的“Table”类的实现: ```javascript class Table { constructor(tableId) { this.table = document.getElementById(tableId); this.data = []; for (let i = 1; i < this.table.rows.length; i++) { let row = this.table.rows[i]; let obj = { name: row.cells[0].innerHTML, subject: row.cells[1].innerHTML, score: row.cells[2].innerHTML }; this.data.push(obj); } this.generateTable(); } generateTable() { let tbody = this.table.getElementsByTagName("tbody")[0]; tbody.innerHTML = ""; for (let i = 0; i < this.data.length; i++) { let row = tbody.insertRow(i); let cell1 = row.insertCell(0); let cell2 = row.insertCell(1); let cell3 = row.insertCell(2); let cell4 = row.insertCell(3); cell1.innerHTML = this.data[i].name; cell2.innerHTML = this.data[i].subject; cell3.innerHTML = this.data[i].score; cell4.innerHTML = ` <button onclick="table.editRow(this)">编辑</button> <button onclick="table.deleteRow(this)">删除</button> `; } } addRow() { let name = prompt("请输入姓名:"); let subject = prompt("请输入学科:"); let score = prompt("请输入成绩:"); let obj = { name: name, subject: subject, score: score }; this.data.push(obj); this.generateTable(); } editRow(button) { let row = button.parentNode.parentNode; let index = row.rowIndex - 1; let name = prompt("请输入姓名:", this.data[index].name); let subject = prompt("请输入学科:", this.data[index].subject); let score = prompt("请输入成绩:", this.data[index].score); let obj = { name: name, subject: subject, score: score }; this.data[index] = obj; this.generateTable(); } deleteRow(button) { let row = button.parentNode.parentNode; let index = row.rowIndex - 1; this.data.splice(index, 1); this.generateTable(); } } let table = new Table("myTable"); ``` 在这个“Table”类中,我们定义了一个构造函数,用于初始化表格并将其中的数据存储在一个数组中。我们还定义了一个“generateTable”方法,用于根据数组中的数据生成表格。这个方法会将表格中原来的数据清空,然后根据数组中的数据生成新的表格。 我们还定义了“addRow”、“editRow”和“deleteRow”三个方法,分别用于添加、编辑和删除表格中的数据,并更新数组。这些方法会调用“generateTable”方法来重新生成表格。 最后,我们创建了一个“Table”实例,并将其绑定到了全局变量“table”上,这样就可以在HTML文档中使用“table.addRow()”、“table.editRow()”和“table.deleteRow()”来操作表格了。 以上就是使用面向对象编程思想,将逻辑代码改写成类进行封装的一个简单示例。当然,在实际开发中,我们可能还需要对“Table”类进行一些优化和扩展,以满足实际需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值