设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 2004|回复: 48
打印 上一主题 下一主题

[有事请教] 請問如何讓輸出後的HTML5遊戲可以跟隨IFRAME指定視窗大小?

[复制链接]

Lv4.逐梦者

梦石
0
星屑
10710
在线时间
2027 小时
注册时间
2013-6-10
帖子
1498
1
发表于 2021-9-18 16:32:05 | 显示全部楼层
如果游戏分辨率是816x624的话,iframe的宽高也设置成一样的就好了。

点评

试试我回复的办法  发表于 2021-9-21 13:20
我就是想要IFRAME有的大有的小有的中...就是有各種不同的尺寸.但是我不想去更改遊戲的檔案...  发表于 2021-9-18 17:52
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
10710
在线时间
2027 小时
注册时间
2013-6-10
帖子
1498
2
发表于 2021-9-21 13:19:15 | 显示全部楼层
这个问题可能和mv获取到的width和height有关。以我的游戏为例




在不同窗口大小下,canvas的宽高是自动更新的。然而,这是在浏览器模拟手机的情况下是这样。如果是电脑的话,就会出现你所说的情况。

能想到的简单易行的办法只有一个,就是更改userAgent,让游戏误认为是手机在访问。
要实现这一点,还是需要改动游戏的默认代码。
  1.         <script>
  2.             var customeUserAgent = "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.81 Mobile Safari/537.36";
  3.             Object.defineProperty(navigator,'userAgent',{value:customeUserAgent,writable:false});
  4.         </script>
复制代码
将这段代码插入到游戏index.html的<body>标签之中,就是有一大堆script标签的那里。

然后再访问游戏就会实现你想要的效果,放到iframe的框架里也会自适应的。


点评

等你好了... 我查了搜尋引擎好久...也查不到可以自適應的IFRAME的定位方式... >_<  发表于 2021-9-22 02:07
不过那个定位方式怎么搞我现在还不知道,你可以问问其他大佬或自己研究下,要么等我国庆节回家想想办法。  发表于 2021-9-21 23:13
如果你的iframe是用我上次给你的定位方式肯定会跑掉的,可以试试其他定位方式,比如用显示图片的定位方式肯定就没问题。  发表于 2021-9-21 23:12
我又仔細的看了一遍...好像顯示圖片是沒有跑掉...不過我的腳本IFRAME位置全部都跑掉了...因為那些對我很重要...  发表于 2021-9-21 23:05
如果游戏测试的窗口缩放不影响图片位置,那我这个也不会影响,如果图片位置能正确显示,游戏里内嵌的iframe也用显示图片的定位方式就好了。  发表于 2021-9-21 22:45
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
10710
在线时间
2027 小时
注册时间
2013-6-10
帖子
1498
3
发表于 2021-10-2 22:17:34 | 显示全部楼层
本帖最后由 小怪兽奇奇侠 于 2021-10-3 10:26 编辑

你好,我现在回家了。由于看到你上次游戏不稳Lagg的帖子里讲你在把你的游戏移植到mz,所以我就按mz来说下我的办法。   
<br />

首先得说明一下,我的办法仅改动了定位原点,iframe的完全自适应需要开发者的配合。
(这是因为游戏里内嵌的iframe的宽高和坐标是由开发者写死的,是多少像素就是多少像素,不会跟着游戏的大小变。)
如果开发者在开发的时候坐标和宽高都用百分比来写,就可以实现完全自适应。



