とてとてとて

涼しくなりましたねー。秋ですねー。秋というのに特に書くことないんですねー。


前回に引き続きこの子をちょっと触りました。


できること:ローリング、ジャンプ、だけ。

制御は完全スクリプト主体で、ジャンプの着地直後にローリングすると、ジャンプ後の硬直時間を省略できる。という処理とか勢いで加えてたら、分け分からんくなりました。一週間後にはまったく読めなくなっていること請け合い。
ActionActuatorの扱いが難しい。バグなのか仕様なのか、色々意味不明。


今後ますます作業時間が少なくなっていくことを考えると、一人で作業していても何にもなりやしないので、もっとコミュニティ性のあることをして、他の人を巻き込んでいきたいなーっと思うようになっているのですが、僕の性格と器量では、他人を振り回して終わるような気がしてならない。BGEは良い材料になると思うんですけどね。


そういうことは一人で何か完成させてから、っと思ってたんだけどなー(遠い目




ちなみにソース(笑)はこんな感じ

初期処理
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
195:
196:
197:
198:
199:
200:
201:
202:
203:
204:
205:
206:
207:
208:
209:
210:
211:
212:
213:
214:
215:
216:
217:
218:
219:
220:
221:
222:
223:
224:
225:
226:
227:
228:
229:
230:
231:
232:
233:
234:
235:
236:
237:
238:
239:
240:
241:
242:
243:
244:
245:
246:
247:
248:
249:
250:
251:
252:
253:
254:
255:
256:
257:
258:
259:
260:
261:
262:
263:
264:
265:
266:
267:
268:
269:
270:
271:
272:
273:
274:
275:
276:
277:
278:
279:
280:
281:
282:
283:
284:
285:
286:
287:
288:
289:
290:
291:
292:
293:
294:
295:
296:
297:
298:
299:
300:
301:
302:
303:
304:
305:
306:
307:
308:
309:
310:
311:
312:
313:
314:
315:
316:
317:
318:
319:
320:
321:
322:
323:
324:
325:
326:
327:
328:
329:
330:
331:
332:
333:
334:
335:
336:
337:
338:
339:
340:
341:
342:
343:
344:
345:
346:
347:
348:
349:
350:
351:
352:
353:
354:
355:
356:
357:
358:
359:
360:
361:
362:
363:
364:
365:
366:
367:
368:
369:
370:
371:
372:
373:
374:
375:
376:
377:
378:
379:
380:
381:
382:
383:
384:
385:
386:
387:
388:
389:
390:
391:
392:
 
scene = GameLogic.getCurrentScene()
obs = scene.objects
 
cont = GameLogic.getCurrentController()
 
 
class Data:
def __init__(self):
 
self.obs = Objects()
self.sens = Sensors()
self.acts = Actuators()
 
 
class Objects:
def __init__(self):
 
self.arm = obs["OBPlayerArm"]
self.loc = obs["OBPlayerLoc"]
self.roc = obs["OBPlayerRoc"]
self.direc = DirectionObjects()
 
self.cam = obs["OBCamera"]
self.camLoc= obs["OBCameraLoc"]
 
 
class DirectionObjects(list):
def __init__(self):
for i in range(9):
self.append(None)
 
self[1] = self.n = obs["OBRocN"]
self[2] = self.ne = obs["OBRocNE"]
self[3] = self.e = obs["OBRocE"]
self[4] = self.se = obs["OBRocSE"]
self[5] = self.s = obs["OBRocS"]
self[6] = self.sw = obs["OBRocSW"]
self[7] = self.w = obs["OBRocW"]
self[8] = self.nw = obs["OBRocNW"]
 
 
class Sensors:
def __init__(self):
sens = cont.owner.sensors
 
self.up = sens["UpArrow"]
self.down = sens["DownArrow"]
self.left = sens["LeftArrow"]
self.right = sens["RightArrow"]
self.roll = sens["Z"]
self.jump = sens["X"]
#self.shoot = sens["C"]
#self.guard = sens["V"]
self.rotCamL = sens["A"]
self.rotCamR = sens["S"]
self.zoomOut = sens["D"]
self.zoomIn = sens["F"]
obs = Objects()
self.floor = obs.loc.sensors["touchFloor"]
 
 
class Actuators:
""" this not need? """
def __init__(self):
obs = Objects()
 
self.trackto = obs.roc.actuators["trackto"]
self.run = obs.arm.actuators["Run"]
self.stand = obs.arm.actuators["Stand"]
self.roll = obs.arm.actuators["Roll"]
 
data = Data()
 
class CutIn:
def __init__(self):
self.roll = 0
 
def init(self):
self.__init__()
 
class Input:
 
def __init__(self):
self.data = data
self.cutin = CutIn()
self.arrow = 1
self.toward = 0
self.roll = 0
self.jump = 0
 
def update(self):
self._setArrow()
self._setToward()
self.roll = self.data.sens.roll.positive
self.jump = self.data.sens.jump.positive
#cam
self.rotCamL = self.data.sens.rotCamL.positive
self.rotCamR = self.data.sens.rotCamR.positive
self.zoomOut = self.data.sens.zoomOut.positive
self.zoomIn = self.data.sens.zoomIn.positive
 
def _setToward(self):
if (self.data.sens.up.positive or
self.data.sens.down.positive or
self.data.sens.left.positive or
self.data.sens.right.positive ):
self.toward = 1
else:
self.toward = 0
 
def _setArrow(self):
is_input_up = self.data.sens.up.positive
is_input_down = self.data.sens.down.positive
is_input_left = self.data.sens.left.positive
is_input_right= self.data.sens.right.positive
 
arrow = 0
if is_input_up:
if is_input_right: arrow = 2
elif is_input_left: arrow = 8
else: arrow = 1
elif is_input_down:
if is_input_right: arrow = 4
elif is_input_left: arrow = 6
else: arrow = 5
elif is_input_right:
if is_input_up: arrow = 2
elif is_input_down: arrow = 4
else: arrow = 3
elif is_input_left:
if is_input_up: arrow = 8
elif is_input_down: arrow = 6
else: arrow = 7
self.arrow = arrow
 
 
class State:
def __init__(self):
self.data = data
self.face = 1
self.isFloor = 1
 
def update(self):
self.isFloor = self.data.sens.floor.positive
 
class Action:
 
act = None
frame = 0
init = 0 #bool
hold = 0 #bool
done = 0 #bool
method = None
 
 
def __init__(self):
self.data = data
self.state = State()
self.act = self.data.obs.arm.actuators["Stand"]
import Blender.Mathutils
self.mathutils = Blender.Mathutils
 
def update(self,cont,input):
self.cont = cont
self.input = input
self.state.update()
 
 
def _permit(self):
#print self.frame
 
if not self.hold:
return 1
 
self.frame += 1
 
if self.done:
self.done = 0
self.hold = 0
self.init = 0
self.frame = 0
print "done"
return 1
 
self.hold = 0
self.method()
self.hold = 1
return 0
 
def _motion(self,ac_name):
if ac_name != self.act.name:
self.cont.deactivate(self.act)
self.act = self.data.obs.arm.actuators[ac_name]
self.cont.activate(self.act)
 
 
def _move(self,move_size,face):
 
m = move_size
r = m/1.41
 
x,y = 0,0
if face == 1: x,y = 0, m
elif face == 2: x,y = r, r
elif face == 3: x,y = m, 0
elif face == 4: x,y = r,-r
elif face == 5: x,y = 0,-m
elif face == 6: x,y = -r,-r
elif face == 7: x,y = -m, 0
elif face == 8: x,y = -r, r
 
loc = self.data.obs.loc
loc.applyMovement((x,y,0), 1)
 
def _turn(self,face):
 
ob = self.data.obs.direc[face]
if ob:
trackto = self.data.acts.trackto
trackto.object = ob
self.cont.activate(trackto)
self.state.face = face
 
 
def stand(self):
if self._permit():
self._motion("Stand")
 
 
def run(self):
if self._permit():
face = self.input.arrow
self._move(0.0805,face)
self._turn(face)
self._motion("Run")
 
 
def roll(self,quick=0):
print self.act.name,self.act.frame,self.frame
if self._permit():
if not self.init:
self._motion("Roll")
self.init = 1
self.hold = 1
self.method = self.roll
if not quick:
self._motion("Roll")
else:
self._motion("RollQuick")
elif self.act.frame <= 5:
pass
elif self.act.frame <= 19:
self._move(0.161,self.state.face)
elif self.frame > 60:
if self.act.frame == 30:
self.done = 1
elif self.frame > 70:
self.done = 1
 
jumped = 0
landed = 0
landtime = 0
def jump(self):
if self._permit():
if not self.init:
self.init = 1
self.hold = 1
self.method = self.jump
self._motion("JumpUp")
print "start"
elif self.frame <= 5*2:
print self.frame,"tame",self.act.name,self.act.frame
if self.input.arrow == self.state.face:
self._move(0.02,self.state.face)
elif not self.jumped:
if self.state.isFloor:
p = self.data.obs.loc
p.applyForce((0,0,300),0)
self.jumped = 1
else:
self.done = 1
self.jumped = 0
print "cancel"
elif self.frame <= 15*2:
print self.frame,"up",self.act.name,self.act.frame
if self.input.arrow == self.state.face:
self._move(0.0805,self.state.face)
else:
if not self.state.isFloor:
print self.frame,"air",self.act.name,self.act.frame
self._motion("Jumping")
if self.input.toward:
face = self.input.arrow
self._move(0.0805,face)
self._turn(face)
 
elif self.landed == 0:
self._motion("JumpLand")
self.landtime = self.frame
self.landed = 1
elif self.frame-self.landtime < 13*2:
print self.frame,"handou",self.act.name,self.act.frame
if (self.input.roll and
self.input.arrow == self.state.face):
self.jumped = 0
self.landed = 0
self.landtime = 0
self.done = 1
self.input.cutin.roll = 1
 
elif self.input.arrow == self.state.face:
p = 1.0-(self.frame-self.landtime)/25.0
self._move(0.0805*p,self.state.face)
 
else:
self.jumped = 0
self.landed = 0
self.landtime = 0
self.done = 1
print "end"
 
 
 
#----------------#
# Camera Action #
#----------------#
 
rot_size = 0.03
zoom_size = 0.1
range = 0
range_max = 60
range_min = -40
#obs
cam = data.obs.camLoc
loc = data.obs.loc
roc = data.obs.roc
 
def _getRoc(self, matrix):
o = matrix
matrix = self.mathutils.Matrix(o[0],o[1],o[2])
euler = matrix.transpose().toEuler()
return (euler.x,euler.y,euler.z)
 
def _setFaceFromRoc(self):
x,y,z = self._getRoc(self.roc.localOrientation)
if -23 <= z and z <= 23: face = 1
elif 23 <= z and z <= 68: face = 8
elif 68 <= z and z <= 113: face = 7
elif 113 <= z and z <= 158: face = 6
elif 158 <= z or z <=-158: face = 5
elif -158<= z and z <=-133: face = 4
elif -133<= z and z <= -68: face = 3
elif -68 <= z and z <= -23: face = 2
self.state.face = face
print "%s => face=%s" % (z,face)
 
def viewRight(self):
tto = self.data.acts.trackto
self.cont.deactivate(tto)
self.loc.applyRotation((0,0, self.rot_size),1)
self.roc.applyRotation((0,0,-self.rot_size),1)
self._setFaceFromRoc()
 
 
def viewLeft(self):
tto = self.data.acts.trackto
self.cont.deactivate(tto)
self.loc.applyRotation((0,0,-self.rot_size),1)
self.roc.applyRotation((0,0, self.rot_size),1)
self._setFaceFromRoc()
 
def viewClose(self):
if self.range > self.range_min:
y = self.zoom_size
z = self.zoom_size*2/5
self.cam.applyMovement((0,y,-z),1)
self.range -= 1
 
def viewFar(self):
if self.range < self.range_max:
y = self.zoom_size
z = self.zoom_size*2/5
self.cam.applyMovement((0,-y,z),1)
self.range += 1
 
 
#cont.owner["data"] = Data()
cont.owner["input"] = Input()
cont.owner["action"] = Action()
 
print "player init done"
 


ループ処理
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
cont = GameLogic.getCurrentController()
own = cont.owner
 
input = own["input"]
action = own["action"]
 
#update
input.update()
action.update(cont,input)
 
#cutin player action
if input.cutin.roll: action.roll(1)
input.cutin.init()
 
#normal player action
if input.roll: action.roll()
elif input.jump: action.jump()
elif input.toward:action.run()
else: action.stand()
 
#camera action
if input.rotCamL: action.viewLeft()
elif input.rotCamR: action.viewRight()
elif input.zoomIn: action.viewClose()
elif input.zoomOut: action.viewFar()
 
関連記事

コメント

コメントの投稿

非公開コメント

このブログについて
□ ブログ内容
決まった趣旨はありません。
興味を持ったこと・日常で行ったことを何でも書きます。

3DCG・プログラミングなどが多めです。

□ 現在の活動
・ウェブサイト制作
 (http://tiblab.net)
・3Dゲーム制作
 (コックパニック)
検索フォーム
ユーザータグ

Blender キャプチャ blendファイル BGE Python GameEngine ムービー Android CG  Red5 Terragen C# C++ 

カテゴリー
プロフィール

TiBra

Author:TiBra
趣味でCG制作、プログラミング等を行っています。メイカーズに憧れています。

ネットを通じた交流を広げたく思っていますので、コメント・メールはお気軽にどぞー

戯言程度のことは、こちらのブログに投稿しています。基本戯言なので、実質移転しているようなものです。

Mail:tibraあっとlive.jp
HP:TibLabmemocode
動画:VimeoFC2動画ニコニコ
ファイル:SkyDrive
企画:3Dゲーム作業実況

Blogリンク
不都合がございましたらご連絡ください。
当ブログのリンクバナー
FC2 ID
FC2カウンター
RSSフィード+解析コード