Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 12.03.2012, 14:53
Feigi вне форума Посмотреть профиль Отправить личное сообщение для Feigi Найти все сообщения от Feigi
  № 11  
Ответить с цитированием
Feigi

Регистрация: Mar 2012
Сообщений: 29
Hard Coder, такого не может быть. Он двигается каждый раз на 20, и также всегда (х-10)%20=0. То же самое для (у-10)%20=0.

Такой уж был масштаб. Начинается x=310 y=10. И постоянно меняется только на +-20.

Добавлено через 1 минуту
Всем большое спасибо! Буду стараться помогать другим

Старый 12.03.2012, 15:09
HardCoder вне форума Посмотреть профиль Отправить личное сообщение для HardCoder Найти все сообщения от HardCoder
  № 12  
Ответить с цитированием
HardCoder
 
Аватар для HardCoder

блогер
Регистрация: Apr 2011
Сообщений: 583
Записей в блоге: 2
Окей... Не может, так не может... Значит здесь именно ретерн нужен. Если вам интересно знать в чем была ошибка, читайте дальше - это полезно знать:
Змея начинает по иксу движение с 310 к нулю.
310 - 20 = 290 - 20 = 270...........50 - 20 = 30 - 20 = 10.
Сейчас она на x = 10, ни одно условие не выполнилось. Змея дальше лезет к нулю.
В следующем кадре ее икс опять уменьшается на 20 и стает еще меньше - "-10", потому что 10 - 20 = - 10.
Так как "-10" меньше чем "10", то выполняется условие:
Код AS3:
if(head.x<10......)
      game_over();
Игра закончилась. Ретерна нет, код продолжает выполнятся:
Код AS3:
if (map[(head.x-10)/20][(head.y-10)/20]==1)
И вот тут программа вам говорит, что в массиве НЕТ ТАКОГО ЭЛЕМЕНТА map[-1][еще какой-то там]. Откуда взялось? Все просто: map[(-10 - 10)/20 = -1]
__________________
Я мало чего умею, но зато хорошо умею учиться...


Последний раз редактировалось HardCoder; 12.03.2012 в 15:11.
Старый 12.03.2012, 15:10
Feigi вне форума Посмотреть профиль Отправить личное сообщение для Feigi Найти все сообщения от Feigi
  № 13  
Ответить с цитированием
Feigi

Регистрация: Mar 2012
Сообщений: 29
Всем большое спасибо! Вот исправленный код, кому интересно. Буду стараться помогать другим

Код AS3:
package{
import flash.display.Sprite;
import flash.display.Stage;
import flash.events.Event;
import flash.events.KeyboardEvent;
import flash.display.MovieClip;
 
	public class Game{
		private var head:Snake_head;
		private var map:Array;
		private var turnQueue:Array;
		private var direction:uint=40;
		private var sprite:Sprite;
		private var stage:Stage;
		private var paused:Boolean=true;
		private var snake:Vector.<Snake_body>;
		private var bonus:Bonus;
 
		public function Game(stage:Stage){
			bonus = new Bonus();
			snake = new Vector.<Snake_body>();
			this.stage=stage;
			sprite=new Sprite();
			stage.addChild(sprite);
			sprite.graphics.lineStyle(6,0x000000);
			sprite.graphics.beginFill(0x0095D3);
			sprite.graphics.drawRect(0, 0, 600,600); 
			sprite.graphics.endFill();
 
			map=new Array(31);
			for (var i:int = 0; i < 31; i++) {
				map[i] = new Array(31);
			}
 
			stage.addEventListener(Event.ACTIVATE,onActivate);
 
			turnQueue=new Array();
 
			stage.addEventListener(KeyboardEvent.KEY_DOWN, reactToKey);
			head=new Snake_head;
			sprite.addChild(head);
			head.x=310;
			head.y=10;
			map[15][0]=head;
			place_food();
			head.addEventListener(Event.ENTER_FRAME,onEnterFrame);
 
 
		}
 
		private function onEnterFrame(event:Event):void{
			if (!paused){
				var x_:int=head.x;
				var y_:int=head.y;
				var segment:Snake_body=new Snake_body();
 
				if (turnQueue.length!=0)
					direction=turnQueue.shift();
 
				if (direction==37){
					head.x-=20;
				}
				if (direction==38){
					head.y-=20;
				}
				if (direction==39){
					head.x+=20;
				}
				if (direction==40){
					head.y+=20;
				}
				if(head.x<10 || head.x>590 || head.y<10 || head.y>590){
					moveSnake(x_,y_);
					game_over();
					return;
				}
 
				if (map[(head.x-10)/20][(head.y-10)/20]==1){
					moveSnake(x_,y_);
					game_over();
					return;
				}
 
				if (map[(head.x-10)/20][(head.y-10)/20]==2){
					sprite.removeChild(bonus);
					segment.x=x_;
					segment.y=y_;
					map[(x_-10)/20][(y_-10)/20]=1;
					snake.push(segment);
					sprite.addChild(segment);
					place_food();
				}
				else
					moveSnake(x_,y_);
			}
		}
 
		private function moveSnake(x_:int,y_:int):void{
			if (snake.length>0) map[(x_-10)/20][(y_-10)/20]=1;
			if (snake.length>0) map[(snake[0].x-10)/20][(snake[0].y-10)/20]=0;
			for(var i:int=snake.length-1;i>-1;i--){
				var tmp_x:int=snake[i].x;
				var tmp_y:int=snake[i].y;
				snake[i].x=x_;
				snake[i].y=y_;
				x_=tmp_x;
				y_=tmp_y;
			}
		}
		private function reactToKey(event:KeyboardEvent):void{
			 var keyCode:uint=event.keyCode;
			if ( Math.abs(direction - keyCode)!=2 &&
				 keyCode > 36 && keyCode < 41 && keyCode!=turnQueue[turnQueue.length-1]){ 
				 turnQueue.push(keyCode);
 
			 } // arrow keys pressed (37 = left, 38 = up, 39 = right, 40 = down)... 
 
		}
 
		private function onDeactivate(e:Event):void {
			stage.removeEventListener(Event.DEACTIVATE,onDeactivate);
			stage.addEventListener(Event.ACTIVATE,onActivate);
			paused=true;
		}
		private function onActivate(e:Event):void {
			stage.removeEventListener(Event.ACTIVATE,onActivate);
			stage.addEventListener(Event.DEACTIVATE,onDeactivate);
			paused=false;
		}
 
		private function place_food():void{
			var x_:int;
			var y_:int;
 
			do{
				x_= Math.round((Math.random()*29));
				y_= Math.round((Math.random()*29));
			}while(map[x_][y_]==1 || (x_*20+10==head.x &&  y_*20+10==head.y) );
			bonus.x=x_*20+10;
			bonus.y=y_*20+10;
			map[x_][y_]=2;
			sprite.addChild(bonus);
		}
 
		private function game_over():void{
			paused=true;
			head.removeEventListener(Event.ENTER_FRAME,onEnterFrame);
			stage.removeEventListener(KeyboardEvent.KEY_DOWN, reactToKey);
			trace("game over");
 
		}
 
	}
}
Добавлено через 1 минуту
Уже исправила! Большое спасибо!

Создать новую тему Ответ Часовой пояс GMT +4, время: 23:38.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 23:38.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.