GameCanvas全屏尺寸的问题

网页游戏开发基础——Canvas基本图形绘制 Canvas是HTML5新增的一个标签,你可以把它翻译为画布,通过它可以绘制二维或三维图形,有了它就可以不用安装flash而实现复杂的动画功能。 阅读详情

很多人都问过我这个问题,解释了很多遍,干脆写出来。

Q: 为什么我在setFullScreenMode(true)后,调用getWidth(),getHeight()得到的屏幕尺寸比实际尺寸小?

A: 因为当Canvas没有被显示时,调用setFullScreenMode(true)后,并不会立即生效。在生效过后,系统会回调sizeChanged(int w, int h) 来通知屏幕大小已经改变。
public void sizeChanged(int w,int h){
    this.screen_width=w;
    this.screen_height=h;
}


摘自MIDP2.0 spec, Canvas.sizeChanged():
If the size of a Canvas changes while it is not visible, the implementation may choose to delay calls to sizeChanged until immediately prior to the call to showNotify. In that case, there will be only one call to sizeChanged, regardless of the number of size changes.

我已在Nokia6600测试过了,结果为 176 X 208

PS: 有的人的解决办法是调用 setFullScreenMode()后,sleep()一段时间,然后再调用getWidth()/getHeight().这样可能能解决问题,但并不能保证得到的结果一定是正确的。

测试代码如下:

//TestCanvas.java
import javax.microedition.lcdui.*;
import javax.microedition.lcdui.game.*;

public class TestCanvas extends GameCanvas implements Runnable {
  int[] sw = new int[20];
  int[] sh = new int[20];
  String[] msgs = new String[20];
  private int id = 0;
  private void update(String msg){
      update(msg, getWidth(), getHeight());
  }
  private void update(String msg, int w, int h){
      if( id < sw.length-1 ){
          msgs[id] = msg;
          sw[id] = w;
          sh[id++] = h;
      }
  }
 
  public TestCanvas() {
    super(false);
    update("BeforeSet");
    setFullScreenMode(true);
    update("AfterSet");
  }
  public void sizeChanged(int w, int h){
      update("sizeChanged(w,h)", w, h);
      update("sizeChanged()");
  }
  public void run(){
      while(true){
          repaint();
          serviceRepaints();
          try {  Thread.sleep(50);  }
          catch (InterruptedException ex) {  }
      }
  }
  public void paint(Graphics g){
      if( getWidth() != sw[id-1] || getHeight() != sh[id-1] )
        update("paint()");
     
      g.setColor(0xffffff);
      g.fillRect(0, 0, 176, 208);
      int fh = g.getFont().getHeight();
      g.setColor(0);
      for(int i = 0 ;i < id; i ++ )
          g.drawString(msgs[i] + "   /t" +sw[i]+","+sh[i], 1, i*fh, 20);
     
  }
}

//TestCanvas.java
import javax.microedition.lcdui.*;
import javax.microedition.lcdui.game.*;

public class TestCanvas extends GameCanvas implements Runnable {
  int[] sw = new int[20];
  int[] sh = new int[20];
  String[] msgs = new String[20];
  private int id = 0;
  private void update(String msg){
      update(msg, getWidth(), getHeight());
  }
  private void update(String msg, int w, int h){
      if( id < sw.length-1 ){
          msgs[id] = msg;
          sw[id] = w;
          sh[id++] = h;
      }
  }
 
  public TestCanvas() {
    super(false);
    update("BeforeSet");
    setFullScreenMode(true);
    update("AfterSet");
  }
  public void sizeChanged(int w, int h){
      update("sizeChanged(w,h)", w, h);
      update("sizeChanged()");
  }
  public void run(){
      while(true){
          repaint();
          serviceRepaints();
          try {  Thread.sleep(50);  }
          catch (InterruptedException ex) {  }
      }
  }
  public void paint(Graphics g){
      if( getWidth() != sw[id-1] || getHeight() != sh[id-1] )
        update("paint()");
     
      g.setColor(0xffffff);
      g.fillRect(0, 0, 176, 208);
      int fh = g.getFont().getHeight();
      g.setColor(0);
      for(int i = 0 ;i < id; i ++ )
          g.drawString(msgs[i] + "   /t" +sw[i]+","+sh[i], 1, i*fh, 20);
     
  }
}

