童年回忆——捕鱼达人(内含源码inscode一键运行)

news2024/12/24 3:17:35

前言

在这里插入图片描述
「作者主页」:雪碧有白泡泡
「个人网站」:雪碧的个人网站
「推荐专栏」

java一站式服务
React从入门到精通
前端炫酷代码分享
★ 从0到英雄,vue成神之路★
uniapp-从构建到提升
从0到英雄,vue成神之路
解决算法,一个专栏就够了
架构咱们从0说
★ 数据流通的精妙之道★
★后端进阶之路★

请添加图片描述

文章目录

  • 前言
  • 认识一下inscode
  • 先看运行效果
      • 看查源码内容
      • 获取项目
  • 项目结构
    • 核心逻辑fishjoy.js
  • 小结

认识一下inscode

在这里插入图片描述
CSDN最新推出的Inscode服务是一个在线编程工具,旨在为开发者提供一个便捷的编写、运行和分享代码的环境,让开发者无需在本地搭建编程环境,即可快速编写和运行代码。

Inscode支持多种编程语言,包括Java、Python、C++等,同时也支持编写HTML、CSS和JavaScript代码。它提供了完整的运行环境,让代码在网页上直接运行并输出结果,即时调试,方便快捷。同时,Inscode还提供了分享功能,可以轻松地将代码分享给其他人。

使用Inscode,只需访问其网站https://inscode.csdn.net/
个人主页:why_does_it_work

先看运行效果

在这里插入图片描述
这里可以直接看查源码内容刷新,最后一个是放大跳转网页

看查源码内容

在这里插入图片描述

获取项目

点击链接
在这里插入图片描述
在这里插入图片描述

项目结构

在这里插入图片描述

  1. 第一个脚本文件是"quark.base-1.0.0.alpha.min.js“,它是一个名为”quark"的JavaScript框架的核心文件。这个框架提供了一些基本的功能和工具,以方便开发者进行Web应用程序的开发。

  2. 下一个被引入的脚本文件是"R.js“,它可能是一个自定义的JavaScript文件,用于管理游戏中的资源,例如图片和声音文件。这个文件可能定义了一个”R"对象,其中包含了游戏中使用的所有资源的引用。

  3. "Utils.js"是一个自定义的JavaScript文件,它可能包含一些通用的功能函数或工具函数,用于游戏的实现。这些函数可能包括一些常用的数学计算、碰撞检测等功能。

  4. "fishjoy.js“是游戏的核心逻辑代码文件。它可能包含了游戏的初始化设置、主循环逻辑、用户交互处理等内容。这个文件可能定义了一个名为”FishJoy"的对象,其中包含了游戏的各种逻辑和状态。

  5. "FishManager.js“是一个自定义的JavaScript文件,它可能是用于管理和控制游戏中的鱼类对象的文件。这个文件中可能定义了一个名为”FishManager"的对象,用于创建、更新和销毁游戏中的鱼类对象。

  6. "FishGroup.js“是一个自定义的JavaScript文件,它可能是用于创建和管理游戏中的鱼群的文件。这个文件中可能定义了一个名为”FishGroup"的对象,用于创建、更新和销毁游戏中的鱼群。

  7. "Fish.js“是一个视图文件,它可能定义了一个名为”Fish"的视图类,用于显示游戏中的鱼类对象。这个类可能包含了一些方法和属性,用于控制鱼的运动和动画效果。

  8. "Cannon.js“是一个视图文件,它可能定义了一个名为”Cannon"的视图类,用于显示游戏中的炮台对象。这个类可能包含了一些方法和属性,用于控制炮台的角度和发射子弹。

  9. "Bullet.js“是一个视图文件,它可能定义了一个名为”Bullet"的视图类,用于显示游戏中的子弹对象。这个类可能包含了一些方法和属性,用于控制子弹的运动和碰撞检测。

  10. "Num.js“是一个视图文件,它可能定义了一个名为”Num"的视图类,用于显示游戏中的分数和数字等信息。这个类可能包含了一些方法和属性,用于更新和显示分数。

  11. "Player.js“是一个视图文件,它可能定义了一个名为”Player"的视图类,用于显示游戏中的玩家信息。这个类可能包含了一些方法和属性,用于更新和显示玩家的信息。
    在这里插入图片描述

核心逻辑fishjoy.js

在这里插入图片描述

具体代码