下边说一下改动定位原点的办法:
(原先的定位原点是在窗口左上角,现在改为了canvas左上角,这样可以实现准确定位。)   
首先,iframe是在dom层的,游戏里图片定位是在canvas里进行的,这二者有本质区别,所以无法按canvas内部的定位方式给dom里生搬硬套。
由于当前技术的发展,canvas标签里还不可以直接放其他标签,我个人的办法是构造一个和canvas一样的空容器,然后在这个空容器里放iframe实现定位。
这个方法会对mz核心作一些微小的改动,但不会影响其他程式的运行,为了保险起见,在修改核心前请先备份一下原文件。
具体做法如下:
首先,在js文件夹下找到rmmz_core.js这个文件,搜索Graphics._createCanvas,找到这个函数,这个函数底下还紧跟了一个updateCanvas的函数,将这两个函数替换成
  1. Graphics._createCanvas = function() {
  2.     //canvas 构造
  3.     this._canvas = document.createElement("canvas");
  4.     this._canvas.id = "gameCanvas";
  5.     //构造一个和canvas一样的空容器
  6.     this._div = document.createElement("div");
  7.     this._div.id = "iframeDiv";
  8.     //空容器的更新工作与canvas的一起运行
  9.     this._updateCanvas();
  10.     document.body.appendChild(this._canvas);
  11.     document.body.appendChild(this._div);
  12. };

  13. Graphics._updateCanvas = function() {
  14.     //更新canvas
  15.     this._canvas.width = this._width;
  16.     this._canvas.height = this._height;
  17.     this._canvas.style.zIndex = 1;
  18.     //更新空容器
  19.     this._div.width = this._width;
  20.     this._div.height = this._height;
  21.     this._div.style.zIndex = 999999;
  22.     //更新二者
  23.     this._centerElement(this._canvas);
  24.     this._centerElement(this._div);
  25. };
  26. function clickexit(){
  27.     document.getElementById("clickexit").innerHTML="";
  28.     document.getElementById("iframeDiv").innerHTML="";
  29.     };
复制代码

然后我上次给你的iframe代码也需要作相应的改动。
调用iframe的代码改为
  1. x="http://rpg.blue/";
  2. pp = document.getElementById("iframeDiv");
  3. pp.innerHTML = "<font style='position:absolute;left:220px;top:0px;' id='clickexit' onclick='clickexit()'>X</font><iframe src='" + x + "'style='position:absolute;top:0px;left:0px;z-index:999;width:200px;height:200px;'></iframe>";
复制代码
其中top,left的数值为你想要的坐标。width与height的值除了px外,还可以用%和其他单位,left和top同理。
之前那段放在插件里的clickexit()方法整合到了rmmz_core.js中,成为核心文件的一部分了,所以之前放在插件里的相应代码可以删去了。

这是我在本地测试的效果,iframe随游戏分辨率自适应。


你可以试试效果怎么样。
附:这是在mv上的效果


我也认为mv比mz好一点,至少从体感来讲,mv游戏对显卡要求不高,我开mz游戏的时候电脑会变卡,运作的声音也会特别厉害,就和开3d游戏一样。


点评

啊,经你这么一说,确实是有办法不用改那么多,加几行代码就可以!大小和位置都可以用像素,内嵌的iframe也会自适应的办法。具体方法看我回复。  发表于 2021-10-4 00:37
我已經做了好多遊戲了...全部都要改我投降了.我原本的想法是 只是在最外面的IFRAME加上一個參數就行了...我太天真了.哈哈  发表于 2021-10-3 22:41
不过做改动也有技巧,百分比的数值是可以通过原坐标值和游戏宽高之比做运算的,在data文件夹里各个map的json用代码编辑器的替换功能改应该快很多。  发表于 2021-10-3 14:22
恩..确实。用百分号是为了让大小和位置能很精确的到想要的地方。这是我的错,要是一开始就让你用百分比来定位的话会轻松很多,效果也会比较完美  发表于 2021-10-3 14:19
我在設計遊戲的時候 還是單純一點用 畫素來定位比較好用....不然 %.... 真的好恐怖 >_<  发表于 2021-10-3 13:45
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
10710
在线时间
2027 小时
注册时间
2013-6-10
帖子
1498
4
发表于 2021-10-4 01:00:29 | 显示全部楼层
本帖最后由 小怪兽奇奇侠 于 2021-10-4 01:13 编辑

经过你刚刚那么一讲,我忽然想到了一个坐标和大小都可以用像素值,iframe还可以自适应的办法。
虽然不像仅在外层iframe加点料那么简单,不过原理也很好懂,也非常简单。
需要改动的地方有三处
第一处:对mv1.6而言,在rpg_core.js里搜索Graphics._centerElement,在他的下边新定义一个名为scaleElement的方法,具体代码如图
  1. Graphics._scaleElement = function(element){
  2.     element.style.transform = "scale("+ this._realScale +")";
  3. }
