我是AS3的新手,不得不为学校做一个瓷砖平台,遗憾的是我的老师帮不上忙。我一点也不知道如何在我的游戏中获得碰撞。我已经在互联网上找了一段时间了,真的找不到解决方案。如果你知道任何可以帮助我进步的东西,请留下评论!
package {
import flash.display.*;
import flash.events.*;
import flash.utils.Timer;
import flash.events.TimerEvent;
import flash.geom.Rectangle;
import flashx.textLayout.formats.BlockProgression;
import flashx.textLayout.formats.BackgroundColor;
public class jump extends MovieClip {
//Var player
var persoon:testSubject = new testSubject();
var grond:Ground = new Ground();
var backGround:Background = new Background();
var health:Health = new Health();
var mapWidth = 10;
var mapHeight = 10;
var tileSide = 50;
var totalTiles = mapWidth * mapHeight;
var accel:Number = 2;
var speed:Number = 5;
var jumpSpeed:Number = 0;
var gravity:Number = 5;
var ground:Number = 745 - persoon.height;
var nr:Number = 3;
var sprint:Boolean = true;
var shiftButton:Boolean = false;
var leftButton:Boolean = false;
var rightButton:Boolean = false;
var upButton:Boolean = false;
var downButton:Boolean = false;
var isJumping:Boolean = true;
//Array map
var myMap:Array = [
[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],
[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
[1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
[1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
[1,0,0,1,1,1,1,1,1,1,1,0,0,0,1,3,2,4,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
[1,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
[1,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
];
public function jump() {
//Event listener up key
stage.addEventListener(KeyboardEvent.KEY_DOWN, upKeyDown);
stage.addEventListener(KeyboardEvent.KEY_UP, upKeyUp);
stage.addEventListener(Event.ENTER_FRAME, moveChar);
//backGround
backGround.x = -1000;
backGround.y = -1000;
backGround.height = 2000;
backGround.width = 6000;
addChild(backGround);
//Map
for (var i:int=0; i<13; i++)
{
for (var u:int=0; u<36; u++){
var cell:MovieClip = new tile();
cell.gotoAndStop(myMap[i][u]+1);
cell.x=tileSide*u
cell.y=tileSide*i
addChild(cell);
}
}
//Player
persoon.x = 450;
persoon.y = 490;
persoon.width = 50;
persoon.height = 60;
addChild(persoon);
//Healthbar
health.x = 10;
health.y = 65;
health.gotoAndStop(4);
addChild(health);
}
//Spring function when key is pressed
public function upKeyDown(e:KeyboardEvent):void {
//Buttons Left - Up - Right - Down - Shift
if ( e.keyCode == 37 || e.keyCode == 65 ) {
leftButton = true;
trace(persoon.y);
}
if ( e.keyCode == 38 || e.keyCode == 87 ) {
upButton = true;
if(!isJumping) {
jumpSpeed = 31;
isJumping = true;
}
}
if ( e.keyCode == 39 || e.keyCode == 68 ) {
rightButton = true;
}
if ( e.keyCode == 40 || e.keyCode == 83 ) {
downButton = true;
}
if ( e.keyCode == 16 ) {
shiftButton = true;
if ( sprint == true ) {
speed = speed * accel;
sprint = false;
}
}
}
//Spring function when key is released
public function upKeyUp(e:KeyboardEvent):void {
//Buttons Left - Up - Right - Down - Shift
if ( e.keyCode == 37 || e.keyCode == 65 ) {
leftButton = false;
}
if ( e.keyCode == 38 || e.keyCode == 87 ) {
upButton = false;
}
if ( e.keyCode == 39 || e.keyCode == 68 ) {
rightButton = false;
}
if ( e.keyCode == 40 || e.keyCode == 83 ) {
downButton = false;
}
if ( e.keyCode == 16 ) {
shiftButton = false;
speed = 5;
sprint = true;
}
}
//Character Movement
public function moveChar(event:Event):void {
//Collision
//Walk Left & Right
if ( leftButton == true ) {
if (persoon.x > 78) {
persoon.x -= speed;
health.x = persoon.x - 440;
}
} else if ( rightButton == true ) {
if ( persoon.x < 1722 ) {
persoon.x += speed;
health.x = persoon.x - 440;
}
}
//Jump
if(isJumping) {
health.y -= jumpSpeed;
persoon.y -= jumpSpeed;
jumpSpeed -= 2;
}
if (persoon.y + gravity < ground) {
persoon.y += gravity;
health.y += gravity;
trace(persoon.y);
} else {
health.y = ground - 420;
persoon.y = ground;
isJumping = false;
}
//Camera
root.scrollRect = new Rectangle ( persoon.x - stage.stageWidth/2, persoon.y - 430, stage.stageWidth, stage.stageHeight );
}
}
}
发布于 2014-11-19 18:52:37
扩展DisplayObject
类的任何东西都可以使用hitTestObject()
函数。它允许您检测两个对象是否接触或相交。
它的实现是直接公平的:
if (obj1.hitTestObject(obj2) == true)
{
//hit
}
根据屏幕上资源的实现方式,您还可以使用BitmapData.hitTest()
来检测两个位图是否发生了冲突。这更精确,因为它允许您声明alph通道。您可以在该here上找到一个很好的教程
发布于 2014-11-19 18:13:35
如果你想有真正好的碰撞(物理),那么你肯定需要一个像Box2D这样的物理引擎!但要进入它,你必须掌握一点学习曲线,但我保证绝对值得深入研究它。
请注意: Box2D最初是用C++开发的,但是有很多移植到不同语言的端口,比如AS3、Javascript、Java等等。这就是为什么你有时不得不参考原始文档,因此闪存端口的文档非常好。
这里有一些很好的教程:
由于您正在构建一个平铺平台,请看一下tiled,它将为您手动编写地图提供服务。另外,我可以推荐你去看看melonjs,这是一个很好的基于瓦片的平台游戏引擎。这些教程可以向你展示工作流程,这对你来说应该与flash非常相似。如果你需要一个浏览器游戏,并且没有绑定到…,我建议你切换到HTML5并使用melonjs flash
祝好运!
发布于 2014-11-19 18:25:13
对于您的情况,对于非常简单的碰撞检测,我将假设您的瓦片可以由正方形表示,并且玩家是一个矩形。有了这两点,您需要编写的新代码的主要部分将是查找两个通用矩形的交叉量(因为正方形也是一个矩形)。如果您愿意,您可以在rectangle类中使用内置的方法,也可以编写自己的方法(它并不太复杂)。
接下来,在你的玩家移动中,你可以存储它,并使用上面的矩形和矩形交集方法,检查玩家是否会跑到实心的瓷砖上,而不是直接将移动应用到玩家身上。如果他们这样做了,那么通过限制他们被允许移动的量,然后将其应用于玩家,来阻止/限制玩家跑到它上面。
这只是许多方法中的一种,甚至我在这里描述的方法也可以改进。
https://stackoverflow.com/questions/27012482
复制相似问题