(function(){

window.onload = function()
{
	setTimeout(function()
	{
		game.load();
	}, 10);
};

var ns = Q.use("fish");

var game = ns.game = 
{	
	container: null,
	width: 480,
	height: 320,
	fps: 60,
	frames: 0,
	params: null,
	events: Q.supportTouch ? ["touchstart", "touchend"] : ["mousedown", "mouseup"],
	
	fireInterval: 30,
	fireCount: 0
};

game.load = function(container)
{	
	//获取URL参数设置
	var params = this.params = Q.getUrlParams();
	if(params.mode == undefined) params.mode = 2;
	if(params.fps) this.fps = params.fps;
	this.fireInterval = this.fps*0.5;
	
	if(Q.isIpod || Q.isIphone)
	{
		this.width = 980;
		this.height = 545;
		Q.addMeta({name:"viewport", content:"user-scalable=no"});
	}else
	{		
		Q.addMeta({name:"viewport", content:"user-scalable=no, initial-scale=1.0, minimum-scale=1, maximum-scale=1"});
		this.width = Math.min(1024, window.innerWidth);
		this.height = Math.min(768, window.innerHeight);
	}

	if(params.width) this.width = Number(params.width) || this.width;
	if(params.height) this.height = Number(params.height) || this.height;
	
	//初始化容器设置
	this.container = container || Q.getDOM("container");
	this.container.style.overflow = "hidden";
	this.container.style.width = this.width + "px";
	this.container.style.height = this.height + "px";
	this.screenWidth = window.innerWidth;
	this.screenHeight = window.innerHeight;
	
	//load info
	var div = Q.createDOM("div", {innerHTML: "正在加载资源中,请稍候...<br>", style:
	{
		id: "loader",
		position: "absolute",
		width: this.width + "px",
		left: "0px",
		top: (this.height >> 1) + "px",
		textAlign: "center",
		color: "#fff",
		font: Q.isMobile ?  'bold 16px 黑体' : 'bold 16px 宋体',
		textShadow: "0 2px 2px #111"
	}});
	this.container.appendChild(div);
	this.loader = div;
    
    //hide nav bar
    this.hideNavBar();
    if(Q.supportOrientation)
    {
        window.onorientationchange = function(e)
        {
            game.hideNavBar();
           if(game.stage) game.stage.updatePosition();
        };
    }
	
	//start load image
	var imgLoader = new Q.ImageLoader();
	imgLoader.addEventListener("loaded", Q.delegate(this.onLoadLoaded, this));
	imgLoader.addEventListener("complete", Q.delegate(this.onLoadComplete, this));
	imgLoader.load(ns.R.sources);
};

game.onLoadLoaded = function(e)
{
	var content = "正在加载资源中,请稍候...<br>(" + Math.round(e.target.getLoadedSize()/e.target.getTotalSize()*100) + "%)";
	this.loader.innerHTML = content;
};

game.onLoadComplete = function(e)
{
	e.target.removeAllEventListeners();
	this.init(e.images);
};

game.init = function(images)
{
	ns.R.init(images);
	this.startup();
};

game.startup = function()
{
	var me = this;
	this.container.removeChild(this.loader);
	this.loader = null;
	
	//手持设备的特殊webkit设置	
	if(Q.isWebKit && !Q.supportTouch)
	{
		document.body.style.webkitTouchCallout = "none";
		document.body.style.webkitUserSelect = "none";
		document.body.style.webkitTextSizeAdjust = "none";
		document.body.style.webkitTapHighlightColor = "rgba(0,0,0,0)";
	}   
	
	var context = null;
	if(this.params.mode == 1)
	{
		var canvas = Q.createDOM("canvas", {id:"canvas", width:this.width, height:this.height, style:{position:"absolute"}});
		this.container.appendChild(canvas);
		this.context = new Q.CanvasContext({canvas:canvas});
	}else
	{
		this.context = new Q.DOMContext({canvas:this.container});
	}
	
	this.stage = new Q.Stage({width:this.width, height:this.height, context:this.context, update:Q.delegate(this.update, this)});
		
	var em = this.evtManager = new Q.EventManager();
	em.registerStage(this.stage, this.events, true, true);	
	
	this.initUI();
	this.initPlayer();
	
	//this.testFish();
	//this.testFishDirection();
	//this.testFishALL();
	
	this.fishManager = new ns.FishManager(this.fishContainer);
	this.fishManager.makeFish();
	
	var timer = this.timer = new Q.Timer(1000 / this.fps);
	timer.addListener(this.stage);
	timer.addListener(Q.Tween);
	timer.start();
	
	this.showFPS();
};

game.initUI = function()
{
	this.bg = new Q.Bitmap({id:"bg", image:ns.R.mainbg, transformEnabled:false});
	
	this.fishContainer = new Q.DisplayObjectContainer({id:"fishContainer", width:this.width, height:this.height, eventChildren:false, transformEnabled:false});
	this.fishContainer.onEvent = function(e)
	{
		if(e.type == game.events[0] && game.fireCount >= game.fireInterval)
		{
			game.fireCount = 0;
			game.player.fire({x:e.eventX, y:e.eventY});
		}
	};
		
	this.bottom = new Q.Bitmap(ns.R.bottombar);
	this.bottom.id = "bottom";
	this.bottom.x = this.width - this.bottom.width >> 1;
	this.bottom.y = this.height - this.bottom.height + 2;
	this.bottom.transformEnabled = false;
	
	this.stage.addChild(this.bg, this.fishContainer, this.bottom);	
};

game.initPlayer = function()
{
	var coin = Number(this.params.coin) || 10000;
	this.player = new ns.Player({id:"quark", coin:coin});
};

game.update = function(timeInfo)
{
	this.frames++;
	this.fireCount++;
	this.fishManager.update();
};

game.testFish = function()
{
	var num = this.params.num || 50, len = ns.R.fishTypes.length;
	for(var i = 0; i < num; i++)
	{
		var chance = Math.random() * (len - 1) >> 0;
		var index = Math.random() * chance + 1 >> 0;
		var type = ns.R.fishTypes[index];
		
		var fish = new ns.Fish(type);
		fish.x = Math.random()*this.width >> 0;
		fish.y = Math.random()*this.height >> 0;
		fish.moving = true;
		fish.rotation = Math.random() * 360 >> 0;
		fish.init();
		this.fishContainer.addChild(fish);
	}
};

game.testFishDirection = function()
{
	var dirs = [0, 45, 90, 135, 180, 225, 270, 315];
	
	for(var i = 0; i < 8; i++)
	{
		var fish = new ns.Fish(ns.R.fishTypes[1]);
		fish.x = this.width >> 1;
		fish.y = this.height >> 1;
		fish.speed = 0.5;
		fish.setDirection(dirs[i]);
		fish.moving = true;
		this.stage.addChild(fish);
	}
};

game.testFishALL = function()
{
	var sx = 100, sy = 50, y = 0, len = ns.R.fishTypes.length;
	for(var i = 0; i < len - 1; i++)
	{
		var type = ns.R.fishTypes[i+1];
		var fish = new ns.Fish(type);	
		if(i == 9) fish.x = sx;
		else fish.x = sx + Math.floor(i/5)*200;
		if(i == 9) y = sy + 320;
		else if(i%5 == 0) y = sy;
		fish.y = y + (i%5) * 20;
		y += fish.height;
		fish.update = function(){ };
		this.stage.addChild(fish);
	}
};

game.showFPS = function()
{
	var me = this, fpsContainer = Quark.getDOM("fps");
	if(fpsContainer)
	{
		setInterval(function()
		{
			fpsContainer.innerHTML = "FPS:" + me.frames;
			me.frames = 0;
		}, 1000);
	}
};

game.hideNavBar = function()
{
    window.scrollTo(0, 1);
};

})();

