当前位置: 首页 > 知识库问答 >
问题:

我应该在3.5.4中的草图中的哪个位置插入单个字符的精灵?

益楷
2023-03-14

我需要建立一个简单的大学游戏,我已经下载了一个游戏角色的一些png精灵,但是我还不太熟悉应该在哪里组合所有精灵来移动角色。下面是我的基本代码的截图,它在屏幕上放置了一个背景。我只需要一些关于代码结构的指导。精灵应该放在哪里?

截图

共有1个答案

公良飞尘
2023-03-14

如果你的游戏角色已经被很好地剪掉了,并且有一个透明的背景,你应该能够像加载背景一样加载它。就文件位置而言,它应该位于草图文件夹中或草图文件夹中名为data的文件夹中:

  • PImage sprite=loadImage(“yourSpriteHere.png”) 将加载一个字符的图像
  • 图像(精灵,0,0) 将在左上角渲染
  • 您可以定义并使用float x,y变量它的位置可以在按键时更新

假设您有一个包含myAwesomeCharacter.png的草图,基本测试草图如下:

// how many pixels per frame the character moves
float charSpeed = 1.5;
// current character position
float charX, charY;
// character image
PImage charImage;

void setup(){
  size(300, 300);
  // load image
  charImage = loadImage("myAwesomeCharacter.png");
}

void draw(){
  // update keys
  if(keyPressed){
    if(keyCode == UP && charY > 0){
      charY -= charSpeed;
    }
    if(keyCode == DOWN && charY < height){
      charY += charSpeed;
    }
    if(keyCode == LEFT && charX > 0){
      charX -= charSpeed;
    }
    if(keyCode == RIGHT && charX < width){
      charX += charSpeed;
    }
  }
  // render
  background(0);
  image(charImage, charX, charY);
}

还不清楚你是要自上而下、侧视图还是其他视图:这可能会改变你更新角色移动的方式。

此外,还不清楚是否有一个静态角色图像或精灵表图像,其中一个图像包含多个姿势,例如行走循环动画。如果是这种情况,你可以在spritesheets上找到一个详细的答案:在p5中。然而,从p5中调整小的语法变化应该是微不足道的。js在需要时进行处理:

// full spritesheet
PImage spriteSheet;
// a sprite sampling from sprite sheet
PImage mario;

// 8 frames in the spritesheet
int numSprites   = 8;
// each sprite in the sheet has this bounding box
int spriteWidth  = 18;
int spriteHeight = 24; 
// start frame
int spriteIndex  = 1;

void setup(){
  size(150,150);
  frameRate(24);
  noSmooth();
  noFill();
  spriteSheet = loadImage("mario.png");
  // create an image to draw a single sprite into
  mario = createImage(spriteWidth,spriteHeight, RGB);
}
// set all pixels (R,G,B,A) to the same value (e.g. clear image with a colour)
void setAllPixels(PImage image,int brightness){
  // prep. pixels for manipulation
  image.loadPixels();
  int numPixels = image.pixels.length;
  // loop through all pixels (spriteWidth * spriteHeight * colourChannels(4))
  for(int i = 0 ; i < numPixels; i++){
    image.pixels[i] = brightness;
  }
  // commit value changes to image: updates it all in one go, more efficient than set()
  image.updatePixels();
}

void draw(){
  // clear frame
  background(255);
  // display the whole sprite sheet
  image(spriteSheet,0,0);
  // increment sprite index
  spriteIndex++;
  // reset sprite index if out of bounds
  if(spriteIndex >= numSprites){
    spriteIndex = 0;
  }
  // visualise sprite copy rect
  rect(spriteIndex * spriteWidth,0,spriteWidth,spriteHeight);
  
  // clear mario image
  setAllPixels(mario,color(255));
  // copy pixels from sprite sheet into sprite
  // copy (source image, source coordinates(x,y,w,h), destination coordiantes (x,y,w,h) )
  mario.copy(spriteSheet,
             spriteIndex * spriteWidth,0,spriteWidth,spriteHeight,
             0                        ,0,spriteWidth,spriteHeight);
             
  // display mario sprite
  image(mario,mouseX,mouseY+spriteHeight);
}

马里奥。png数据:

data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJAAAAAYCAYAAAAVpXQNAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTQwIDc5LjE2MDQ1MSwgMjAxNy8wNS8wNi0wMTowODoyMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTggKE1hY2ludG9zaCkiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MzE1ODI1MkNDQ0MzMTFFOEJFNjA5ODI5Q0U0NzlGOEEiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MzE1ODI1MkRDQ0MzMTFFOEJFNjA5ODI5Q0U0NzlGOEEiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpFM0U1NkY3RkNDQTMxMUU4QkU2MDk4MjlDRTQ3OUY4QSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpFM0U1NkY4MENDQTMxMUU4QkU2MDk4MjlDRTQ3OUY4QSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PszND6MAAAXWSURBVHja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

 类似资料:
  • 问题内容: 我要如何转换会计总帐号 99999999999999999 到 999-99999-99-9999.999 在对MSSQL Server 2005的查询中 我不需要更新数据,只需将STRING转换为查询即可。 表格:GLM_MASTER__ACOUNT字段:帐户 谢谢。 问题答案: 使用STUFF()的另一种方法

  • 问题内容: 我设计了10多个站点,但我仍然对“我应该使用正确的单位是什么”有个疑问。无论是px还是em或%。请引导我正确的方向 编辑1:用于版式(特别是对于容器盒) 问题答案: 根据上下文的不同单位。如果有一个最适合每种情况的单位,那么就不会有那么多单位。 按照经验法则: 如果您正在处理屏幕媒体: 使用的字体大小 使用的图像 使用,或表示盒子尺寸 线高使用比例 如果您使用打印介质: 最好避免(无论

  • 下面这2段代码有区别吗? 我好奇为啥都是生成的,位置还变了。。。 laravel 11

  • 问题内容: 目的: 在Golang中的字符串中每x个字符插入一个字符 输入: 预期产量: 尝试次数 尝试一次 结果是: 尝试两次 计算字符数 对于循环 如果X = 5,则插入一个 尝试三 扫描结合加入 问题 目前尝试两次和三次不包含代码段的原因是,我仍在思考应该使用哪种方法在Golang中的字符串中每X个字符插入一个字符。 问题答案: https://play.golang.org/p/HEGbe

  • 问题内容: 我想通过在“处理”中仅使用一个草图来创建两个窗口。 我想做的是,如果我在一个窗口中单击一个按钮,则某些图像会出现在另一个窗口中。 我搜索了Google并找到了一些示例。实际上,我在此“堆栈溢出网络”中发现了相同的问题。这里是链接。 在处理中 http://forum.processing.org/one/topic/multiple- windows-2-4-2011.html中 创建

  • 我正在制作一个程序来玩Connect 6,Connect 4的变体,你必须连续获得6的序列,并且无论下面有多少个棋子,棋子都可以放置在任何未占用的空间中。 我目前正在使用Minimax和Alpha Beta修剪。我想用换位表来加快速度。 然而,我显然不能在我的换位表中保留所有可能的板子,所以我如何决定保留哪些板子? 我的换位表目前是[1000000][4]数组,因此可以存储400万个电路板状态。