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

Project1

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

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

[复制链接]

Lv4.逐梦者

梦石
0
星屑
7667
在线时间
1437 小时
注册时间
2018-12-16
帖子
2026
跳转到指定楼层
1
发表于 2021-9-18 12:35:35 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
請問如何讓輸出後的HTML5遊戲可以跟隨IFRAME指定視窗大小?

<iframe id=Game allowfullscreen="true" webkitallowfullscreen="true" mozallowfullscreen="true" oallowfullscreen="true" msallowfullscreen="true" src="https://遊戲網址/index.html" width="816" height="624" scrolling="no" frameborder="0" marginwidth="0" marginheight="0" ></iframe>

01.如果我把 816X624 改成 700X500
就會變成 遊戲很大... IFARME 很小

02.01.如果我把 816X624 改成 1024X768
就會變成 遊戲很小... IFARME 很小

就是遊戲的大小都不會跟著IFRAME改變

P.S 但是我在測試遊戲的時候 不論我怎麼改變遊戲視窗大小. 整個遊戲都會自動跟著變大變小... 是自動的...不需要改

Lv4.逐梦者

梦石
0
星屑
11175
在线时间
2066 小时
注册时间
2013-6-10
帖子
1516
来自 9楼
发表于 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

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
11175
在线时间
2066 小时
注册时间
2013-6-10
帖子
1516
2
发表于 2021-9-18 16:32:05 | 只看该作者
如果游戏分辨率是816x624的话,iframe的宽高也设置成一样的就好了。

点评

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

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
9852
在线时间
1884 小时
注册时间
2020-1-2
帖子
1089
3
发表于 2021-9-18 18:13:41 | 只看该作者
小怪兽奇奇侠 发表于 2021-9-18 16:32
如果游戏分辨率是816x624的话,iframe的宽高也设置成一样的就好了。

https://www.jianshu.com/p/0bd8b462dac1
虽然不太懂 也没事过如果可以让玩家像上面链接一样选择指定的大小呢包含全屏什么的

点评

然後是使用IFRAME呼叫這個網頁(可任意定義大小).目前MV都需要指定大小.無法任意大小.但奇怪的是.測試遊戲時卻可以任意大小?  发表于 2021-9-19 01:28
我想要的是.跟MV你按測試遊戲的時候NW.JS叫出的那個視窗.你怎麼更改大小.遊戲設置都不會跑掉的那個功能  发表于 2021-9-19 01:27
我認真的研究了一下.這些代碼是IFRAME自適應目標大小.但是當目標無法更改大小.這些IFRAME就無效了...  发表于 2021-9-19 01:26
https://blog.csdn.net/xyr05288/article/details/46416059 https://wenda.so.com/q/1534102298219086 虽然不太懂坐你看看吧  发表于 2021-9-18 20:49
這個跟 YEP 核心 插件 更改解析度差不多... 都是在遊戲裡面改...我想在遊戲外面可用IFRAME改...  发表于 2021-9-18 20:07
B站没人气的夏目漠漠,直播间:5378938实用插件教程点击红字传送
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
11175
在线时间
2066 小时
注册时间
2013-6-10
帖子
1516
4
发表于 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
星屑
11175
在线时间
2066 小时
注册时间
2013-6-10
帖子
1516
5
发表于 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
星屑
11175
在线时间
2066 小时
注册时间
2013-6-10
帖子
1516
6
发表于 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
星屑
7667
在线时间
1437 小时
注册时间
2018-12-16
帖子
2026
7
 楼主| 发表于 2021-10-4 11:36:23 | 只看该作者
加了這個 得到了...

JAVASCRIPT 代码复制
  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. };


点评

_createCanvas你有没有改?我在5楼发的代码也要使用的  发表于 2021-10-4 11:48
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
7667
在线时间
1437 小时
注册时间
2018-12-16
帖子
2026
8
 楼主| 发表于 2021-10-4 15:45:06 | 只看该作者
改了5樓之後...剛剛那個錯誤就消失了...

不過現在變成 在遊戲裡面腳本用的那個 IFRAME 明明已經取代的兩個變數了...

畫面還是大到衝出去 >_<



JAVASCRIPT 代码复制
  1. //崁入視窗
  2. x="http://rpg.blue/";
  3. pp = document.getElementById("iframeDiv");
  4. pp.innerHTML = "<font color='#ff0000' style='position:absolute;left:0px;top:0px;' id='clickexit' onclick='clickexit()'>X</font><iframe src='" + x + "'width='644' height='362' style='position:absolute;top:250px;left:5px;' frameborder='0' scrolling='no'></iframe>";

回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
7667
在线时间
1437 小时
注册时间
2018-12-16
帖子
2026
10
 楼主| 发表于 2021-10-5 09:11:28 | 只看该作者
現在又跳出另一個問題.... 不知道為什麼會有插件衝突 ...
我看了一下
MousePointerExtend.js
rpg_managers.js:1949 TypeError: Cannot read property 'style' of null
    at Function.Graphics.updateMousePointer (MousePointerExtend.js:601)
    at Function.Graphics.setPointerType (MousePointerExtend.js:580)
    at Function.SceneManager.updateMousePointer (MousePointerExtend.js:536)
    at Function.SceneManager.updateScene (MousePointerExtend.js:521)
    at Function.SceneManager.updateMain (rpg_managers.js:1983)
    at Function.SceneManager.update (rpg_managers.js:1907)
    at Function.SceneManager.update (MPP_EncounterEffect.js:1344)
SceneManager.catchException @ rpg_managers.js:1949
rpg_managers.js:1919 Uncaught TypeError: Cannot read property 'style' of null
SceneManager.onError @ rpg_managers.js:1919
rpg_managers.js:1920 chrome-extension://njgcanhfjdabfmnlmpmdedalocpafnhl/js/plugins/MousePointerExtend.js 601
SceneManager.onError @ rpg_managers.js:1920
MousePointerExtend.js:601 Uncaught TypeError: Cannot read property 'style' of null
    at Function.Graphics.updateMousePointer (MousePointerExtend.js:601)
    at Function.Graphics.setHiddenPointer (MousePointerExtend.js:571)
    at Function.TouchInput._onMouseMove (MousePointerExtend.js:559)




MousePointerExtend.zip (4.2 KB, 下载次数: 2)
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-18 17:45

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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