这段代码是一个立即执行函数,主要用于初始化一个名为game的对象,设置游戏的参数和加载资源等操作。

  1. 在window.onload事件回调函数中,调用game.load()方法加载游戏资源。
  2. 定义一个命名空间ns,并将其赋值给game对象的一个属性。
  3. 初始化game对象的一些属性,如container(游戏容器)、width(游戏宽度)、height(游戏高度)、fps(帧率)等。
  4. game.load()方法用于加载游戏资源,其中使用了Q.js引擎中的ImageLoader类。
  5. game.onLoadLoaded()方法在资源加载过程中被调用,用于显示加载进度。
  6. game.onLoadComplete()方法在资源加载完成后被调用,初始化游戏。
  7. game.init()方法用于初始化游戏,创建舞台、添加事件监听器、初始化UI界面等操作。
  8. game.initUI()方法用于初始化游戏界面元素,包括背景图、鱼的容器、底部工具栏等。
  9. game.initPlayer()方法用于初始化玩家对象。
  10. game.update()方法在每一帧更新游戏,包括更新帧数和鱼的位置等。
  11. game.testFish()方法用于测试创建鱼。
  12. game.testFishDirection()方法用于测试创建具有不同方向的鱼。
  13. game.testFishALL()方法用于测试创建所有类型的鱼。
  14. game.showFPS()方法用于显示帧率。
  15. game.hideNavBar()方法用于隐藏导航栏。
    在这里插入图片描述

小结

捕鱼达人是一款非常受欢迎的休闲游戏,通过使用HTML编写的捕鱼达人小游戏可以让玩家在浏览器中体验到捕鱼的乐趣。

