新手想学as游戏开发,求前辈布置任务。。
flash吧
全部回复
仅看楼主
level 6
fengsser 楼主
初来人生地不熟,@ 两个橙名的大神前辈
@
tcdw2011
@
亚瑟王的咖喱棒
就是出些游戏开发常遇到的操作 或者算法 或者自己研究的小例子什么的 出题目就可以了 然后我做完后再来请老师们指导 或者求新题目 谢谢谢谢谢谢谢谢~[揉脸]

2012年11月10日 09点11分 1
level 6
fengsser 楼主
居然都没@ 到 [揉脸]
@
亚瑟王的咖喱棒
@
tcdw2011

2012年11月10日 09点11分 2
2012年11月10日 09点11分
2012年11月10日 09点11分
level 13
出题:
方向键控制人物移动,人物有四个朝向。
2012年11月10日 11点11分 3
level 8
嘿嘿,题难度有的,找点素材吧!人物!
2012年11月10日 13点11分 4
level 6
fengsser 楼主
AS3版本:
先上一半,这里游戏角色用的MovieClip,关于人物的行走动画问题,可以在MC的帧上放上角色行走序列图,角色向哪个方向行走,命令MV gotoAndPlay()相应的帧即可,在相应动作的最后一帧goto回相应动作的第一帧可实现动画循环。
但角色用MovieClip来创建虽然简单,这不是比较好的方法,因为很吃内存。比较好的方法应该是用位图实现,明天就来学这个吧。
public class Character extends MovieClip{ var controller:Controller;
var speed:number = 5;
var walkDirection:uint;
public static const UP:uint = 1;
public static const DOWN:uint = 2;
public static const LEFT:uint = 3;
public static const RIGHT:uint = 4;
public function Character(ctrl:Controller;){
controller = ctrl;
controller.setController(this);//把自己安装给控制器
controller.startListener():
}
public function move(){
switch(walkDirection){
case UP:
y - = speed;
break;
case DOWN:
y + = speed;
break;
case LEFT:
x - =speed;
break;
case RIGHT:
x + =speed;
break;
}
}
} public class Controller{
var _target:Character;//控制对象
var directionArr:Array = new Array(37,38,39,40);
public function Controller(){
}
public function setController(obj:Character){
_target = obj;
}
public fcuntion startListener():void{
Global.stage.addEventListener(KeyboardEvent.KEY_DOWN,onKeyDown);
Global.stage.addEventListener(KeyboardEvent.KEY_UP,onKeyUp);
}
protected function onKeyDown(e:KeyboardEvent){
switch(e.keyCode){
case 38:
_target.walkDirection = Character.UP;
break;
case 40:
_target.walkDirection = Character.DOWN;
break;
case 37:
_target.walkDirection = Character.LEFT;
break;
case 39:
_target.walkDirection = Character.RIGHT;
break;
}
}
protected function onKeyUp(e:KeyboardEvent){
if(directionArr.indexof(e.keyCode) != -1){
_target.walkDirection = 0;
}
}
} public class Global(){
//全局变量类
var static stage:Stage;
public function Global(){
}
}
public class Game{
//游戏入口
var objList:Array;//游戏活动对象
var player:Character;
public function Game(_stage:Stage){
Global.stage = _stage;
objList = new Array();
player = new Character(new Controller());
player.x = Global.stage.width >> 1;
player.y = Global.stage.height >> 1;
Global.stage.addChild(player);
Global.stage.addEventListener(Event.ENTER_FRAME, render);
}
public function render(e:Event){
for(var obj:Character in bjList){
obj.move();
}
}
} public class Main extends Sprite {
var game:Game = new Game(this.stage);
}
2012年11月10日 15点11分 5
你这as3的给你出题的人都难懂!呵呵
2012年11月11日 01点11分
你点的那两橙名中有一个是AS2的……你发AS3。
2012年11月11日 04点11分
@薛振梁 没关系吧= = 不是让老师前辈们看代码啦 只是证明我做了而已 也是学习记录。至于用2还是3其实最终效果一样就可以啦~ 。如果是算法有关,那么谈论思路就可以啦,也不用看代码
2012年11月11日 06点11分
回复 fengsser :其实我是来看稀奇的,我用AS2……
2012年11月18日 01点11分
level 6
fengsser 楼主
经过学习。。终于找到用位图显示人物行走动画的思路了,花费的时间比我想象中长一点主要还是对BitmapData 和 Bitmap 类不熟悉。大概方法就是用一个Bitmap作为显示对象,addchild到stage上,然后把BitmapData设定到Bitmap上 通过BitmapData.draw()方法更新渲染Bitmap。 具体实现时,可以用一个数组存储各人物行走动画帧的BitmapData数据 通过数组下标的改变,draw不同的BitmapData 实现行走动画。 然后刷新的时间,大概用Timmer类来实现?具体再看看吧,晚点写代码。
又发现一名橙名前辈,先记着 @
BlackOak 
2012年11月12日 08点11分 6
这里修复一下 加载的时候先draw 然后bitmap再set相应的bitmapData
2012年11月16日 14点11分
你可以研究一下RPGMakerXP中的原理,那很有启发
2012年11月25日 02点11分
回复 亚瑟王的咖喱棒 :嗯 很久以前玩过一会儿RM 里面的单元格地图和纸娃娃系统印象比较深刻。
2012年11月25日 13点11分
level 9
还想听题么?
2012年11月16日 14点11分 7
请说[Yeah]
2012年11月16日 14点11分
level 9
先来点轻的
此乃位图,请获取棕白交界处的点坐标并存入一维数组中。
2012年11月16日 15点11分 8
这个图我想到了Box2d做tiny wings 的教程= = 这种处理真没接触过 我想想
2012年11月16日 15点11分
最开始的想法是保存成位图格式,像素,然后素描整张图,从左到右,下到上,判断颜色是否变化,变化了就记录坐标。。步长按需要。。不知道对不对 我看看可行性还有有没别的办法
2012年11月16日 16点11分
有什么办法呢?想知道怎么获得位图坐标,求详解
2012年11月16日 23点11分
level 6
fengsser 楼主
import flash.net.URLRequest;
import flash.display.Loader;
import flash.events.Event;
import flash.display.BitmapData;
import flash.display.Bitmap;
import flash.geom.Point;
var url:URLRequest = new URLRequest("source.png");
var loader:Loader = new Loader();
var stepX:Number = 1;//横坐标步长
var stepY:Number = 1;//纵坐标步长
var arr:Array = new Array(); //存放坐标的数组
loader.contentLoaderInfo.addEventListener(Event.COMPLETE,onComplete);
loader.load(url);
function onComplete(e:Event):void{
var l:LoaderInfo = e.target as LoaderInfo;
var bitmap:Bitmap = l.content as Bitmap;
doBitmapData(bitmap.bitmapData);
}
function doBitmapData(sourceImg:BitmapData){
var imgWidth = sourceImg.width;
var imgHeight = sourceImg.height;
var i:Number =0;//横坐标
var j:Number;//纵坐标
遍历源图每个步长的像素点
while(i<=imgWidth){
j =0;
while(j<imgHeight){
if(sourceImg.getPixel(i,j)!=sourceImg.getPixel(i,j+stepY)){
arr.push(new Point(i,j+stepY));
break;
}
else{
j+=stepY;
}
}
i+=stepX;
}
trace("ok");
trace(arr);
}
2012年11月23日 17点11分 9
2012年11月23日 17点11分
回复 fengsser :哈很好,还想听题就再说
2012年11月24日 04点11分
回复 fengsser :用折半查找法或许能提升点效率
2012年11月24日 04点11分
回复 micocyd2009 :请继续[Yeah]
2012年11月25日 01点11分
level 6
fengsser 楼主
结果
(x=0, y=169),(x=1, y=167),(x=2, y=166),(x=3, y=165),(x=4, y=164),(x=5, y=163),(x=6, y=162),(x=7, y=162),(x=8, y=161),(x=9, y=160),(x=10, y=158),(x=11, y=157),(x=12, y=156),(x=13, y=155),(x=14, y=154),(x=15, y=153),(x=16, y=152),(x=17, y=151),(x=18, y=151),(x=19, y=150),(x=20, y=149),(x=21, y=148),(x=22, y=147),(x=23, y=146),(x=24, y=146),(x=25, y=145),(x=26, y=144),(x=27, y=144),(x=28, y=143),(x=29, y=143),(x=30, y=142),(x=31, y=141),(x=32, y=141),(x=33, y=141),(x=34, y=140),(x=35, y=139),(x=36, y=139),(x=37, y=139),(x=38, y=138),(x=39, y=137),(x=40, y=137……………………
2012年11月23日 17点11分 12
level 6
fengsser 楼主
改进一下doBitmapData(sourceImg:BitmapData),在纵方向的遍历上使用折半查找的方法,经过计算,原来盲目遍历的循环的次数是5万多次,现在只用 2千多次,有了很大的提升
function doBitmapData(sourceImg:BitmapData){
var imgWidth = sourceImg.width;
var imgHeight = sourceImg.height;
var i:Number =0;//横坐标
var j:Number;//纵坐标
//遍历源图每个步长的像素点
while(i<=imgWidth){
var low =0;
var high = imgHeight;
//折半查找
while(low<high){
var mid = Math.round((low + high) >> 1 );
if(sourceImg.getPixel(i,mid) == sourceImg.getPixel(i,low)){
if(sourceImg.getPixel(i,mid)!=sourceImg.getPixel(i,mid+stepY)){
arr.push(new Point(i,mid+stepY));
break;
}
low = mid + stepY;
}
else{
if(sourceImg.getPixel(i,mid)!=sourceImg.getPixel(i,mid-stepY)){
arr.push(new Point(i,mid));
break;
}
high = mid - stepY;
}
}
i+=stepX;
}
}
2012年11月25日 13点11分 14
很犀利
2012年11月27日 17点11分
level 6
fengsser 楼主
各位师父求新题[Yeah]
2012年11月25日 14点11分 15
新题来了
2012年11月26日 19点11分
level 4
[拍砖]求教!
2012年11月26日 13点11分 16
求题[拍砖]
2012年11月26日 13点11分
回复 fengsser :求教[拍砖]怎么用鼠标拖动一个球,然后碰到 障碍物会爆炸。
2012年11月26日 14点11分
回复 Ariue_ :大概就是 MouseEvent.MOUSEUP MouseEvent.MOUSEDOWN MC.startDrug MC.stopDrug 然后是hitTestObject 返回true false new一个爆炸MC
2012年11月27日 02点11分
回复 fengsser :[拍砖]能不能把做完的借我研究一下。。我是超级新手。。邮箱[email protected]
2012年11月27日 08点11分
level 9
场景中有大小完全相同的100个正方体,且坐标一直在舞台内变化,请判断它们是否两两相撞。
2012年11月26日 19点11分 19
level 5
前排
学习
2012年11月27日 00点11分 20
level 12
我也来出一个,我一直没有解决的问题:场景中的主角:player._mc;
场景中有一个mc是地图:Map_mc;
Map_mc里面attach了300个怪物:Monster0~Monster299;
Map_mc里面同时存在很多的障碍物:block_mc0~blck_mc299;
问题:如何调整深度?当player._mc纵坐标小于怪物或者遮挡物时,显示在他们的后面。
2012年11月28日 00点11分 21
不懂2.0怎么解决的,3.0是用网格型碰撞检测的变体搞定的。
2012年11月28日 08点11分
回复 micocyd2009 :是啊,我2.0拿他没办法
2012年11月29日 00点11分
level 6
fengsser 楼主
做出来了 先上张效果图 用的网格型碰撞检测方法 数量在100的时候还是十分流畅的 但到130就开始感觉出掉帧了。
2012年11月28日 17点11分 22
level 6
fengsser 楼主
接下来是代码
Main.as
package
{
import flash.display.MovieClip;
import classes.*;
/**
* ...
* @author fengsser
*/
public class Main extends MovieClip
{
//[SWF(width = "550", height = "400", backgroundColor = "0x000000", frameRate = "30")]
public function Main() {
var game:Game = new Game(this.stage);
}
}
}
2012年11月28日 17点11分 23
level 6
fengsser 楼主
package classes
{
import flash.display.BitmapData;
import flash.display.Stage;
import flash.events.Event;
import flash.display.DisplayObject;
/**
* ...
* @author fengsser
* 游戏入口
*/
public class Game
{
var _stage:Stage;
var cubeArr:Vector.<DisplayObject>;//存放cube对象,Vctor对象代替数组增加效率
var cubeNum:uint = 120;//方块总数
//var sourceBMD:BitmapData;
var cubeSize:int = 10;
var girdCollision:GridCollision;
public function Game(_stage:Stage) {
this._stage = _stage;
cubeArr = new Vector.<DisplayObject>();
init();
}
public function init():void {
//sourceBMD = new BitmapData(this.cubeSize,this.cubeSize, false, 0x0066ff);
makeCube();//创建方块
girdCollision = new GridCollision(this, 45);//网格碰撞类
this._stage.addEventListener(Event.ENTER_FRAME, render);//渲染
}
public function makeCube():void {
for (var i = 0; i < cubeNum; i++ ) {
var cube:Cube = new Cube(this);
cube.x = Math.round(Math.random()*(this._stage.stageWidth-cubeSize)+cubeSize/2);
cube.y = Math.round(Math.random()*(this._stage.stageHeight-cubeSize)+cubeSize/2)
cubeArr.push(cube);
this._stage.addChild(cube);
}
}
public function render(e:Event):void {
for (var i in cubeArr) {
var cube:Cube = cubeArr[i] as Cube;
cube.run();//让方块移动
girdCollision.checkGrid();//碰撞检测
}
}
}
}
2012年11月28日 17点11分 24
1 2 尾页