微信小游戏开发实战:从零实现经典消除游戏“消灭星星” 在移动游戏开发领域,Canvas渲染与性能优化是构建流畅体验的核心基础。其原理在于通过直接操作位图API进行图形绘制,相比成熟游戏引擎,能实现更精细的渲染控制和极致的包体压缩,这对于有严格大小限制的微信小游戏平台尤为重要。这项技术的核心价值在于,它使开发者能在资源受限的环境下,依然能交付高性能、快加载的轻量级游戏产品,广泛应用于休闲益智类小游戏的开发。本文将以经典消除游戏“消灭星星”为具体案例,深入探讨如何运用Canvas渲染与性能优化策略,结合微信小游戏生态的工程化实践,从零构建一个完整可上线的项目。 阅读详情

相关推荐

微信小游戏开发实战:从零拆解“汉字找茬”源码架构与实现

微信小游戏开发是当前移动端轻量化游戏开发的重要方向,其核心在于利用微信生态的社交传播能力和原生Canvas渲染技术,高效构建互动应用。从技术原理上看,微信小游戏框架提供了基于Canvas 2D或WebGL的绘图API,开发者需要掌握数据驱动渲染、事件交互处理以及资源管理等核心概念。其技术价值在于能够快速实现高性能的2D游戏,并轻松集成社交分享、广告变现等商业化功能,尤其适合开发像“汉字找茬”这类玩法简单、易于传播的益智类游戏。在应用场景上,这类游戏充分利用了用户的碎片化时间,通过低门槛的汉字识别玩法,结合排

weixin_30565199的博客 413

unity | Game界面Canvas模式和相关的相机基础-如何在Game界面上显示两个相机画面

如何在Game界面上显示两个相机画面,相机和画面位置的设置

菌菌兹的博客 2744

实战指南:R语言多组倾向评分逆概率加权(IPTW)建模与结果解读

本文详细介绍了如何使用R语言实现多组倾向评分逆概率加权(IPTW)建模,包括数据预处理、倾向评分估计、权重计算及结果解读。通过实战案例演示,帮助研究者掌握这一统计方法,有效平衡多组混杂因素,模拟随机对照试验效果,适用于医学、社会科学等领域的数据分析。

weixin_42528534的博客 395

GameCanvas类

GameCanvas类 继承于MIDP 1.0的Canvas类的GameCanvas是一个提供了游戏的基本接口的抽象类,除了完全具备原来Canvas类的功能外,还提供了更多开发游戏的便 利,主要为:提供屏幕缓冲绘制机制,并能直接得到设备键盘的物理状态。 3.2.1  GameCanvas概述 GameCanvas(游戏画布)对象能够提供画布的功能,类的定义为: public abstrac

VS_URL的专栏 1969

在实战中学AI-车流量统计项目-YOLOV11车辆检测-YOLOV11模型的部署

考虑实际落地中部署推理资源消耗,速度与模型精度之间的均衡,同时,车辆属于比较通用场景的目标检测,我们将YOLOV11作为最终的模型选择,目前官方开源的模型基于coco数据集训练,里面已经包含了车辆相关类别,经测试,在监控视角下效果基本可用,所以,在落地过程中,我们先用这个模型来打通部署链路,后面再逐步优化模型性能。在Nvidia的硬件下做部署,部署框架优先选择官方框架TensorRT,下面重点讲述如何用TensorRT部署YOLOV11模型。

Aleo_优快云的博客 2166

拆解英飞凌CoolGaN:如何用Silvaco TCAD仿真评估功率GaN HEMT的关键性能(BV、Qg、开关损耗)

本文详细解析了如何使用Silvaco TCAD仿真工具评估英飞凌CoolGaN功率GaN HEMT的关键性能指标,包括击穿电压(BV)、栅电荷(Qg)和开关损耗。通过精确建模极化效应、优化边缘终端结构以及高频开关损耗仿真技术,为功率器件工程师提供了一套完整的'设计-仿真-验证'方法论,助力GaN HEMT在快充、数据中心电源等领域的应用。