复制代码
第二处:还是我楼上介绍的代码,其中的updataCanvas方法做一点改动,改为
  1. Graphics._updateCanvas = function() {
  2.     //更新canvas
  3.     this._canvas.width = this._width;
  4.     this._canvas.height = this._height;
  5.     this._canvas.style.zIndex = 1;
  6.     //更新空容器
  7.     this._div.width = this._width;
  8.     this._div.height = this._height;
  9.     this._div.style.zIndex = 999999;
  10.     //更新二者
  11.     this._centerElement(this._canvas);
  12.     this._centerElement(this._div);
  13.     this._scaleElement(this._div);
  14. };
复制代码
其他方法和楼上给的保持一致。
第三处:index.html里在head标签内加入以下代码:
  1.         <style type="text/css">
  2.         #iframeDiv{-webkit-transform-origin: 0 0;transform-origin: 0 0;-moz-transform-origin: 0 0;-o-transform-origin: 0 0;}
  3.         </style>
复制代码
如图


做了以上改动后,事件中呼出iframe的脚本如图所示,可以看到用的都是像素。

游戏中的效果是


iframe自适应。

这么做的原理是,使用了css3的transform属性,他会按照缩放游戏的比率自动缩放装着iframe的空容器,进而缩放iframe和关闭按钮。
为了保证缩放后iframe的位置不会发生偏差,缩放原点设为了左上角,和定位原点一致,这样可以确保缩放后iframe不会跑掉。
因此你可以使用像素来进行大小和坐标的设置,当分辨率发生变化时,rpg_core.js会自动处理。


以上三处的改动非常容易,但如果你呼叫iframe的代码用的是我去年给你的那个代码,那也是需要做改动的。
按你所说的情况,要改动的地方相当多,在mv编辑器里改非常麻烦。
其实这个改动也非常简单。相对于去年的代码,需要改动的地方是
ErrorPrinter 改为 iframeDiv
fixed 改为 absolute
没错...只有这两处而已.......
你可以用代码编辑器的查找与替换功能,在data下的map的json文件里改,
如果你的代码编辑器是vscode,用这个功能,选定你游戏的data文件夹查找与替换,那么你游戏内所有呼出的iframe都将被修正。

这会非常迅速....


点评

这个updateCanvas是在5楼代码的基础上改进的,5楼发的createcanvas和clickexit也要加进去。  发表于 2021-10-4 11:51
第二步怪怪的...我試了幾次都不行....  发表于 2021-10-4 11:39
01.外部就是 RPG_CODE + INDEX.HTM 02.遊戲內部就是 DATA 用替代關鍵字的. 我馬上來試試看... ^_^  发表于 2021-10-4 10:05
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
10710
在线时间
2027 小时
注册时间
2013-6-10
帖子
1498
5
发表于 2021-10-4 17:34:45 | 显示全部楼层
你会不会是哪里没改好呀?这是我把你的代码放进去了出来的效果。



顺带一问,你的mv版本是1.6.1吗?

实在不行那是这吧,你把你的index.html和rpg_core.js先都备份一下,我把我的index.html和rpg_core.js给你。
一般来讲,无论你用什么插件,都不会涉及到这两个文件的。
你直接往进换,然后在用你刚刚的代码试试效果。
Fixiframe.zip (41.62 KB, 下载次数: 23)


点评

解决了就好。ヽ(*´з`*)ノ  发表于 2021-10-4 20:03
只是我實在不懂 到底我漏改了5樓哪裡...不過不管了...反正現在都正常了! 你是在是太厲害了! 讚讚讚讚!  发表于 2021-10-4 20:03
完美!!!!!!! 竟然全部都OK了!!!!!!! 太強了!!!!!!!  发表于 2021-10-4 19:47
瀏覽器是用 CHROME 64BITS  发表于 2021-10-4 19:12
顺带一问,你是什么浏览器啊?index.html里的代码没有兼容ie浏览器,如果你是用ie访问的话,在花括号里还得写-ms-transform-origin: 0 0;才行。  发表于 2021-10-4 17:42

评分

参与人数 1+1 收起 理由
play337 + 1

查看全部评分

回复 支持 1 反对 0

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-5-16 04:22

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表