游戏主要包括以下几个要点:

  1. 游戏界面设计:通过HTML和CSS,可以设计出游戏界面,包括渔场、海洋背景、鱼群等元素。可以使用HTML的div标签来创建渔场和渔网,并使用背景图片增加视觉效果。

  2. 鱼类的生成:可以使用HTML的img标签来插入鱼的图片,并设置其动画效果,使鱼在渔场中移动。可以使用JavaScript控制鱼的生成和移动,使其在渔场中自由游动。

  3. 捕鱼操作:可以使用HTML的canvas标签创建画布,通过JavaScript获取鼠标点击事件,并在点击位置创建渔网。点击后可以计算鱼和渔网的位置关系,判断是否捕捉到鱼,并根据捕鱼的成功或失败给玩家加分或扣分。

  4. 分数统计:可以使用JavaScript来实现分数的统计和显示,每次成功捕鱼后可以更新分数,并将分数显示在游戏界面上。

通过使用HTML、CSS和JavaScript来编写捕鱼达人小游戏,可以让玩家在浏览器中进行捕鱼游戏,提供了一个简单、便捷且有趣的游戏体验。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/845964.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【GO】 33.go-zero 示例

1. 获取go-zero库 go get -u github.com/zeromicro/go-zero 2. 安装goctl brew install goctlgoctl -v #goctl version 1.5.4 darwin/amd64 3. 创建.api文件&#xff0c; greet.api goctl api -o greet.api syntax "v1"info (title: // TODO: add titledesc: //…

jupyter lab build失败,提示需要安装版本>=12.0.0的nodejs但其实已从官网安装18.17.0版本 的解决方法

出现的问题如题目所示&#xff0c;这个问题差点要把我搞死了。。。但还是在没有重装的情况下解决了&#x1f618;。 问题来源 初衷是想安装lsp扩展&#xff0c;直接在jupyter lab网页界面的extensions中搜索lsp并点击install krassowski/jupyterlab-lsp&#xff0c;会提示需要…

缓存失效问题

目录 一、缓存穿透 二、缓存雪崩 三、缓存击穿 本地锁 分布式锁-使用redis存储key 阶段一 阶段二 阶段三 阶段四 一、缓存穿透 缓存穿透 是指 查询一个一定不存在的数据 &#xff0c;由于缓存是不命中&#xff0c;将去查询数据库&#xff0c;但是数据库也无此记录&#xff0c…

matlab使用教程(10)—脚本和函数

1.概述 MATLAB 提供了一个强大的编程语言和交互式计算环境。您可以使用此语言在 MATLAB 命令行中一次输入一个命令&#xff0c;也可以向某个文件写入一系列命令&#xff0c;按照执行任何 MATLAB 函数的相同方式来执行这些命令。使用 MATLAB 编辑器或任何其他文件编辑器可以创建…

Swintransformer模型的优化

SwinTransformer模型优化 文章目录 SwinTransformer模型优化1.SwinTransformer概述2.性能瓶颈分析3.模型优化3.1.transpose消除3.2.更好的layergroup3.1.1.SliceOp3.1.2.SqueezeOp3.1.3.weight切分 4.优化效果 1.SwinTransformer概述 自从Transformer在NLP任务上取得突破性的进…

HikariDataSource类的作用和使用

HikariDataSource是一个Java数据库连接池的实现&#xff0c;它属于HikariCP连接池库。连接池是一个用于管理数据库连接的工具&#xff0c;它可以帮助优化数据库连接的创建和销毁过程&#xff0c;提高数据库操作的性能和效率。 HikariDataSource类的作用是创建和管理数据库连接…

为什么要选择文件传输软件?有哪些最佳高速文件传输软件?

是否经历过这样的场景&#xff0c;正在努力地完成工作任务&#xff0c;但是由于制作的数据无法及时传送给合作伙伴&#xff0c;工作流程被打断了&#xff1f;这听起来很令人沮丧&#xff0c;对吧&#xff1f;可是&#xff0c;这种情况在现实中并不罕见。 因此&#xff0c;需要…

微服务与Nacos概述

微服务概述 软件架构的演变&#xff1a;单体架构、垂直应用架构、流式计算架构 SOA、微服务架构和服务网格。 微服务是一种软件开发架构&#xff0c;它将一个大型应用程序拆分为一系列小型、独立的服务。每个服务都可以独立开发、部署和扩展&#xff0c;并通过轻量级的通信机…

C++ 派生类成员的标识与访问——虚基类及其派生类构造函数