weixin_29159995的博客 427

用HTML5制作精美战机游戏

其中的background bullet这些图片你可用使用自己想要图片进行替换。代码和图片压缩包完整下载链接---☄️爬虫JS逆向系列专栏 -☄️python系列专栏 -话不多说直接上代码!

ZTLJQ的博客 7896

LLC混合滞回控制 vs 电压模/电流模:UCC25640x仿真对比与选型指南

在开关电源设计中,LLC谐振变换器的环路补偿是核心难点。传统电压模控制(VMC)和电流模控制(CMC)在LLC拓扑上存在环路增益漂移、动态响应慢等局限。混合滞回控制通过滞回比较器直接调制开关频率,并融合输出电压与谐振腔电流信息,实现了自适应环路增益和快速瞬态响应。该技术显著提升轻载效率与动态性能,适用于高密度适配器、快充及车载充电机等场景。本文基于UCC25640x系列,通过仿真对比三种控制策略,为工程选型与调试提供实践参考。

weixin_33925615的博客 334

J2ME游戏画布

GameCanvas类     继承于MIDP 1.0的Canvas类的GameCanvas是一个提供了游戏的基本接口的抽象类,除了完全具备原来Canvas类的功能外,还提供了更多开发游戏的便利,主要为:提供屏幕缓冲绘制机制,并能直接得到设备键盘的物理状态。GameCanvas概述     GameCanvas(游戏画布)对象能够提供画布的功能,类的定义为:public abstr

lengyuhong的专栏 1027

UDS $27服务DLL文件生成

UDS 27算法 DLL文件生成

hkj8808的博客 1282

IsaacGym四足机器人sim to real全过程详细解析(walk these ways方法)

本文使用强化学习的方法运行到Aliengo机器人上完成从训练到部署的全过程。该方法使用的是GO1机器人提供了完整的sim to real代码和遥控器控制代码,所以我们只需要重新训练和部署健康就可以使用在Aliengo上。该方法使用lcm进行通讯首先程序通过UDP和机器人控制板进行通讯获取机器人状态并下达指令。然后又通过lcm进行机器人状态信息的发布和模型命令的获取。

weixin_44061195的博客 2万+

使用Codex客户端与GPT-5.6 Sol Ultra模型快速生成2D游戏原型

AI代码生成技术正深刻改变软件开发流程,其核心原理是基于大规模代码库训练的语言模型,能够根据自然语言描述生成可运行的代码片段。这项技术的价值在于极大提升了原型构建和功能验证的效率,尤其适用于游戏开发、工具脚本编写等需要快速迭代的场景。在实际应用中,开发者通过配置AI助手客户端(如Codex)并接入高性能模型(如GPT-5.6 Sol Ultra),可以将创意描述直接转化为可执行的HTML5 Canvas游戏代码,实现从设计到可玩原型的快速闭环。本文将以一个名为“Moonlight & Mayhem”的2D游

weixin_33834075的博客 1107

弱小目标检测跟踪算法研究(5) 基于顶帽变换(Top_hat)算法的红外弱小目标检测之背景抑制

基于顶帽变换(Top_hat)算法的红外弱小目标检测之背景抑制1. 前言2. 顶帽变换(Top_hat)算法3. Matlab仿真4. 小结 1. 前言 红外图像中的弱小目标,目标属性包涵“弱"和“小’’两个方面:“弱’’是指目标在红外波长上所表现出来的强度,具体反映到所拍摄的红外图像上,就是指目标的灰度值;而“小’’是指目标的尺寸大小,也就是前面所述的成像面积很小,反映到红外图像上就是指目标所占的像素数目很少。 SPIE国际光学工程学会(Societyof Photo一0ptical Instrument

sinat_34897952的博客 5292

java canvas类_java 手机游戏中 Game Canvas类

