我正在制作简单的Flash游戏,我只是制作角色控件(向左,向右和向左移动)。当我加重力时,我的角色从舞台上掉下来。
我已经绘制了地板,导入到库中,但我不知道代码应该是什么样子。
我的地板被称为“地面”我添加了AS Linkage“Ground”。
现在我的代码如下: (注意:我的角色被命名为“英雄”)
public class Script extends MovieClip{ // start the script
private const gravity:int = 1;
private const max_speed:int = 8;
private const walkspeed:int = 4;
private const jumpspeed:int = 10;
private var forecast_x:int;
private var forecast_y:int;
private const start_x:int = 50;
private const start_y:int = 50;
private var left:Boolean;
private var up:Boolean;
private var right:Boolean;
private var space:Boolean;
private var level:Array = new Array();
private var Map_data:Data = new Data; // create a version of the Data.as
private var Hero_col:collision_manager = new collision_manager;
private var Hero:hero = new hero;
public function Script(){ // the init (will only be runned once)
//BuildMap();
create_hero();
addEventListener(Event.ENTER_FRAME, main);
stage.addEventListener(KeyboardEvent.KEY_DOWN, key_down);
stage.addEventListener(KeyboardEvent.KEY_UP, key_up);
Hero_col.Setup(25,level,Hero);
}
private function main(event:Event){
update_hero();
}
private function key_down(event:KeyboardEvent){
if(event.keyCode == 37){
left = true;
}
if(event.keyCode == 38){
up = true;
}
if(event.keyCode == 39){
right = true;
}
}
private function key_up(event:KeyboardEvent){
if(event.keyCode == 37){
left = false;
}
if(event.keyCode == 38){
up = false;
}
if(event.keyCode == 39){
right = false;
}
}
private function create_hero(){
addChild(Hero);
Hero.x = start_x;
Hero.y = start_y;
Hero.x_speed = 0;
Hero.y_speed = 0;
}
private function setDirection(param) {
if (param == 0) {
Hero.scaleX = 1;
} else {
Hero.scaleX = -1;
}
}
private function update_hero(){
Hero.y_speed += gravity;
if(left){
Hero.x_speed = -walkspeed;
setDirection(1);
}
if(right){
Hero.x_speed = walkspeed;
setDirection(0);
}
if(up && Hero_col.can_jump){
Hero.y_speed = -jumpspeed;
}
if(Hero.y_speed > max_speed){
Hero.y_speed = max_speed;
}
forecast_y = Hero.y + Hero.y_speed;
forecast_x = Hero.x + Hero.x_speed;
Hero_col.solve_all(forecast_x, forecast_y);
Hero.x_speed = 0;
}
感谢您的帮助。
答案 0 :(得分:1)
你需要有几个布尔变量来检查英雄是否在场上,以及重力是否应用。因此,如果他到达地板或特定区域,您必须将重力设置为假,而不是像您在此处一样更新每一帧:Hero.y_speed += gravity;
如果你按空格键,你需要让角色跳跃,然后通过将布尔设置为真来应用重力,之后,当它击中地板时,你应该禁用重力,再次跳跃。
void update(float delta) {
if (grounded) {
// ground based movement and actions
// check to see if the spacebar was pressed to jump
if (sf::Keyboard::isKeyPressed(sf::Keyboard::Space) {
ya = -40; // go up 40 pixels per second
grounded = false;
}
} else {
// air based movement and actions
// apply gravity
ya += GRAVITY * delta;
}
// movement and collision work after you've figured out the x and y acceleration of the player
y += ya * delta;
}