虚基类的使用非常方便&#xff0c;简单&#xff0c;这是由于程序中所有类使用的都是自动生成的默认构造函数。如果虚基类声明有非默认的&#xff08;即带参的&#xff09;构造函数&#xff0c;并且没有声明默认形式的构造函数。这时&#xff0c;在整个继承关系中&#xff0c;直…

1 swagger简单案例

1.1 加入依赖 <!--swagger图形化接口--><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>2.9.2</version> </dependency><dependency><groupId>io.spri…

通过Idea部署Tomcat服务器(详细图文教学)

1.在idea中创建项目 有maven构建工具就创建maven&#xff0c;没有就正常创建一个普通的java程序 创建普通java项目 2.添加框架 3.配置 Tomcat 注意&#xff1a;创建web项目后我们需要配置tomcat才能运行&#xff0c;下面我们来进行配置。 4.添加部署 回到服务器 5.完善配置 6…

·[K8S:使用calico网络插件]:解决集群节点NotReady问题

文章目录 一&#xff1a;安装calico&#xff1a;1.1&#xff1a;weget安装Colico网络通信插件&#xff1a;1.2&#xff1a;修改calico.yaml网卡相关配置&#xff1a;1.2.1&#xff1a;查看本机ip 网卡相关信息&#xff1a;1.2.2&#xff1a;修改calico.yaml网卡interface相关信…

TEC半导体热电冷却技术在高速电主轴热变形补偿中的应用

摘要&#xff1a;电主轴Z向热变形是影响高速数控机床加工精度的主要因素&#xff0c;目前常用的补偿技术是流体介质形式的液冷和风冷&#xff0c;也出现了基于帕尔贴原理的TEC半导体冷却技术。目前TEC冷却技术在电主轴热变形补偿中存在的主要问题是无法对主轴热变形量进行直接调…

LeetCode 热题 100 JavaScript--142. 环形链表 II

给定一个链表的头节点 head &#xff0c;返回链表开始入环的第一个节点。 如果链表无环&#xff0c;则返回 null。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统内部使用整数…

【Redis】项目使用redis做缓存除了击穿穿透雪崩我们还要考虑哪些?

文章目录 前言高并发写高并发读总结 前言 相信大家在项目中都是用过redis&#xff0c;比如用来做一个分布式缓存来提高程序的性能。 当使用到了redis来做缓存&#xff0c;那么我们就必须要考虑几个问题&#xff0c;除了缓存击穿&#xff0c;缓存穿透&#xff0c;缓存雪崩&…

【Linux命令详解 | cat命令】用于显示或连接文件

文章标题 简介一&#xff0c;参数列表二&#xff0c;使用介绍1. 显示文件内容2. 创建文件3. 连接文件4. 显示行号5. 压缩空行6. 显示特殊字符7. 显示行号和特殊字符8. 从标准输入读取9. 显示文件开头或结尾10. 备份文件11. 显示文件内容至多屏幕大小12. 转义正则表达式13. 显示…

集成学习:机器学习模型如何“博采众长”

前置概念 偏差 指模型的预测值与真实值之间的差异&#xff0c;它反映了模型的拟合能力。 方差 指模型在不同的训练集上产生的预测结果的差异&#xff0c;它反映了模型的稳定性。 方差和偏差对预测结果所造成的影响 在机器学习中&#xff0c;我们通常希望模型的偏差和方差都…

ffmpeg源码编译成功,但是引用生成的静态库(.a)报错,报错位置在xxx_list.c,报错信息为某变量未定义

背景&#xff1a;本文是对上一个文章的补充&#xff0c;在源码编译之前&#xff0c;项目是有完整的ffmpeg编译脚本的&#xff0c;只不过新增了断点调试ffmpeg&#xff0c;所以产生的上面的文章&#xff0c;也就是说&#xff0c;我在用make编译成功后&#xff0c;再去做的源码编…

快速上手React:从概述到组件与事件处理

前言 「作者主页」&#xff1a;雪碧有白泡泡 「个人网站」&#xff1a;雪碧的个人网站 「推荐专栏」&#xff1a; ★java一站式服务 ★ ★ React从入门到精通★ ★前端炫酷代码分享 ★ ★ 从0到英雄&#xff0c;vue成神之路★ ★ uniapp-从构建到提升★ ★ 从0到英雄&#xff…

3.4 网络安全管理设备

数据参考&#xff1a;CISP官方 目录 IDS (入侵检测系统)网络安全审计漏洞扫描系统VPN&#xff08;虚拟专网&#xff09;堡垒主机安全管理平台 一、IDS (入侵检测系统) 入侵检测系统&#xff08;IDS&#xff09;是一种网络安全设备&#xff0c;用于监测和检测网络中的入侵行…