Public abstract class GameCanvas extends CanvasGameCanvas类提供了基本游戏用户界面。除此之外继承了Canvas类的功能(commands,input 事件,等等),它也提供特定的游戏功能,比如离屏缓冲区和查询按键状态的能力。每一个GameCanvas类的实例都会创建一个专用的缓冲区。一旦为每个GameCanvas实例提供了唯一的缓冲区,它更适...

weixin_39593427的博客 295

DataEase 未授权+远程代码执行漏洞复现(CVE-2025-49001、CVE-2025-49002)

DataEase 是一款开源的数据分析平台,提供丰富的数据可视化和分析功能,帮助用户轻松地进行数据探索和决策支持。近日,有关DataEase 被爆出多个漏洞,其中 CVE-2025-49001 是由于JWT校验机制错误导致攻击者可伪造JWT令牌绕过身份验证流程,CVE-2025-49002 是由于H2数据库模块没有严格过滤用户输入的JDBC连接参数,可使用大小写绕过补丁。攻击者可利用这些漏洞实现未授权代码执行,威胁用户数据和系统的安全。

李同學AI安全 1947

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

canvas 实现全屏怎么做

在上述代码中,我们首先获取Canvas元素,然后定义了两个函数 `enterFullscreen()` 和 `exitFullscreen()`,分别用于进入和退出全屏模式。在进入全屏模式时,我们首先判断当前浏览器是否支持Fullscreen API,然后调用相应的方法将Canvas元素全屏显示。在退出全屏模式时,我们也是根据浏览器的支持情况来调用相应的方法。最后,我们监听了全屏状态变化事件 `fullscreenchange`,当Canvas元素进入或退出全屏模式时,会触发该事件,从而执行相应的操作。

Gjesus33的博客 1948

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

记录cocos creator index.html里设置gamecanvas 的display为none导致的无法点击场景的bug

问题产生: 需要在原生js里切换cocos场景和原生场景。所以刚开始就把gameCanvas的display设置成为了none。过一会儿条件达到再显示。但是导致的问题是场景里的按钮无法点击。 简单还原: 这样一秒后游戏场景显示,但是按钮无法点击。 开始破案: 破案的时候,用调试模式打包。这样就可以利用调用堆栈进行调试。 我们先不隐藏和显示,然后点击按钮查看调用堆栈。 嗯,正常走到了doSome的函数。 然后我们先隐藏后显示。因为我们知道肯定不能走到doSome。所以就往后一步步.

q314235965的专栏 866

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

使用GameCanvas制作星空效果

http://www.3geye.net/bbs/thread-164-1-1.html MIDP2.0中提供了游戏开发专用的API,比如GameCanvas等类。他们位于javax.microedition.lcdui.game包内。本文介绍GameCanvas的基本使用方法并实现一种滚动星空的效果。您可以参考Game Canvas Basic获得更详细的信息。     GameCanvas是...

无花的专栏 443

使用MIDP2.0开发游戏 (1) GameCanvas基础

MIDP2.0提供了对游戏的强有力支持,通过javax.microedition.lcdui.game包,原来在MIDP1.0中很多需要自己写的功能现在都被当作标准API实现了,包括GameCanvas,Sprite,Layer等等。 我们将使用MIDP2.0编写一个坦克大战的手机游戏,我也是初学J2ME不久,准备边看书边做,争取把这个游戏做出来!J2ME高手请多指点,和我一样学习中的朋友欢迎多...

mmdev 204

GameCanvas快速开发吧.[小糊涂的灵感]

Midp 2.0 Game Api 不同于 1.0 提供了 GameCanvas快速开发吧. Midp 1.0 使用 Low Level Device 来处理完成. 不用 Nokia的界面包/Mid包的话?还是Nokia的Mid包也可以支持别的设备播放? 画像素的方法. 翻转等一些特效? 运动轨迹,移动 和效果什...

183

能给我讲讲gameCanvas吗?

问题同上!谢谢!

jiaoao9693的博客 402

gameCanvas.js射击小游戏demo

下载地址基于gameCanvas.js类库实现的射击小游戏demodd:

ICode联盟 407
上一篇: 当我们把一个Image画到它本身上面...
下一篇: Nokia资源文件路径的问题
Timium
博客等级 码龄22年 0粉丝 16原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值