私はフラッシュでレーシングゲームを作成する方法を理解しようとしています(すでにWeb上にある多くのチュートリアルのように)。
ただし、レベルを静的に保ち、車を動かす代わりに、画面の中央でプレーヤーの車を動かさずに保ち、プレーヤーの周りでレベルを回転させることは可能ですか?
私はフラッシュでレーシングゲームを作成する方法を理解しようとしています(すでにWeb上にある多くのチュートリアルのように)。
ただし、レベルを静的に保ち、車を動かす代わりに、画面の中央でプレーヤーの車を動かさずに保ち、プレーヤーの周りでレベルを回転させることは可能ですか?
うん。
あなたがしたいのは、車を他のすべて(移動/回転したいすべて)とは異なるクリップに配置し、車を変形(移動/回転)するときはいつでも、すべてに逆を適用することですそうしないと。
これはトップダウンだと思います。たとえば、車が通常移動するy軸の上のすべてのピクセルで、他のすべてのピクセルを同じ量だけy軸の下に移動します。
同様に、通常は車を回転させる正の度ごとに、同じ度数の負の角度で他のすべてを回転させるようになりました。
もう1つ心配しなければならないのは、画面の端を使用する前に、永遠に移動できるようになるため、世界の端を作成することです。
これがあなたが望むことをするはずの実行可能なデモです。上、左、下、右のキーを使用して車を制御します。
重要なものは、下部近くの最後の5行または6行にあります。
package {
import flash.display.Sprite;
import flash.events.Event;
import flash.events.KeyboardEvent;
import flash.ui.Keyboard;
public class Untitled2 extends Sprite{
private var level:Sprite = new Sprite();
private var car:Sprite = new Sprite();
private var carVelocityX:Number = 0;
private var carVelocityY:Number = 0;
private var keyLeft:Boolean;
private var keyRight:Boolean;
private var keyUp:Boolean;
private var keyDown:Boolean;
public function Untitled2(){
level.graphics.lineStyle(4, 0xFF0000);
level.graphics.drawRect(0, 0, stage.stageWidth, stage.stageHeight);
car.graphics.beginFill(0x000000);
car.graphics.moveTo( -5, -5);
car.graphics.lineTo( 5, -5);
car.graphics.lineTo( 8, 0);
car.graphics.lineTo( 5, 5);
car.graphics.lineTo( -5, 5);
addChild(level);
level.addChild(car);
car.x = 100;
car.y = 100;
addEventListener(Event.ENTER_FRAME, onEnterFrame, false, 0, true);
stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown, false, 0, true);
stage.addEventListener(KeyboardEvent.KEY_UP, onKeyUp, false, 0, true);
}
private function onKeyUp(event:KeyboardEvent):void{
if(event.keyCode == Keyboard.LEFT)
keyLeft = false;
else if(event.keyCode == Keyboard.RIGHT)
keyRight = false;
else if(event.keyCode == Keyboard.UP)
keyUp = false;
else if(event.keyCode == Keyboard.DOWN)
keyDown = false;
}
private function onKeyDown(event:KeyboardEvent):void{
if(event.keyCode == Keyboard.LEFT)
keyLeft = true;
else if(event.keyCode == Keyboard.RIGHT)
keyRight = true;
else if(event.keyCode == Keyboard.UP)
keyUp = true;
else if(event.keyCode == Keyboard.DOWN)
keyDown = true;
}
private function onEnterFrame(event:Event):void{
// Other stuff for controlling the car
carVelocityX *= 0.98;
carVelocityY *= 0.98;
car.x += carVelocityX;
car.y += carVelocityY;
if(keyLeft) car.rotation -= 7;
if(keyRight) car.rotation += 7;
var carRotationRadians:Number = car.rotation / 180 * Math.PI;
if(keyUp){
var speed:Number = Math.sqrt(carVelocityX * carVelocityX + carVelocityY * carVelocityY);
speed += 0.1;
carVelocityX = Math.cos(carRotationRadians) * speed;
carVelocityY = Math.sin(carRotationRadians) * speed;
}
if(keyDown){
carVelocityX *= 0.8;
carVelocityY *= 0.8;
}
// Add 90 degrees because we want the car pointing up
carRotationRadians += Math.PI * 0.5
// Rotate the cars position to get its stage coordinates
var carX:Number = Math.cos(-carRotationRadians) * car.x - Math.sin(-carRotationRadians) * car.y;
var carY:Number = Math.sin(-carRotationRadians) * car.x + Math.cos(-carRotationRadians) * car.y;
// Position and rotate the level
level.rotation = -car.rotation - 90; // Add 90 degrees because we want the car pointing up
level.x = stage.stageWidth * 0.5 - carX;
level.y = stage.stageHeight * 0.5 - carY;
}
}// End class Untitled2
}// End package